[Cluster-devel] [patch] Fix independent subtree status checking

Lon Hohberger lhh at redhat.com
Wed Aug 29 21:39:07 UTC 2007


Independent subtree recovery in rgmanager is not correct without
this patch.

-- 
Lon Hohberger - Software Engineer - Red Hat, Inc.
-------------- next part --------------
Index: restree.c
===================================================================
RCS file: /cvs/cluster/cluster/rgmanager/src/daemons/restree.c,v
retrieving revision 1.23.2.10
diff -u -r1.23.2.10 restree.c
--- restree.c	2 Aug 2007 14:46:51 -0000	1.23.2.10
+++ restree.c	29 Aug 2007 21:37:58 -0000
@@ -954,20 +954,17 @@
 		return _res_op(&node->rn_child, first, NULL, ret, op);
 
 	if (op == RS_START || op == RS_STATUS) {
-		rv =  _do_child_levels(tree, first, ret, op);
+		rv |= _do_child_levels(tree, first, ret, op);
 	       	if (rv & SFL_FAILURE)
 			return rv;
 
 		/* Start default level after specified ones */
-		rv =  _do_child_default_level(tree, first, ret, op);
+		rv |= _do_child_default_level(tree, first, ret, op);
 
 	} /* stop */ else {
 
-		rv =  _do_child_default_level(tree, first, ret, op);
-	       	if (rv != 0)
-			return rv;
-
-		rv =  _do_child_levels(tree, first, ret, op);
+		rv |= _do_child_default_level(tree, first, ret, op);
+		rv |= _do_child_levels(tree, first, ret, op);
 	}
 
 	return rv;
@@ -1245,22 +1242,8 @@
 
 	}
 
-	if (node->rn_child) {
-		rv = _res_op_by_level(&node, me?NULL:first, ret, op);
-		if (rv != 0) {
-			mark_nodes(node, RES_FAILED,
-				   RF_NEEDSTART | RF_NEEDSTOP);
-
-			/* If this node is independent of its siblings,
-			   that one of its dependent children failed
-			   does not matter: its dependent children must
-			   also be independent of this node's siblings. */
-			if (node->rn_flags & RF_INDEPENDENT)
-				return SFL_RECOVERABLE;
-
-			return SFL_FAILURE;
-		}
-	}
+	if (node->rn_child)
+		rv |= _res_op_by_level(&node, me?NULL:first, ret, op);
 
 	/* Stop should occur after children have stopped */
 	if (me && (op == RS_STOP)) {
Index: rg_state.c
===================================================================
RCS file: /cvs/cluster/cluster/rgmanager/src/daemons/rg_state.c,v
retrieving revision 1.24.2.12
diff -u -r1.24.2.12 rg_state.c
--- rg_state.c	2 Aug 2007 14:46:51 -0000	1.24.2.12
+++ rg_state.c	29 Aug 2007 21:37:58 -0000
@@ -1130,10 +1130,13 @@
 static inline int
 handle_started_status(char *svcName, int ret, rg_state_t *svcStatus)
 {
+	int newowner;
+
 	if (ret & SFL_FAILURE) {
-		ret = msvc_check_cluster(svcName);
-		if (ret >= 0)
-			return 1;
+		newowner = msvc_check_cluster(svcName);
+		if (newowner >= 0)
+			return 0; /* running but not here */
+		return ret;	  /* not running anymore */
 	}
 
 	/* Ok, we have a recoverable service.  Try to perform
Index: test.c
===================================================================
RCS file: /cvs/cluster/cluster/rgmanager/src/daemons/test.c,v
retrieving revision 1.6.2.5
diff -u -r1.6.2.5 test.c
--- test.c	31 Jul 2007 17:54:54 -0000	1.6.2.5
+++ test.c	29 Aug 2007 21:37:58 -0000
@@ -238,7 +238,7 @@
 
 		ret = res_status(&tree, curres, NULL);
 		if (ret) {
-			printf("Status check of %s failed\n", argv[3]);
+			printf("Status check of %s failed, ret=%d\n", argv[3], ret);
 			goto out;
 		}
 		printf("Status of %s is good\n", argv[3]);


More information about the Cluster-devel mailing list