Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=398... Commit: 39837b7bf28253a21a3ab805e8fedd44b7cb8ca2 Parent: 2c75a3d41764244928b1a83f83a15351d09cdee3 Author: Lon Hohberger lhh@redhat.com AuthorDate: Tue May 4 15:03:23 2010 -0400 Committer: Lon Hohberger lhh@redhat.com CommitterDate: Thu May 20 09:49:11 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: bz583788
Signed-off-by: Lon Hohberger lhh@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);
cluster-commits@lists.fedorahosted.org