cluster: RHEL55 - rgmanager: Fix max_restart threshold handling

Lon Hohberger lon at fedoraproject.org
Thu May 20 20:44:14 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=7a1e2af8cc37409b3a38fbe9b5945d186be9f2ec
Commit:        7a1e2af8cc37409b3a38fbe9b5945d186be9f2ec
Parent:        75c7ecae61d9400d084227304d5b7068fdaa310b
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Tue May 4 15:03:23 2010 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Thu May 20 16:43:18 2010 -0400

rgmanager: Fix max_restart threshold handling

Max_restart / restart_expire_time was not being correctly
handled, resulting in inconsistent amounts of restarts prior
to relocation (or in some cases, no relocation at all)

Resolves: bz594476

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/include/resgroup.h            |    1 +
 rgmanager/src/daemons/groups.c          |   16 ++++++++++++++++
 rgmanager/src/daemons/restart_counter.c |    5 +++++
 rgmanager/src/daemons/rg_state.c        |    6 +++++-
 rgmanager/src/daemons/slang_event.c     |   20 ++++++++++++++++++--
 5 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/rgmanager/include/resgroup.h b/rgmanager/include/resgroup.h
index ec3e67d..c8e7e2d 100644
--- a/rgmanager/include/resgroup.h
+++ b/rgmanager/include/resgroup.h
@@ -144,6 +144,7 @@ int svc_freeze(char *svcName);
 int svc_unfreeze(char *svcName);
 int svc_migrate(char *svcName, int target);
 int check_restart(char *svcName);
+int clear_restart(const char *rg_name);
 int add_restart(char *svcName);
 
 int rt_enqueue_request(const char *resgroupname, int request,
diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c
index 9caf746..9818aa3 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -1945,6 +1945,22 @@ check_restart(char *rg_name)
 	return ret;
 }
 
+int
+clear_restart(const char *rg_name)
+{
+	resource_node_t *node;
+	int ret = 0;
+
+	pthread_rwlock_rdlock(&resource_lock);
+	node = node_by_ref(&_tree, rg_name);
+	if (node) {
+		ret = restart_clear(node->rn_restart_counter);
+	}
+	pthread_rwlock_unlock(&resource_lock);
+
+	return ret;
+}
+
 
 void
 kill_resource_groups(void)
diff --git a/rgmanager/src/daemons/restart_counter.c b/rgmanager/src/daemons/restart_counter.c
index c889c6d..d909713 100644
--- a/rgmanager/src/daemons/restart_counter.c
+++ b/rgmanager/src/daemons/restart_counter.c
@@ -107,6 +107,11 @@ restart_threshold_exceeded(restart_counter_t arg)
 	restart_info_t *restarts = (restart_info_t *)arg;
 	time_t now;
 
+	if (!arg)
+		/* No max restarts / threshold = always
+		   ok to restart! */
+		return 0;
+
 	VALIDATE(arg, -1);
 	now = time(NULL);
 	restart_timer_purge(arg, now);
diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c
index 49464d5..3e57748 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -812,7 +812,6 @@ svc_start(char *svcName, int req)
 	svcStatus.rs_transition = (uint64_t)time(NULL);
 
 	if (svcStatus.rs_state == RG_STATE_RECOVER) {
-		add_restart(svcName);
 		svcStatus.rs_restarts++;
 	} else {
 		svcStatus.rs_restarts = 0;
@@ -2143,20 +2142,25 @@ handle_recover_req(char *svcName, int *new_owner)
 	get_recovery_policy(svcName, policy, sizeof(policy));
 
 	if (!strcasecmp(policy, "disable")) {
+		clear_restart(svcName);
 		return svc_disable(svcName);
 	} else if (!strcasecmp(policy, "relocate")) {
+		clear_restart(svcName);
 		return handle_relocate_req(svcName, RG_START_RECOVER, -1,
 					   new_owner);
 	}
 
 	/* Check restart counter/timer for this resource */
 	if (check_restart(svcName) > 0) {
+		clear_restart(svcName);
 		clulog(LOG_NOTICE, "Restart threshold for %s exceeded; "
 		       "attempting to relocate\n", svcName);
 		return handle_relocate_req(svcName, RG_START_RECOVER, -1,
 					   new_owner);
 	}
 
+	add_restart(svcName);
+
 	return handle_start_req(svcName, RG_START_RECOVER, new_owner);
 }
 
diff --git a/rgmanager/src/daemons/slang_event.c b/rgmanager/src/daemons/slang_event.c
index 8a5493c..086ac6b 100644
--- a/rgmanager/src/daemons/slang_event.c
+++ b/rgmanager/src/daemons/slang_event.c
@@ -1123,22 +1123,38 @@ int
 S_service_event(const char *file, const char *script, char *name,
 	        int state, int owner, int last_owner)
 {
+	char policy[20];
 	int ret;
 
 	_service_name = name;
 	_service_state = (char *)rg_state_str(state);
 	_service_owner = owner;
 	_service_last_owner = last_owner;
-	_service_restarts_exceeded = check_restart(name);
+	_service_restarts_exceeded = 0;
 
 	switch(state) {
 	case RG_STATE_DISABLED:
 	case RG_STATE_STOPPED:
 	case RG_STATE_FAILED:
-	case RG_STATE_RECOVER:
 	case RG_STATE_ERROR:
 		/* There is no owner for these states.  Ever.  */
 		_service_owner = -1;
+		break;
+	case RG_STATE_RECOVER:
+		get_recovery_policy(name, policy, sizeof(policy));
+		if (!strcasecmp(policy, "restart")) {
+			_service_restarts_exceeded = check_restart(name);
+			add_restart(name);
+		} else if (!strcasecmp(policy, "relocate")) {
+			/* Restart threshold is always exceeded 
+			 * with 'relocate' recovery policy */
+			_service_restarts_exceeded = 1;
+		}
+		_service_owner = -1;
+	}
+
+	if (_service_restarts_exceeded) {
+		clear_restart(name);
 	}
 
 	ret = do_slang_run(file, script);


More information about the cluster-commits mailing list