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