dlm: master - dlm_controld/dlm_tool: improve lockspace status

David Teigland teigland at fedoraproject.org
Tue Mar 27 21:46:22 UTC 2012


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=7579b0ae42a63f2fc2bea8d07b3da823b311cd78
Commit:        7579b0ae42a63f2fc2bea8d07b3da823b311cd78
Parent:        470688a483678f01341f45815d7376b9002d2ebb
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Mon Mar 26 15:02:05 2012 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Mon Mar 26 15:02:05 2012 -0500

dlm_controld/dlm_tool: improve lockspace status

better info about conditions or messages being
waited for

Signed-off-by: David Teigland <teigland at redhat.com>
---
 dlm_controld/cpg.c           |   29 ++++++++++++++++----------
 dlm_controld/dlm_daemon.h    |    1 +
 dlm_controld/libdlmcontrol.h |   17 ++++++++++-----
 dlm_tool/main.c              |   45 +++++++++++++++++++++--------------------
 4 files changed, 53 insertions(+), 39 deletions(-)

diff --git a/dlm_controld/cpg.c b/dlm_controld/cpg.c
index 1fb5372..b2f6e3b 100644
--- a/dlm_controld/cpg.c
+++ b/dlm_controld/cpg.c
@@ -578,24 +578,31 @@ static void stop_kernel(struct lockspace *ls, uint32_t seq)
 
 static int wait_conditions_done(struct lockspace *ls)
 {
-	if (!check_ringid_done(ls))
+	if (!check_ringid_done(ls)) {
+		ls->wait_debug = DLMC_LS_WAIT_RINGID;
 		return 0;
+	}
 
 	if ((cfgd_enable_quorum_lockspace > 1) && !cluster_quorate) {
 		log_group(ls, "wait for quorum");
+		ls->wait_debug = DLMC_LS_WAIT_QUORUM;
 		return 0;
 	}
 
 	if (!check_fencing_done(ls)) {
+		ls->wait_debug = DLMC_LS_WAIT_FENCING;
 		poll_lockspaces++;
 		return 0;
 	}
 
 	if (!check_fs_done(ls)) {
+		ls->wait_debug = DLMC_LS_WAIT_FSDONE;
 		poll_fs++;
 		return 0;
 	}
 
+	ls->wait_debug = 0;
+
 	return 1;
 }
 
@@ -614,10 +621,14 @@ static int wait_messages_done(struct lockspace *ls)
 	if (need) {
 		log_group(ls, "wait_messages cg %u need %d of %d",
 			  cg->seq, need, total);
+		ls->wait_debug = need;
 		return 0;
 	}
 
 	log_group(ls, "wait_messages cg %u got all %d", cg->seq, total);
+
+	ls->wait_debug = 0;
+
 	return 1;
 }
 
@@ -1746,14 +1757,7 @@ int set_lockspace_info(struct lockspace *ls, struct dlmc_lockspace *lockspace)
 	lockspace->cg_next.failed_count = cg->failed_count;
 	lockspace->cg_next.combined_seq = last->seq;
 	lockspace->cg_next.seq = cg->seq;
-
-	if (cg->state == CGST_WAIT_CONDITIONS)
-		lockspace->cg_next.wait_condition = 5;
-	else if (poll_fencing)
-		lockspace->cg_next.wait_condition = 2;
-	else if (poll_fs)
-		lockspace->cg_next.wait_condition = 4;
-
+	lockspace->cg_next.wait_condition = ls->wait_debug;
 	if (cg->state == CGST_WAIT_MESSAGES)
 		lockspace->cg_next.wait_messages = 1;
  out:
@@ -1786,13 +1790,16 @@ static int _set_node_info(struct lockspace *ls, struct change *cg, int nodeid,
 		goto out;
 
 	if (n->need_fencing)
-		node->flags |= DLMC_NF_CHECK_FENCING;
+		node->flags |= DLMC_NF_NEED_FENCING;
 	if (n->check_fs)
 		node->flags |= DLMC_NF_CHECK_FS;
 
 	node->added_seq = n->lockspace_add_seq;
 	node->removed_seq = n->lockspace_rem_seq;
-	node->failed_reason = n->lockspace_fail_reason;
+
+	node->fail_reason = n->lockspace_fail_reason;
+	node->fail_walltime = n->fail_walltime;
+	node->fail_monotime = n->fail_monotime;
  out:
 	return 0;
 }
diff --git a/dlm_controld/dlm_daemon.h b/dlm_controld/dlm_daemon.h
index 5e83db3..000ba22 100644
--- a/dlm_controld/dlm_daemon.h
+++ b/dlm_controld/dlm_daemon.h
@@ -247,6 +247,7 @@ struct lockspace {
 	int			leaving;
 	int			kernel_stopped;
 	int			fs_registered;
+	int			wait_debug; /* for status/debugging */
 	uint32_t		change_seq;
 	uint32_t		started_count;
 	struct change		*started_change;
diff --git a/dlm_controld/libdlmcontrol.h b/dlm_controld/libdlmcontrol.h
index 4034372..970f705 100644
--- a/dlm_controld/libdlmcontrol.h
+++ b/dlm_controld/libdlmcontrol.h
@@ -14,24 +14,30 @@
 #define DLMC_NF_MEMBER		0x00000001 /* node is member in cg */
 #define DLMC_NF_START		0x00000002 /* start message recvd for cg */
 #define DLMC_NF_DISALLOWED	0x00000004 /* node disallowed in cg */
-#define DLMC_NF_CHECK_FENCING	0x00000008
-#define DLMC_NF_CHECK_QUORUM	0x00000010
-#define DLMC_NF_CHECK_FS	0x00000020
+#define DLMC_NF_NEED_FENCING	0x00000008
+#define DLMC_NF_CHECK_FS	0x00000010
 
 struct dlmc_node {
 	int nodeid;
 	uint32_t flags;
 	uint32_t added_seq;
 	uint32_t removed_seq;
-	int failed_reason;
+	int fail_reason;
+	uint64_t fail_walltime;
+	uint64_t fail_monotime;
 };
 
+#define DLMC_LS_WAIT_RINGID	1
+#define DLMC_LS_WAIT_QUORUM	2
+#define DLMC_LS_WAIT_FENCING	3
+#define DLMC_LS_WAIT_FSDONE	4
+
 struct dlmc_change {
 	int member_count;
 	int joined_count;
 	int remove_count;
 	int failed_count;
-	int wait_condition;	/* 0 no, 1 fencing, 2 quorum, 3 fs */
+	int wait_condition;	/* DLMC_LS_WAIT or needed message count */
 	int wait_messages;	/* 0 no, 1 yes */
 	uint32_t seq;
 	uint32_t combined_seq;
@@ -45,7 +51,6 @@ struct dlmc_change {
 #define DLMC_LF_SAVE_PLOCKS	0x00000020
 
 struct dlmc_lockspace {
-	int group_mode;
 	struct dlmc_change cg_prev;	/* completed change (started_change) */
 	struct dlmc_change cg_next;	/* in-progress change (changes list) */
 	uint32_t flags;
diff --git a/dlm_tool/main.c b/dlm_tool/main.c
index c378f2b..7dddac9 100644
--- a/dlm_tool/main.c
+++ b/dlm_tool/main.c
@@ -1060,15 +1060,18 @@ static char *dlmc_lf_str(uint32_t flags)
 	return str;
 }
 
-static const char *nf_check_str(uint32_t flags)
+static const char *check_str(struct dlmc_node *n)
 {
-	if (flags & DLMC_NF_CHECK_FENCING)
-		return "fence";
+	static char _check_str[32];
 
-	if (flags & DLMC_NF_CHECK_QUORUM)
-		return "quorum";
+	if (n->flags & DLMC_NF_NEED_FENCING) {
+		memset(_check_str, 0, sizeof(_check_str));
+		snprintf(_check_str, sizeof(_check_str) - 1, "fence %llu",
+			(unsigned long long)n->fail_monotime);
+		return _check_str;
+	}
 
-	if (flags & DLMC_NF_CHECK_FS)
+	if (n->flags & DLMC_NF_CHECK_FS)
 		return "fs";
 
 	return "none";
@@ -1077,16 +1080,14 @@ static const char *nf_check_str(uint32_t flags)
 static const char *condition_str(int cond)
 {
 	switch (cond) {
-	case 0:
-		return "";
-	case 1:
-		return "fencing";
-	case 2:
+	case DLMC_LS_WAIT_RINGID:
+		return "ringid";
+	case DLMC_LS_WAIT_QUORUM:
 		return "quorum";
-	case 3:
-		return "fs";
-	case 4:
-		return "pending";
+	case DLMC_LS_WAIT_FENCING:
+		return "fencing";
+	case DLMC_LS_WAIT_FSDONE:
+		return "fsdone";
 	default:
 		return "unknown";
 	}
@@ -1118,8 +1119,7 @@ static void show_ls(struct dlmc_lockspace *ls)
 
 	printf("name          %s\n", ls->name);
 	printf("id            0x%08x\n", ls->global_id);
-	printf("flags         0x%08x %s\n",
-		ls->flags, dlmc_lf_str(ls->flags));
+	printf("flags         0x%08x %s\n", ls->flags, dlmc_lf_str(ls->flags));
 	printf("change        member %d joined %d remove %d failed %d seq %d,%d\n",
 		ls->cg_prev.member_count, ls->cg_prev.joined_count,
 		ls->cg_prev.remove_count, ls->cg_prev.failed_count,
@@ -1147,9 +1147,10 @@ static void show_ls(struct dlmc_lockspace *ls)
 		ls->cg_next.remove_count, ls->cg_next.failed_count,
 	        ls->cg_next.combined_seq, ls->cg_next.seq);
 
-	printf("new status    wait_messages %d wait_condition %d %s\n",
-		ls->cg_next.wait_messages, ls->cg_next.wait_condition,
-		condition_str(ls->cg_next.wait_condition));
+	if (ls->cg_next.wait_messages)
+		printf("new status    wait messages %d\n", ls->cg_next.wait_condition);
+	else
+		printf("new status    wait %s\n", condition_str(ls->cg_next.wait_condition));
 
 	node_count = 0;
 	memset(&nodes, 0, sizeof(nodes));
@@ -1183,11 +1184,11 @@ static void show_all_nodes(int count, struct dlmc_node *nodes_in)
 		printf("nodeid %d member %d failed %d start %d seq_add %u seq_rem %u check %s\n",
 			n->nodeid,
 			member_int(n),
-			n->failed_reason,
+			n->fail_reason,
 			(n->flags & DLMC_NF_START) ? 1 : 0,
 			n->added_seq,
 			n->removed_seq,
-			nf_check_str(n->flags));
+			check_str(n));
 		n++;
 	}
 }


More information about the cluster-commits mailing list