cluster: RHEL6 - rgmanager: Fix handling of independent subtrees

Lon Hohberger lon at fedoraproject.org
Tue Feb 1 18:10:46 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=109a4f729592e2f9039ec369df440cbb21a078c7
Commit:        109a4f729592e2f9039ec369df440cbb21a078c7
Parent:        c5db095bea06e76e021577bd56d2658f90ebbecc
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Wed Sep 8 15:56:28 2010 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Tue Feb 1 12:32:00 2011 -0500

rgmanager: Fix handling of independent subtrees

Independent subtrees were not getting handled
correctly in all cases.  This prevented correct
recovery (e.g. stop) of resources which failed
when an ancestor was an independent subtree.

Resolves: rhbz#634277

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/src/daemons/restree.c |   17 +++++++++--------
 1 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c
index e7866e2..ab0e20d 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -1149,8 +1149,8 @@ mark_nodes(resource_node_t *node, int state, int setflags, int clearflags)
 	resource_node_t *child;
 
 	list_for(&node->rn_child, child, x) {
-		if (child->rn_child)
-			mark_nodes(child->rn_child, state, setflags,
+		if (child)
+			mark_nodes(child, state, setflags,
 				   clearflags);
 	}
 
@@ -1375,7 +1375,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 			printf("Node %s:%s - Convalesce\n",
 			       node->rn_resource->r_rule->rr_type,
 			       primary_attr_value(node->rn_resource));
-			node->rn_state = RES_STOPPED;
+			mark_nodes(node, RES_STOPPED, RF_NEEDSTART, 0);
 			op = RS_START;
 		}
 
@@ -1470,8 +1470,10 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 			return SFL_FAILURE;
 		}
 
-		if (node->rn_state != RES_DISABLED)
-			mark_nodes(node, RES_STARTED, 0, RF_NEEDSTOP);
+		if (node->rn_state != RES_DISABLED) {
+			node->rn_state = RES_STARTED;
+			node->rn_flags &= ~RF_NEEDSTOP;
+		}
 	}
 
        if (node->rn_child) {
@@ -1483,7 +1485,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 		  and all our children as failed and return a flag stating
 		  that this section is recoverable apart from siblings in
 		  the resource tree. */
-		if (op == RS_STATUS && (rv & SFL_FAILURE) &&
+		if (op == RS_STATUS && (rv & (SFL_FAILURE|SFL_RECOVERABLE)) &&
 		    (node->rn_flags & RF_INDEPENDENT)) {
 			rv = SFL_RECOVERABLE;
 			if (node->rn_flags & RF_NON_CRITICAL) {
@@ -1520,8 +1522,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 		}
 		pthread_mutex_unlock(&node->rn_resource->r_mutex);
 
-		if (node->rn_flags & RF_QUIESCE &&
-		    node->rn_flags & RF_NON_CRITICAL) {
+		if (node->rn_flags & RF_QUIESCE) {
 			node->rn_flags &= ~RF_QUIESCE;
 			node->rn_state = RES_DISABLED;
 		} else {


More information about the cluster-commits mailing list