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