cluster: RHEL57 - rgmanager: Improve rgmanager's exclusive prioritization handling

Lon Hohberger lon at fedoraproject.org
Fri Apr 8 13:47:10 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c50eee8b798999a06bdb739674d315a4a51198e0
Commit:        c50eee8b798999a06bdb739674d315a4a51198e0
Parent:        205d7b2096b288329226cf8be6dae9f870c346cb
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Mon Mar 21 21:16:25 2011 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Fri Apr 8 09:31:16 2011 -0400

rgmanager: Improve rgmanager's exclusive prioritization handling

Resolves: rhbz#680256

Signed-off-by: Lon Hohberger <lhh at redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto at redhat.com>
---
 rgmanager/src/resources/default_event_script.sl |   72 ++++++++++++++++++-----
 1 files changed, 56 insertions(+), 16 deletions(-)

diff --git a/rgmanager/src/resources/default_event_script.sl b/rgmanager/src/resources/default_event_script.sl
index db6e789..d567465 100644
--- a/rgmanager/src/resources/default_event_script.sl
+++ b/rgmanager/src/resources/default_event_script.sl
@@ -57,7 +57,7 @@ define separate_nodes(node_list)
 define exclusive_prioritize(svc, node_list)
 {
 	variable services = service_list();
-	variable len, x, y, owner, state, preferred_owner;
+	variable len, x, y, owner, nowner, state, preferred_owner;
 	variable svc_excl, other_excl;
 	variable nodes_x, nodes_s, nodes_e;
 
@@ -66,7 +66,8 @@ define exclusive_prioritize(svc, node_list)
 	%
 	svc_excl = atoi(service_property(svc, "exclusive"));
 	if (svc_excl == 0) {
-		return node_list;
+		notice("Starting ", svc, " on ", node_list);
+		return service_start(svc, node_list);
 	}
 
 	(nodes_e, nodes_s, nodes_x) = separate_nodes(node_list);
@@ -76,7 +77,11 @@ define exclusive_prioritize(svc, node_list)
 		% If we've got an exclusive service, only allow it to start on 
 		% empty nodes.
 		%
-		return nodes_e;
+		notice("Starting ", svc, " on ", nodes_e);
+		nowner = service_start(svc, nodes_e);
+		if ((nowner > 0) or (nowner != FAIL)) {
+			return nowner;
+		}
 	}
 
 	if (length(nodes_x) == 0) {
@@ -85,7 +90,7 @@ define exclusive_prioritize(svc, node_list)
 		% and no empty nodes, the service can not be started
 		%
 		notice("No empty / exclusive nodes available; cannot restart ", svc);
-		return nodes_x;
+		return ERR_DOMAIN;
 	}
 
 	%
@@ -129,14 +134,16 @@ define exclusive_prioritize(svc, node_list)
 		() = service_stop(services[x]);
 
 		%
-		% Return just the one node.
+		% Try just the one node.
 		%
-		node_list = subtract([0], 0);
-		node_list = union(node_list, owner);
-		return node_list;
+		notice("Starting ", svc, " on ", owner);
+		nowner = service_start(svc, owner);
+		if ((nowner > 0) or (nowner != FAIL)) {
+			return nowner;
+		}
 	}
 
-	return node_list;
+	return ERR_DOMAIN;
 }
 
 
@@ -200,13 +207,13 @@ define move_or_start(service, node_list)
 			return ERR_ABORT;
 		}
 	} else {
-		node_list = exclusive_prioritize(service, node_list);
-		notice("Starting ", service, " on ", node_list);
+		return exclusive_prioritize(service, node_list);
 	}
 
 	if (length(node_list) == 0) {
 		return ERR_DOMAIN; 
 	}
+	notice("Starting ", service, " on ", node_list);
 	return service_start(service, node_list);
 }
 
@@ -428,7 +435,7 @@ define default_node_event_handler()
 define default_service_event_handler()
 {
 	variable services = service_list();
-	variable x;
+	variable x, excl, len;
 	variable depends;
 	variable depend_mode;
 	variable policy;
@@ -472,15 +479,16 @@ define default_service_event_handler()
 		return;
 	}
 
-	for (x = 0; x < length(services); x++) {
+	%
+	% Simplistic dependency handling
+	%
+	len = length(services);
+	for (x = 0; x < len; x++) {
 		if (service_name == services[x]) {
 			% don't do anything to ourself! 
 			continue;
 		}
 
-		%
-		% Simplistic dependency handling
-		%
 		depends = service_property(services[x], "depend");
 		depend_mode = service_property(services[x], "depend_mode");
 
@@ -504,6 +512,38 @@ define default_service_event_handler()
 			()=service_stop(services[x]);
 		}
 	}
+
+	%
+	% Try to restart exclusive service which might have been recently
+	% stopped in order to make room for other exclusive services.
+	%
+	% Note that as a side effect, exclusive services (>=2) can't be
+	% stopped with clusvcadm -s; they will just pop right back - you
+	% must disable them if want them to stay stopped.
+	%
+	% This code has a side effect of brute-forcing the lowest-priority
+	% exclusive service offline in a cascaded fashion.
+	%
+	for (x = 0; x < len; x++) {
+		if (service_name == services[x]) {
+			% don't do anything to ourself!
+			continue;
+		}
+
+		excl = atoi(service_property(services[x], "exclusive"));
+		% non-exclusive or highest-prio (1) shouldn't get here
+		if ((excl == 0) or (excl == 1)) {
+			continue;
+		}
+
+		(,,, owner, state) = service_status(services[x]);
+		if (state == "stopped") {
+			info("Restarting stopped exclusive priority ",
+			     excl, " service ", services[x]);
+			nodes = allowed_nodes(services[x]);
+			()=move_or_start(services[x], nodes);
+		}
+	}
 }
 
 define default_config_event_handler()


More information about the cluster-commits mailing list