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

Lon Hohberger lon at fedoraproject.org
Tue Feb 1 18:11:00 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c7187470032d2ab7c32a6a3ae43a358e1a99656b
Commit:        c7187470032d2ab7c32a6a3ae43a358e1a99656b
Parent:        0ffd512aea6ed74ed0127284d0112bcbffa33061
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Tue Sep 14 10:10:05 2010 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Tue Feb 1 12:34:22 2011 -0500

rgmanager: clean up independent subtree restart handling

Resolves: rhbz#634277

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 30c7179..55cc146 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -509,9 +509,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);
@@ -521,11 +518,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;
 	}
 
@@ -1511,7 +1510,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);
@@ -1552,7 +1552,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);
@@ -1573,18 +1573,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) {
-				logt_print(LOG_WARNING, "Failure to stop %s:%s"
+				logt_print(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;
 			}
 		}
 
@@ -1593,7 +1596,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;
@@ -1601,8 +1605,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 9328a88..babac7a 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -1248,17 +1248,20 @@ handle_started_status(const 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 {
 			logt_print(LOG_WARNING, "Inline recovery of %s failed\n",
 			       svcName);
 			return ret;
 		}
 
-		logt_print(LOG_NOTICE, "Inline recovery of %s succeeded\n",
+		logt_print(LOG_NOTICE, "Inline recovery of %s complete\n",
 			   svcName);
 		if (ret & SFL_PARTIAL) {
 			logt_print(LOG_NOTICE, "Note: Some non-critical "


More information about the cluster-commits mailing list