cluster: RHEL56 - rgmanager: clean up independent subtree restart handling

Lon Hohberger lon at fedoraproject.org
Fri Sep 24 22:21:11 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=4c2014fc4ecd96357881019848a77d25cbe1121b
Commit:        4c2014fc4ecd96357881019848a77d25cbe1121b
Parent:        b05534b22a95d15be95035448a20f6fa321a9a10
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Tue Sep 14 10:10:05 2010 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Fri Sep 24 16:16:03 2010 -0400

rgmanager: clean up independent subtree restart handling

Resolves: rhbz#605733

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/src/daemons/restree.c  |   28 ++++++++++++++++------------
 rgmanager/src/daemons/rg_state.c |   11 +++++++----
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c
index 60743a9..eca28f3 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -549,9 +549,6 @@ assign_restart_policy(resource_t *curres, resource_node_t *parent,
 			if (max_restarts <= 0)
 				max_restarts = 0;
 			free(val);
-			
-			if (!max_restarts)
-				return;
 		}
 	
 		snprintf(tok, sizeof(tok), "%s/@__restart_expire_time", base);
@@ -561,11 +558,13 @@ assign_restart_policy(resource_t *curres, resource_node_t *parent,
 		if (conf_get(tok, &val) == 0) {
 #endif
 			restart_expire_time = (time_t)expand_time(val);
-			if ((int64_t)restart_expire_time < 0)
+			if ((int64_t)restart_expire_time <= 0)
 				restart_expire_time = 0;
 			free(val);
 		}
 
+		if (restart_expire_time == 0 || max_restarts == 0)
+			return;
 		goto out_assign;
 	}
 
@@ -1551,7 +1550,8 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 						   RF_NEEDSTOP | RF_QUIESCE, 0);
 					restart_clear(node->rn_restart_counter);
 					return SFL_RECOVERABLE|SFL_PARTIAL;
-				} else if (!rte) {
+				} else if (!rte ||
+					   !node->rn_restart_counter) {
 					restart_add(node->rn_restart_counter);
 					mark_nodes(node, RES_FAILED,
 						   RF_NEEDSTART | RF_NEEDSTOP, 0);
@@ -1592,7 +1592,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 				mark_nodes(node, RES_FAILED, RF_NEEDSTOP | RF_QUIESCE, 0);
 
 				rv |= SFL_PARTIAL;
-			} else if (!rte) {
+			} else if (!rte || !node->rn_restart_counter) {
 				restart_add(node->rn_restart_counter);
 				mark_nodes(node, RES_FAILED,
 					   RF_NEEDSTOP | RF_NEEDSTART, 0);
@@ -1613,18 +1613,21 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 		node->rn_flags &= ~RF_NEEDSTOP;
 		rv |= res_exec(node, op, NULL, 0);
 
-		if (node->rn_flags & RF_QUIESCE) {
+		if (node->rn_flags & (RF_NEEDSTART|RF_QUIESCE) &&
+		    node->rn_flags & RF_INDEPENDENT &&
+		    node->rn_flags & RF_NON_CRITICAL) {
 			/* Non-critical resources = do not fail 
 			 * service if the resource fails to stop
 			 */
 			if (rv & SFL_FAILURE) {
-				clulog(LOG_WARNING, "Failure to stop %s:%s"
+				clulog(LOG_WARNING, "Failed to stop subtree %s:%s"
 				       " during non-critical recovery "
 				       "operation\n",
 				       node->rn_resource->r_rule->rr_type,
 				       primary_attr_value(
 						node->rn_resource));
-				rv &= ~SFL_FAILURE;
+				rv = SFL_PARTIAL;
+				node->rn_flags |= RF_QUIESCE;
 			}
 		}
 
@@ -1633,7 +1636,8 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 			assert(node->rn_resource->r_incarnations >= 0);
 			if (node->rn_resource->r_incarnations > 0)
 				--node->rn_resource->r_incarnations;
-		} else if (node->rn_state != RES_DISABLED) {
+		} else if (node->rn_state != RES_DISABLED &&
+			   !(node->rn_flags & RF_QUIESCE)) {
 			node->rn_state = RES_FAILED;
 			pthread_mutex_unlock(&node->rn_resource->r_mutex);
 			return SFL_FAILURE;
@@ -1641,8 +1645,8 @@ _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_QUIESCE;
-			node->rn_state = RES_DISABLED;
+			mark_nodes(node, RES_DISABLED, 0,
+				   RF_NEEDSTART|RF_QUIESCE);
 		} else {
 			node->rn_state = RES_STOPPED;
 		}
diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c
index 8af6c7e..de44bf7 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -1308,17 +1308,20 @@ handle_started_status(char *svcName, int ret,
 		       "Attempting inline recovery\n", svcName);
 
 		ret2 = group_op(svcName, RG_CONDSTOP);
-		if (!(ret2 & SFL_FAILURE)) {
-			ret2 = group_op(svcName, RG_CONDSTART);
+		if (ret2 & SFL_PARTIAL) {
+			ret |= SFL_PARTIAL;
+			ret2 &= ~SFL_PARTIAL;
 		}
 
-		if (ret2) {
+		if (!(ret2 & SFL_FAILURE)) {
+			ret2 = group_op(svcName, RG_CONDSTART);
+		} else {
 			clulog(LOG_WARNING, "Inline recovery of %s failed\n",
 			       svcName);
 			return ret;
 		}
 
-		clulog(LOG_NOTICE, "Inline recovery of %s succeeded\n",
+		clulog(LOG_NOTICE, "Inline recovery of %s complete\n",
 		       svcName);
 		if (ret & SFL_PARTIAL) {
 			clulog(LOG_NOTICE, "Note: Some non-critical "


More information about the cluster-commits mailing list