cluster: RHEL56 - rgmanager: Mark non-critical resources disabled

Lon Hohberger lon at fedoraproject.org
Fri Sep 24 22:20:54 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=5a512395a0f54262c874f93ff590ca397b9bfeb6
Commit:        5a512395a0f54262c874f93ff590ca397b9bfeb6
Parent:        d826bd7fd129f80601a2b33cadc8f1d32f4f8e69
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Mon Aug 30 13:37:38 2010 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Fri Sep 24 16:16:02 2010 -0400

rgmanager: Mark non-critical resources disabled

Resolves: rhbz#605733

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/include/resgroup.h     |    1 +
 rgmanager/include/reslist.h      |    2 +
 rgmanager/src/daemons/restree.c  |   75 ++++++++++++++++++++++++++------------
 rgmanager/src/daemons/rg_state.c |   27 +++++++++-----
 4 files changed, 72 insertions(+), 33 deletions(-)

diff --git a/rgmanager/include/resgroup.h b/rgmanager/include/resgroup.h
index edfa012..701d884 100644
--- a/rgmanager/include/resgroup.h
+++ b/rgmanager/include/resgroup.h
@@ -235,6 +235,7 @@ const char *rg_strerror(int val);
  */
 #define SFL_FAILURE		(1<<0)
 #define SFL_RECOVERABLE		(1<<1)
+#define SFL_PARTIAL		(1<<2)
 
 //#define DEBUG
 #ifdef DEBUG
diff --git a/rgmanager/include/reslist.h b/rgmanager/include/reslist.h
index 26fdbb5..1958c76 100644
--- a/rgmanager/include/reslist.h
+++ b/rgmanager/include/reslist.h
@@ -47,12 +47,14 @@
 				  the configuration */
 #define RF_ENFORCE_TIMEOUTS (1<<9) /** Enforce timeouts for this node */
 #define RF_NON_CRITICAL (1<<10) /** stop this resource if it fails */
+#define RF_QUIESCE	(1<<11) /** don't restart this resource */
 
 
 
 #define RES_STOPPED	(0)
 #define RES_STARTED	(1)
 #define RES_FAILED	(2)
+#define RES_DISABLED	(3)
 
 #ifndef SHAREDIR
 #define SHAREDIR		"/usr/share/rgmanager"
diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c
index 1bb9d9a..3c0ce5f 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -1002,7 +1002,8 @@ _print_resource_tree(FILE *fp, resource_node_t **tree, int level)
 				fprintf(fp, "NON-CRITICAL ");
 			fprintf(fp, "]");
 		}
-		fprintf(fp, " {\n");
+
+		fprintf(fp, " (S%d) {\n", node->rn_state);
 
 		for (x = 0; node->rn_resource->r_attrs &&
 		     node->rn_resource->r_attrs[x].ra_value; x++) {
@@ -1193,7 +1194,8 @@ mark_nodes(resource_node_t *node, int state, int setflags, int clearflags)
 				   clearflags);
 	}
 
-	node->rn_state = state;
+	if (state >= RES_STOPPED)
+		node->rn_state = state;
 	node->rn_flags |= (setflags);
 	node->rn_flags &= ~(clearflags);
 }
@@ -1211,6 +1213,9 @@ do_status(resource_node_t *node)
 	int has_recover = 0;
 	time_t delta = 0, now = 0;
 
+	if (node->rn_state == RES_DISABLED)
+		return 0;
+
 	now = time(NULL);
 
 	for (; node->rn_actions[x].ra_name; x++) {
@@ -1405,6 +1410,15 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 		   CONDSTART and CONDSTOP are no-ops if
 		   the appropriate flag is not set.
 		 */
+		if ((op == RS_CONVALESCE) &&
+		    node->rn_state == RES_DISABLED) {
+			printf("Node %s:%s - Convalesce\n",
+			       node->rn_resource->r_rule->rr_type,
+			       primary_attr_value(node->rn_resource));
+			node->rn_state = RES_STOPPED;
+			op = RS_START;
+		}
+
 	       	if ((op == RS_CONDSTART) &&
 		    (node->rn_flags & RF_NEEDSTART)) {
 			printf("Node %s:%s - CONDSTART\n",
@@ -1425,7 +1439,12 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 	/* Start starts before children */
 	if (me && (op == RS_START)) {
 
+		if (node->rn_state == RES_DISABLED)
+			/* Nothing to do - children are also disabled */
+			return 0;
+
 		pthread_mutex_lock(&node->rn_resource->r_mutex);
+
 		if (node->rn_flags & RF_RECONFIG &&
 		    realop == RS_CONDSTART) {
 			rv = res_exec(node, RS_RECONFIG, NULL, 0);
@@ -1470,21 +1489,29 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 			   dependent children are failed, whether or not this
 			   node is independent or not.
 			 */
-			mark_nodes(node, RES_FAILED,
-				   RF_NEEDSTART | RF_NEEDSTOP, 0);
 
 			/* If we're an independent subtree, return a flag
 			   stating that this section is recoverable apart
 			   from siblings in the resource tree.  All child
 			   resources of this node must be restarted,
 			   but siblings of this node are not affected. */
-			if (node->rn_flags & RF_INDEPENDENT)
-				return SFL_RECOVERABLE;
+			if (node->rn_flags & RF_INDEPENDENT) {
+				if (node->rn_flags & RF_NON_CRITICAL) {
+					mark_nodes(node, RES_FAILED,
+						   RF_NEEDSTOP | RF_QUIESCE, 0);
+					return SFL_RECOVERABLE|SFL_PARTIAL;
+				} else {
+					mark_nodes(node, RES_FAILED,
+						   RF_NEEDSTART | RF_NEEDSTOP, 0);
+					return SFL_RECOVERABLE;
+				}
+			}
 
 			return SFL_FAILURE;
 		}
 
-		mark_nodes(node, RES_STARTED, 0, RF_NEEDSTOP);
+		if (node->rn_state != RES_DISABLED)
+			mark_nodes(node, RES_STARTED, 0, RF_NEEDSTOP);
 	}
 
        if (node->rn_child) {
@@ -1498,14 +1525,16 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 		  the resource tree. */
 		if (op == RS_STATUS && (rv & SFL_FAILURE) &&
 		    (node->rn_flags & RF_INDEPENDENT)) {
-			if (node->rn_flags & RF_NON_CRITICAL)
+			rv = SFL_RECOVERABLE;
+			if (node->rn_flags & RF_NON_CRITICAL) {
 				/* if non-critical, just stop */
-				mark_nodes(node, RES_FAILED,
-					   RF_NEEDSTOP, 0);
-			else
+				mark_nodes(node, RES_FAILED, RF_NEEDSTOP | RF_QUIESCE, 0);
+
+				rv |= SFL_PARTIAL;
+			} else {
 				mark_nodes(node, RES_FAILED,
 					   RF_NEEDSTOP | RF_NEEDSTART, 0);
-			rv = SFL_RECOVERABLE;
+			}
 		}
 	}
  			
@@ -1515,27 +1544,27 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
 		/* Decrease incarnations so the script knows how many *other*
 		   incarnations there are. */
 		pthread_mutex_lock(&node->rn_resource->r_mutex);
-		if (node->rn_state == RES_STARTED) {
-			assert(node->rn_resource->r_incarnations >= 0);
-			if (node->rn_resource->r_incarnations > 0)
-				--node->rn_resource->r_incarnations;
-		}
 
 		node->rn_flags &= ~RF_NEEDSTOP;
 		rv |= res_exec(node, op, NULL, 0);
 
-		if (rv != 0) {
-			if (node->rn_state == RES_STARTED) {
-				/* Fail to stop: fix incarnations */
-				++node->rn_resource->r_incarnations;
-			}
+		if (rv == 0 && (node->rn_state == RES_STARTED ||
+				node->rn_state == RES_FAILED)) {
+			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) {
 			node->rn_state = RES_FAILED;
 			pthread_mutex_unlock(&node->rn_resource->r_mutex);
 			return SFL_FAILURE;
 		}
 		pthread_mutex_unlock(&node->rn_resource->r_mutex);
 
-		if (node->rn_state != RES_STOPPED) {
+		if (node->rn_flags & RF_QUIESCE &&
+		    node->rn_flags & RF_NON_CRITICAL) {
+			node->rn_flags &= ~RF_QUIESCE;
+			node->rn_state = RES_DISABLED;
+		} else {
 			node->rn_state = RES_STOPPED;
 		}
 	}
diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c
index a4fe15e..c1bcdc8 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -1182,7 +1182,7 @@ static inline int
 handle_started_status(char *svcName, int ret,
 		      rg_state_t __attribute__((unused)) *svcStatus)
 {
-	int newowner;
+	int newowner, ret2;
 
 	if (ret & SFL_FAILURE) {
 		newowner = msvc_check_cluster(svcName);
@@ -1198,20 +1198,27 @@ handle_started_status(char *svcName, int ret,
 		clulog(LOG_WARNING, "Some independent resources in %s failed; "
 		       "Attempting inline recovery\n", svcName);
 
-		ret = group_op(svcName, RG_CONDSTOP);
-		if (!(ret & SFL_FAILURE)) {
-			ret = group_op(svcName, RG_CONDSTART);
+		ret2 = group_op(svcName, RG_CONDSTOP);
+		if (!(ret2 & SFL_FAILURE)) {
+			ret2 = group_op(svcName, RG_CONDSTART);
 		}
 
-		if (ret) {
+		if (ret2) {
 			clulog(LOG_WARNING, "Inline recovery of %s failed\n",
 			       svcName);
-		} else {
-			clulog(LOG_NOTICE,
-			       "Inline recovery of %s succeeded\n",
-			       svcName);
-			return 0;
+			return ret;
 		}
+
+		clulog(LOG_NOTICE, "Inline recovery of %s succeeded\n",
+		       svcName);
+		if (ret & SFL_PARTIAL) {
+			clulog(LOG_NOTICE, "Note: Some non-critical "
+			       "resources are still stopped.\n");
+			clulog(LOG_NOTICE, "Run 'clusvcadm -c %s' to "
+			       "restore them to operation.\n", svcName);
+		}
+
+		return 0;
 	}
 
 	return ret;


More information about the cluster-commits mailing list