Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: cd549713be75a7539e5c5ba3584b5b2796bfb652
Parent: cef3fc9b1c8096a18d61166abb9e5e0eb2fdc1d7
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Thu May 17 12:00:53 2012 -0500
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Thu May 17 15:16:04 2012 -0500
dlm_tool status: format
format the output to be more readable
Signed-off-by: David Teigland <teigland(a)redhat.com>
---
dlm_controld/daemon_cpg.c | 10 +-
dlm_controld/lib.c | 221 ++++++++++++++++++++++++++++++++++++++++-
dlm_controld/libdlmcontrol.h | 2 +
dlm_tool/main.c | 2 +-
4 files changed, 224 insertions(+), 11 deletions(-)
diff --git a/dlm_controld/daemon_cpg.c b/dlm_controld/daemon_cpg.c
index 3ee5f7b..fee0ef6 100644
--- a/dlm_controld/daemon_cpg.c
+++ b/dlm_controld/daemon_cpg.c
@@ -2053,7 +2053,7 @@ 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 "
+ "left_reason=%s "
"need_fencing=%d "
"delay_fencing=%d "
"fence_pid=%d "
@@ -2069,7 +2069,7 @@ static int print_state_daemon_node(struct node_daemon *node, char
*str)
"fence_monotime=%llu ",
node->daemon_member,
node->killed,
- node->left_reason,
+ reason_str(node->left_reason),
node->need_fencing,
node->delay_fencing,
node->fence_pid,
@@ -2121,7 +2121,8 @@ static int print_state_daemon(char *str)
"quorate=%d "
"fence_pid=%d "
"fence_in_progress_unknown=%d "
- "zombie_count=%d ",
+ "zombie_count=%d "
+ "monotime=%llu ",
daemon_member_count,
daemon_joined_count,
daemon_remove_count,
@@ -2130,7 +2131,8 @@ static int print_state_daemon(char *str)
cluster_quorate,
daemon_fence_pid,
fence_in_progress_unknown,
- zombie_count);
+ zombie_count,
+ (unsigned long long)monotime());
return strlen(str) + 1;
}
diff --git a/dlm_controld/lib.c b/dlm_controld/lib.c
index d1d3a23..1b78407 100644
--- a/dlm_controld/lib.c
+++ b/dlm_controld/lib.c
@@ -11,6 +11,7 @@
#include <unistd.h>
#include <stdint.h>
#include <errno.h>
+#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -157,6 +158,14 @@ int dlmc_dump_plocks(char *name, char *buf)
return do_dump(DLMC_CMD_DUMP_PLOCKS, name, buf);
}
+static int nodeid_compare(const void *va, const void *vb)
+{
+ const int *a = va;
+ const int *b = vb;
+
+ return *a - *b;
+}
+
static void print_str(char *str, int len)
{
char *p;
@@ -175,18 +184,143 @@ static void print_str(char *str, int len)
printf(" %s\n", p);
}
+static unsigned int kv(char *str, const char *k)
+{
+ char valstr[64];
+ char *p;
+ int i;
+
+ p = strstr(str, k);
+ if (!p)
+ return 0;
+
+ p = strstr(p, "=") + 1;
+ if (!p)
+ return 0;
+
+ memset(valstr, 0, 64);
+
+ for (i = 0; i < 64; i++) {
+ if (*p == ' ')
+ break;
+ if (*p == '\0')
+ break;
+ if (*p == '\n')
+ break;
+ valstr[i] = *p;
+ p++;
+ }
+
+ return (unsigned int)strtoul(valstr, NULL, 0);
+}
+
+static char *ks(char *str, const char *k)
+{
+ static char valstr[64];
+ char *p;
+ int i;
+
+ p = strstr(str, k);
+ if (!p)
+ return 0;
+
+ p = strstr(p, "=") + 1;
+ if (!p)
+ return 0;
+
+ memset(valstr, 0, 64);
+
+ for (i = 0; i < 64; i++) {
+ if (*p == ' ')
+ break;
+ if (*p == '\0')
+ break;
+ if (*p == '\n')
+ break;
+ valstr[i] = *p;
+ p++;
+ }
+
+ return valstr;
+}
+
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);
+ unsigned int cluster_ringid, daemon_ringid;
+ unsigned int fipu;
+
+ if (flags & DLMC_STATUS_VERBOSE) {
+ printf("our_nodeid %d\n", st->nodeid);
+ print_str(str, st->str_len);
+ return;
+ }
+
+ cluster_ringid = kv(str, "cluster_ringid");
+ daemon_ringid = kv(str, "daemon_ringid");
+
+ printf("cluster nodeid %d quorate %u ring seq %u %u\n",
+ st->nodeid,
+ kv(str, "quorate"),
+ cluster_ringid, daemon_ringid);
+
+ fipu = kv(str, "fence_in_progress_unknown");
+
+ printf("daemon now %u fence_pid %u %s\n",
+ kv(str, "monotime"),
+ kv(str, "fence_pid"),
+ fipu ? "fence_init" : "");
}
-static void print_daemon_node(struct dlmc_state *st, char *str, char *bin, uint32_t
flags)
+static void format_daemon_node(struct dlmc_state *st, char *str, char *bin, uint32_t
flags,
+ char *node_line, char *fence_line)
{
- printf("nodeid %d\n", st->nodeid);
- print_str(str, st->str_len);
+ unsigned int delay_fencing, result_wait, killed;
+
+ snprintf(node_line, DLMC_STATE_MAXSTR - 1,
+ "node %d %c add %u rem %u fail %u fence %u at %u %u\n",
+ st->nodeid,
+ kv(str, "member") ? 'M' : 'X',
+ kv(str, "add_time"),
+ kv(str, "rem_time"),
+ kv(str, "fail_monotime"),
+ kv(str, "fence_monotime"),
+ kv(str, "actor_done"),
+ kv(str, "fence_walltime"));
+
+ if (!kv(str, "need_fencing"))
+ return;
+
+ delay_fencing = kv(str, "delay_fencing");
+ result_wait = kv(str, "fence_result_wait");
+ killed = kv(str, "killed");
+
+ if (delay_fencing)
+ snprintf(fence_line, DLMC_STATE_MAXSTR - 1,
+ "fence %d %s delay actor %u fail %u fence %u now %u%s%s\n",
+ st->nodeid,
+ ks(str, "left_reason"),
+ kv(str, "actor_last"),
+ kv(str, "fail_walltime"),
+ kv(str, "fence_walltime"),
+ (unsigned int)time(NULL),
+ result_wait ? " result_wait" : "",
+ killed ? " killed" : "");
+ else
+ snprintf(fence_line, DLMC_STATE_MAXSTR - 1,
+ "fence %d %s pid %d actor %u fail %u fence %u now %u%s%s\n",
+ st->nodeid,
+ ks(str, "left_reason"),
+ kv(str, "fence_pid"),
+ kv(str, "actor_last"),
+ kv(str, "fail_walltime"),
+ kv(str, "fence_walltime"),
+ (unsigned int)time(NULL),
+ result_wait ? " result_wait" : "",
+ killed ? " killed" : "");
}
+#define MAX_SORT 64
+
int dlmc_print_status(uint32_t flags)
{
struct dlmc_header h;
@@ -195,7 +329,12 @@ int dlmc_print_status(uint32_t flags)
char maxstr[DLMC_STATE_MAXSTR];
char maxbin[DLMC_STATE_MAXBIN];
char *str, *bin;
+ int all_count, node_count, fence_count;
+ int all_ids[MAX_SORT], node_ids[MAX_SORT], fence_ids[MAX_SORT];
+ char *node_lines[MAX_SORT], *fence_lines[MAX_SORT];
+ char *node_line, *fence_line;
int fd, rv, off;
+ int i, j;
init_header(&h, DLMC_CMD_DUMP_STATUS, NULL, 0);
@@ -217,6 +356,15 @@ int dlmc_print_status(uint32_t flags)
bin = maxbin;
off = 0;
+ all_count = 0;
+ node_count = 0;
+ fence_count = 0;
+ memset(&all_ids, 0, sizeof(all_ids));
+ memset(&node_ids, 0, sizeof(node_ids));
+ memset(&fence_ids, 0, sizeof(fence_ids));
+ memset(node_lines, 0, sizeof(node_lines));
+ memset(fence_lines, 0, sizeof(fence_lines));
+
while (1) {
memset(&state, 0, sizeof(state));
memset(maxstr, 0, sizeof(maxstr));
@@ -244,9 +392,43 @@ int dlmc_print_status(uint32_t flags)
case DLMC_STATE_DAEMON:
print_daemon(st, str, bin, flags);
break;
+
case DLMC_STATE_DAEMON_NODE:
- print_daemon_node(st, str, bin, flags);
+
+ if (flags & DLMC_STATUS_VERBOSE) {
+ printf("nodeid %d\n", st->nodeid);
+ print_str(str, st->str_len);
+ } else {
+ node_line = malloc(DLMC_STATE_MAXSTR);
+ if (!node_line)
+ break;
+ fence_line = malloc(DLMC_STATE_MAXSTR);
+ if (!fence_line) {
+ free(node_line);
+ break;
+ }
+ memset(node_line, 0, DLMC_STATE_MAXSTR);
+ memset(fence_line, 0, DLMC_STATE_MAXSTR);
+
+ format_daemon_node(st, str, bin, flags,
+ node_line, fence_line);
+
+ all_ids[all_count++] = st->nodeid;
+
+ node_ids[node_count] = st->nodeid;
+ node_lines[node_count++] = node_line;
+ node_count++;
+
+ if (!fence_line[0]) {
+ free(fence_line);
+ } else {
+ fence_ids[fence_count] = st->nodeid;
+ fence_lines[fence_count] = fence_line;
+ fence_count++;
+ }
+ }
break;
+
default:
break;
}
@@ -255,6 +437,33 @@ int dlmc_print_status(uint32_t flags)
break;
}
+ if (all_count)
+ qsort(all_ids, all_count, sizeof(int), nodeid_compare);
+
+ if (all_count && fence_count) {
+ for (i = 0; i < all_count; i++) {
+ for (j = 0; j < fence_count; j++) {
+ if (all_ids[i] != fence_ids[j])
+ continue;
+ printf("%s", fence_lines[j]);
+ free(fence_lines[j]);
+ break;
+ }
+ }
+ }
+
+ if (all_count && node_count) {
+ for (i = 0; i < all_count; i++) {
+ for (j = 0; j < node_count; j++) {
+ if (all_ids[i] != node_ids[j])
+ continue;
+ printf("%s", node_lines[j]);
+ free(node_lines[j]);
+ break;
+ }
+ }
+ }
+
out_close:
close(fd);
out:
diff --git a/dlm_controld/libdlmcontrol.h b/dlm_controld/libdlmcontrol.h
index 068fe4e..8b504f7 100644
--- a/dlm_controld/libdlmcontrol.h
+++ b/dlm_controld/libdlmcontrol.h
@@ -78,6 +78,8 @@ struct dlmc_lockspace {
#define DLMC_NODES_MEMBERS 2
#define DLMC_NODES_NEXT 3
+#define DLMC_STATUS_VERBOSE 0x00000001
+
int dlmc_dump_debug(char *buf);
int dlmc_dump_config(char *buf);
int dlmc_dump_log_plock(char *buf);
diff --git a/dlm_tool/main.c b/dlm_tool/main.c
index bcaf8e4..608ee49 100644
--- a/dlm_tool/main.c
+++ b/dlm_tool/main.c
@@ -1424,7 +1424,7 @@ int main(int argc, char **argv)
break;
case OP_STATUS:
- dlmc_print_status(0);
+ dlmc_print_status(verbose ? DLMC_STATUS_VERBOSE : 0);
break;
case OP_DUMP: