cluster: RHEL55 - rgmanager: Don't block on fencing if a node rejoined
Lon Hohberger
lon at fedoraproject.org
Tue Oct 27 19:09:39 UTC 2009
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=1ca3956cf96030f5c599ae2d32ed113061df491e
Commit: 1ca3956cf96030f5c599ae2d32ed113061df491e
Parent: 63875d9ba9fe0e7af06f15f785a95b7a7720eba8
Author: Lon Hohberger <lhh at redhat.com>
AuthorDate: Tue Oct 27 15:06:02 2009 -0400
Committer: Lon Hohberger <lhh at redhat.com>
CommitterDate: Tue Oct 27 15:07:37 2009 -0400
rgmanager: Don't block on fencing if a node rejoined
Resolves: rhbz#527777
Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
rgmanager/src/daemons/rg_event.c | 41 ++++++++++++++++++++++++++++++-------
1 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/rgmanager/src/daemons/rg_event.c b/rgmanager/src/daemons/rg_event.c
index 9ac9de9..82c20c0 100644
--- a/rgmanager/src/daemons/rg_event.c
+++ b/rgmanager/src/daemons/rg_event.c
@@ -192,18 +192,40 @@ fence_domain_joined(void)
/**
Quick query to cman to see if a node has been fenced.
+
+ Return values:
+ 0 - not fenced
+ 1 - fenced
+ 2 - clean rejoin
*/
int
node_fenced(int nodeid)
{
cman_handle_t ch;
+ cman_node_t node;
int fenced = 0;
uint64_t fence_time;
ch = cman_init(NULL);
- if (cman_get_fenceinfo(ch, nodeid, &fence_time, &fenced, NULL) < 0)
+ if (cman_get_fenceinfo(ch, nodeid, &fence_time, &fenced, NULL) < 0) {
+ /* Failed to obtain fence information */
fenced = 0;
+ }
+
+ /* If the node was fenced, we're done */
+ if (fenced)
+ goto out;
+ /*
+ * if CMAN has admitted a node back in to the cluster,
+ * then we can stop waiting for fencing (#527777)
+ */
+ if (cman_get_node(ch, nodeid, &node) < 0)
+ goto out;
+
+ if (node.cn_member)
+ fenced = 2;
+out:
cman_finish(ch);
return fenced;
@@ -393,7 +415,7 @@ _event_thread_f(void __attribute__ ((unused)) *arg)
event_t *ev;
struct timeval now;
struct timespec expire;
- int notice = 0, count = 0;
+ int notice = 0, count = 0, fenced;
/* Event thread usually doesn't hang around. When it's
spawned, sleep for this many seconds in order to let
@@ -452,19 +474,19 @@ _event_thread_f(void __attribute__ ((unused)) *arg)
ev->ev.group.rg_state,
ev->ev.group.rg_owner);
} else if (ev->ev_type == EVENT_NODE) {
- /*
+ /*
clulog(LOG_NOTICE, "Node Event: %s %d %s %s\n",
ev->ev.node.ne_local?"Local":"Remote",
ev->ev.node.ne_nodeid,
ev->ev.node.ne_state?"UP":"DOWN",
- ev->ev.node.ne_clean?"Clean":"Dirty")
+ ev->ev.node.ne_clean?"Clean":"Dirty");
*/
if (ev->ev.node.ne_state == 0 &&
!ev->ev.node.ne_clean &&
node_has_fencing(ev->ev.node.ne_nodeid)) {
notice = 0;
- while (!node_fenced(ev->ev.node.ne_nodeid)) {
+ while ( (fenced = node_fenced(ev->ev.node.ne_nodeid)) == 0 ) {
if (!notice) {
notice = 1;
clulog(LOG_INFO, "Waiting for "
@@ -474,10 +496,13 @@ _event_thread_f(void __attribute__ ((unused)) *arg)
sleep(2);
}
- if (notice)
- clulog(LOG_INFO, "Node #%d fenced; "
+ if (notice) {
+ clulog(LOG_INFO, "Node #%d %s; "
"continuing\n",
- ev->ev.node.ne_nodeid);
+ ev->ev.node.ne_nodeid,
+ (fenced==2) ?
+ "rejoined" : "fenced");
+ }
}
node_event(ev->ev.node.ne_local,
More information about the cluster-commits
mailing list