From 1ca3956cf96030f5c599ae2d32ed113061df491e Mon Sep 17 00:00:00 2001 From: Lon Hohberger <lhh@redhat.com> Date: Tue, 27 Oct 2009 15:06:02 -0400 Subject: [PATCH] rgmanager: Don't block on fencing if a node rejoined Resolves: rhbz#527777 Signed-off-by: Lon Hohberger <lhh@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, -- 1.6.2.5