Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 7a1e2af8cc37409b3a38fbe9b5945d186be9f2ec
Parent: 75c7ecae61d9400d084227304d5b7068fdaa310b
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Tue May 4 15:03:23 2010 -0400
Committer: Lon Hohberger <lhh(a)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(a)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);