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

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


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=b631ffdb818f7cf3512840dd99b8844aa230b03d
Commit:        b631ffdb818f7cf3512840dd99b8844aa230b03d
Parent:        5907340776e360b327642f24f7ace0ae812b7a81
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Mon Aug 30 13:37:38 2010 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Tue Feb 1 12:30:58 2011 -0500

rgmanager: Mark non-critical resources disabled

Resolves: rhbz#634277

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 13b4dae..a0b6fc1 100644
--- a/rgmanager/include/resgroup.h
+++ b/rgmanager/include/resgroup.h
@@ -229,6 +229,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 142fce6..a8acd8e 100644
--- a/rgmanager/include/reslist.h
+++ b/rgmanager/include/reslist.h
@@ -29,12 +29,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 e480cc8..a717376 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -962,7 +962,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++) {
@@ -1153,7 +1154,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);
 }
@@ -1171,6 +1173,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++) {
@@ -1365,6 +1370,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",
@@ -1385,7 +1399,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);
@@ -1430,21 +1449,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) {
@@ -1458,14 +1485,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;
+			}
 		}
 	}
  			
@@ -1475,27 +1504,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 d31ea2b..9049a7c 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -1122,7 +1122,7 @@ static int
 handle_started_status(const char *svcName, int ret,
 		      rg_state_t __attribute__((unused)) *svcStatus)
 {
-	int newowner;
+	int newowner, ret2;
 
 	if (ret & SFL_FAILURE) {
 		newowner = msvc_check_cluster(svcName);
@@ -1138,20 +1138,27 @@ handle_started_status(const char *svcName, int ret,
 		logt_print(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) {
 			logt_print(LOG_WARNING, "Inline recovery of %s failed\n",
 			       svcName);
-		} else {
-			logt_print(LOG_NOTICE,
-			       "Inline recovery of %s succeeded\n",
-			       svcName);
-			return 0;
+			return ret;
 		}
+
+		logt_print(LOG_NOTICE, "Inline recovery of %s succeeded\n",
+			   svcName);
+		if (ret & SFL_PARTIAL) {
+			logt_print(LOG_NOTICE, "Note: Some non-critical "
+				   "resources are still stopped.\n");
+			logt_print(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