Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=d8d... Commit: d8d82c5f026b306dad35c50a1b038105c19c3324 Parent: a2a97c61ed6bb1b0aa82954f1f29c6e317de50ad Author: David Teigland teigland@redhat.com AuthorDate: Fri Mar 30 13:54:12 2012 -0500 Committer: David Teigland teigland@redhat.com CommitterDate: Fri Mar 30 13:54:12 2012 -0500
dlm_controld/dlm_tool: dump daemon status
dlm_tool status to print current daemon node state.
Signed-off-by: David Teigland teigland@redhat.com --- dlm_controld/daemon_cpg.c | 130 ++++++++++++++++++++++++++++++++++++++---- dlm_controld/dlm_controld.h | 17 ++++++ dlm_controld/dlm_daemon.h | 2 + dlm_controld/lib.c | 104 +++++++++++++++++++++++++++++++++ dlm_controld/libdlmcontrol.h | 1 + dlm_controld/main.c | 4 + dlm_tool/main.c | 11 ++++ 7 files changed, 257 insertions(+), 12 deletions(-)
diff --git a/dlm_controld/daemon_cpg.c b/dlm_controld/daemon_cpg.c index 3b7e140..dc9e780 100644 --- a/dlm_controld/daemon_cpg.c +++ b/dlm_controld/daemon_cpg.c @@ -54,27 +54,25 @@ struct fence_result { struct node_daemon { struct list_head list; int nodeid; - - uint64_t daemon_add_time; - uint64_t daemon_rem_time; - int daemon_member; - int killed; - - struct protocol proto; - - struct fence_config fence_config; - - int fence_in_progress_unknown; + int daemon_member; int left_reason; int recover_setup; + int fence_in_progress_unknown; int need_fence_clear; int need_fencing; int delay_fencing; int fence_pid; int fence_pid_wait; - int fence_actor_done; + int fence_actor_done; /* for status/debug */ + int fence_actor_last; /* for status/debug */ int fence_actors[MAX_NODES]; + + struct protocol proto; + struct fence_config fence_config; + + uint64_t daemon_add_time; + uint64_t daemon_rem_time; uint64_t fail_walltime; uint64_t fail_monotime; uint64_t fence_walltime; @@ -553,6 +551,8 @@ static int get_fence_actor(struct node_daemon *node) goto retry; }
+ node->fence_actor_last = low; + return low; }
@@ -793,6 +793,7 @@ static void daemon_fence_work(void) node->delay_fencing = 0; node->fence_monotime = 0; node->fence_walltime = 0; + node->fence_actor_last = 0; node->fence_actor_done = 0; node->fence_pid_wait = 0; node->fence_pid = 0; @@ -1865,6 +1866,7 @@ static void confchg_cb_daemon(cpg_handle_t handle, node->delay_fencing = 0; node->fence_monotime = 0; node->fence_walltime = 0; + node->fence_actor_last = 0; node->fence_actor_done = 0; node->fence_pid_wait = 0; node->fence_pid = 0; @@ -2011,3 +2013,107 @@ void init_daemon(void) INIT_LIST_HEAD(&startup_nodes);
} + +static int print_state_daemon_node(struct node_daemon *node, char *str) +{ + snprintf(str, DLMC_STATE_MAXSTR-1, + "member=%d " + "killed=%d " + "left_reason=%d " + "need_fencing=%d " + "delay_fencing=%d " + "fence_pid=%d " + "fence_actor_last=%d " + "fence_actor_done=%d " + "add_time=%llu " + "rem_time=%llu " + "fail_walltime=%llu " + "fail_monotime=%llu " + "fence_walltime=%llu " + "fence_monotime=%llu ", + node->daemon_member, + node->killed, + node->left_reason, + node->need_fencing, + node->delay_fencing, + node->fence_pid, + node->fence_actor_last, + node->fence_actor_done, + (unsigned long long)node->daemon_add_time, + (unsigned long long)node->daemon_rem_time, + (unsigned long long)node->fail_walltime, + (unsigned long long)node->fail_monotime, + (unsigned long long)node->fence_walltime, + (unsigned long long)node->fence_monotime); + + return strlen(str) + 1; +} + +void send_state_daemon_nodes(int fd) +{ + struct node_daemon *node; + struct dlmc_state st; + char str[DLMC_STATE_MAXSTR]; + int str_len; + + list_for_each_entry(node, &daemon_nodes, list) { + memset(&st, 0, sizeof(st)); + st.type = DLMC_STATE_DAEMON_NODE; + st.nodeid = node->nodeid; + + memset(str, 0, sizeof(str)); + str_len = print_state_daemon_node(node, str); + + st.str_len = str_len; + + send(fd, &st, sizeof(st), MSG_NOSIGNAL); + if (str_len) + send(fd, str, str_len, MSG_NOSIGNAL); + } +} + +static int print_state_daemon(char *str) +{ + snprintf(str, DLMC_STATE_MAXSTR-1, + "member_count=%d " + "joined_count=%d " + "remove_count=%d " + "daemon_ringid=%llu " + "cluster_ringid=%llu " + "quorate=%d " + "fence_pid=%d " + "fence_in_progress_unknown=%d " + "zombie_count=%d ", + daemon_member_count, + daemon_joined_count, + daemon_remove_count, + (unsigned long long)daemon_ringid.seq, + (unsigned long long)cluster_ringid_seq, + cluster_quorate, + daemon_fence_pid, + fence_in_progress_unknown, + zombie_count); + + return strlen(str) + 1; +} + +void send_state_daemon(int fd) +{ + struct dlmc_state st; + char str[DLMC_STATE_MAXSTR]; + int str_len; + + memset(&st, 0, sizeof(st)); + st.type = DLMC_STATE_DAEMON; + st.nodeid = our_nodeid; + + memset(str, 0, sizeof(str)); + str_len = print_state_daemon(str); + + st.str_len = str_len; + + send(fd, &st, sizeof(st), MSG_NOSIGNAL); + if (str_len) + send(fd, str, str_len, MSG_NOSIGNAL); +} + diff --git a/dlm_controld/dlm_controld.h b/dlm_controld/dlm_controld.h index 96b425c..84662eb 100644 --- a/dlm_controld/dlm_controld.h +++ b/dlm_controld/dlm_controld.h @@ -30,6 +30,7 @@ #define DLMC_CMD_DEADLOCK_CHECK 10 #define DLMC_CMD_DUMP_LOG_PLOCK 11 #define DLMC_CMD_FENCE_ACK 12 +#define DLMC_CMD_DUMP_STATUS 13
struct dlmc_header { unsigned int magic; @@ -43,5 +44,21 @@ struct dlmc_header { char name[DLM_LOCKSPACE_LEN]; /* no terminating null space */ };
+#define DLMC_STATE_MAXSTR 4096 +#define DLMC_STATE_MAXBIN 4096 + +#define DLMC_STATE_DAEMON 1 +#define DLMC_STATE_DAEMON_NODE 2 + +struct dlmc_state { + uint32_t type; /* DLMC_STATE_ */ + uint32_t flags; + int32_t nodeid; + uint32_t data32; + uint32_t data64; + uint32_t str_len; + uint32_t bin_len; +}; + #endif
diff --git a/dlm_controld/dlm_daemon.h b/dlm_controld/dlm_daemon.h index 66e008e..6adb16b 100644 --- a/dlm_controld/dlm_daemon.h +++ b/dlm_controld/dlm_daemon.h @@ -339,6 +339,8 @@ void close_cpg_daemon(void); void process_cpg_daemon(int ci); void set_protocol_stateful(void); int set_protocol(void); +void send_state_daemon_nodes(int fd); +void send_state_daemon(int fd);
void log_config(const struct cpg_name *group_name, const struct cpg_address *member_list, diff --git a/dlm_controld/lib.c b/dlm_controld/lib.c index 228f037..a7cd443 100644 --- a/dlm_controld/lib.c +++ b/dlm_controld/lib.c @@ -152,6 +152,110 @@ int dlmc_dump_plocks(char *name, char *buf) return do_dump(DLMC_CMD_DUMP_PLOCKS, name, buf); }
+static void print_str(char *str, int len) +{ + char *p; + int i; + + p = &str[0]; + for (i = 0; i < len-1; i++) { + if (str[i] == ' ') { + str[i] = '\0'; + printf(" %s\n", p); + p = &str[i+1]; + } + } + + if (p) + printf(" %s\n", p); +} + +static void print_daemon(struct dlmc_state *st, char *str, char *bin, uint32_t flags) +{ + printf("our_nodeid %d\n", st->nodeid); + print_str(str, st->str_len); +} + +static void print_daemon_node(struct dlmc_state *st, char *str, char *bin, uint32_t flags) +{ + printf("nodeid %d\n", st->nodeid); + print_str(str, st->str_len); +} + +int dlmc_print_status(uint32_t flags) +{ + struct dlmc_header h; + struct dlmc_state state; + struct dlmc_state *st; + char maxstr[DLMC_STATE_MAXSTR]; + char maxbin[DLMC_STATE_MAXBIN]; + char *str, *bin; + int fd, rv, off; + + init_header(&h, DLMC_CMD_DUMP_STATUS, NULL, 0); + + fd = do_connect(DLMC_QUERY_SOCK_PATH); + if (fd < 0) { + printf("cannot connect to dlm_controld\n"); + rv = fd; + goto out; + } + + rv = do_write(fd, &h, sizeof(h)); + if (rv < 0) { + printf("cannot send to dlm_controld\n"); + goto out_close; + } + + st = &state; + str = maxstr; + bin = maxbin; + off = 0; + + while (1) { + memset(&state, 0, sizeof(state)); + memset(maxstr, 0, sizeof(maxstr)); + memset(maxbin, 0, sizeof(maxbin)); + + rv = recv(fd, st, sizeof(struct dlmc_state), MSG_WAITALL); + if (!rv) + break; + if (rv != sizeof(struct dlmc_state)) + break; + + if (st->str_len) { + rv = recv(fd, str, st->str_len, MSG_WAITALL); + if (rv != st->str_len) + break; + } + + if (st->bin_len) { + rv = recv(fd, bin, st->bin_len, MSG_WAITALL); + if (rv != st->bin_len) + break; + } + + switch (st->type) { + case DLMC_STATE_DAEMON: + print_daemon(st, str, bin, flags); + break; + case DLMC_STATE_DAEMON_NODE: + print_daemon_node(st, str, bin, flags); + break; + default: + break; + } + + if (rv < 0) + break; + } + + out_close: + close(fd); + out: + return rv; +} + int dlmc_node_info(char *name, int nodeid, struct dlmc_node *node) { struct dlmc_header h, *rh; diff --git a/dlm_controld/libdlmcontrol.h b/dlm_controld/libdlmcontrol.h index 970f705..2af30de 100644 --- a/dlm_controld/libdlmcontrol.h +++ b/dlm_controld/libdlmcontrol.h @@ -86,6 +86,7 @@ int dlmc_node_info(char *lsname, int nodeid, struct dlmc_node *node); int dlmc_lockspaces(int max, int *count, struct dlmc_lockspace *lss); int dlmc_lockspace_nodes(char *lsname, int type, int max, int *count, struct dlmc_node *nodes); +int dlmc_print_status(uint32_t flags);
#define DLMC_RESULT_REGISTER 1 #define DLMC_RESULT_NOTIFIED 2 diff --git a/dlm_controld/main.c b/dlm_controld/main.c index 8e63bb3..794a5c8 100644 --- a/dlm_controld/main.c +++ b/dlm_controld/main.c @@ -823,6 +823,10 @@ static void *process_queries(void *arg) case DLMC_CMD_LOCKSPACE_NODES: query_lockspace_nodes(f, h.name, h.option, h.data); break; + case DLMC_CMD_DUMP_STATUS: + send_state_daemon(f); + send_state_daemon_nodes(f); + break; default: break; } diff --git a/dlm_tool/main.c b/dlm_tool/main.c index 7dddac9..5df5c59 100644 --- a/dlm_tool/main.c +++ b/dlm_tool/main.c @@ -39,6 +39,7 @@ #define OP_LOCKDEBUG 9 #define OP_LOG_PLOCK 10 #define OP_FENCE_ACK 11 +#define OP_STATUS 12
static char *prog_name; static char *lsname; @@ -317,6 +318,12 @@ static void decode_arguments(int argc, char **argv) opt_ind = optind + 1; need_lsname = 0; break; + } else if (!strncmp(argv[optind], "status", 6) && + (strlen(argv[optind]) == 6)) { + operation = OP_STATUS; + opt_ind = optind + 1; + need_lsname = 0; + break; } else if (!strncmp(argv[optind], "deadlock_check", 14) && (strlen(argv[optind]) == 14)) { operation = OP_DEADLOCK_CHECK; @@ -1322,6 +1329,10 @@ int main(int argc, char **argv) do_list(lsname); break;
+ case OP_STATUS: + dlmc_print_status(0); + break; + case OP_DUMP: do_dump(); break;
cluster-commits@lists.fedorahosted.org