Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=4c2... Commit: 4c2014fc4ecd96357881019848a77d25cbe1121b Parent: b05534b22a95d15be95035448a20f6fa321a9a10 Author: Lon Hohberger lhh@redhat.com AuthorDate: Tue Sep 14 10:10:05 2010 -0400 Committer: Lon Hohberger lhh@redhat.com CommitterDate: Fri Sep 24 16:16:03 2010 -0400
rgmanager: clean up independent subtree restart handling
Resolves: rhbz#605733
Signed-off-by: Lon Hohberger lhh@redhat.com --- rgmanager/src/daemons/restree.c | 28 ++++++++++++++++------------ rgmanager/src/daemons/rg_state.c | 11 +++++++---- 2 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c index 60743a9..eca28f3 100644 --- a/rgmanager/src/daemons/restree.c +++ b/rgmanager/src/daemons/restree.c @@ -549,9 +549,6 @@ assign_restart_policy(resource_t *curres, resource_node_t *parent, if (max_restarts <= 0) max_restarts = 0; free(val); - - if (!max_restarts) - return; } snprintf(tok, sizeof(tok), "%s/@__restart_expire_time", base); @@ -561,11 +558,13 @@ assign_restart_policy(resource_t *curres, resource_node_t *parent, if (conf_get(tok, &val) == 0) { #endif restart_expire_time = (time_t)expand_time(val); - if ((int64_t)restart_expire_time < 0) + if ((int64_t)restart_expire_time <= 0) restart_expire_time = 0; free(val); }
+ if (restart_expire_time == 0 || max_restarts == 0) + return; goto out_assign; }
@@ -1551,7 +1550,8 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, RF_NEEDSTOP | RF_QUIESCE, 0); restart_clear(node->rn_restart_counter); return SFL_RECOVERABLE|SFL_PARTIAL; - } else if (!rte) { + } else if (!rte || + !node->rn_restart_counter) { restart_add(node->rn_restart_counter); mark_nodes(node, RES_FAILED, RF_NEEDSTART | RF_NEEDSTOP, 0); @@ -1592,7 +1592,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, mark_nodes(node, RES_FAILED, RF_NEEDSTOP | RF_QUIESCE, 0);
rv |= SFL_PARTIAL; - } else if (!rte) { + } else if (!rte || !node->rn_restart_counter) { restart_add(node->rn_restart_counter); mark_nodes(node, RES_FAILED, RF_NEEDSTOP | RF_NEEDSTART, 0); @@ -1613,18 +1613,21 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, node->rn_flags &= ~RF_NEEDSTOP; rv |= res_exec(node, op, NULL, 0);
- if (node->rn_flags & RF_QUIESCE) { + if (node->rn_flags & (RF_NEEDSTART|RF_QUIESCE) && + node->rn_flags & RF_INDEPENDENT && + node->rn_flags & RF_NON_CRITICAL) { /* Non-critical resources = do not fail * service if the resource fails to stop */ if (rv & SFL_FAILURE) { - clulog(LOG_WARNING, "Failure to stop %s:%s" + clulog(LOG_WARNING, "Failed to stop subtree %s:%s" " during non-critical recovery " "operation\n", node->rn_resource->r_rule->rr_type, primary_attr_value( node->rn_resource)); - rv &= ~SFL_FAILURE; + rv = SFL_PARTIAL; + node->rn_flags |= RF_QUIESCE; } }
@@ -1633,7 +1636,8 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, 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) { + } else if (node->rn_state != RES_DISABLED && + !(node->rn_flags & RF_QUIESCE)) { node->rn_state = RES_FAILED; pthread_mutex_unlock(&node->rn_resource->r_mutex); return SFL_FAILURE; @@ -1641,8 +1645,8 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, pthread_mutex_unlock(&node->rn_resource->r_mutex);
if (node->rn_flags & RF_QUIESCE) { - node->rn_flags &= ~RF_QUIESCE; - node->rn_state = RES_DISABLED; + mark_nodes(node, RES_DISABLED, 0, + RF_NEEDSTART|RF_QUIESCE); } else { node->rn_state = RES_STOPPED; } diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c index 8af6c7e..de44bf7 100644 --- a/rgmanager/src/daemons/rg_state.c +++ b/rgmanager/src/daemons/rg_state.c @@ -1308,17 +1308,20 @@ handle_started_status(char *svcName, int ret, "Attempting inline recovery\n", svcName);
ret2 = group_op(svcName, RG_CONDSTOP); - if (!(ret2 & SFL_FAILURE)) { - ret2 = group_op(svcName, RG_CONDSTART); + if (ret2 & SFL_PARTIAL) { + ret |= SFL_PARTIAL; + ret2 &= ~SFL_PARTIAL; }
- if (ret2) { + if (!(ret2 & SFL_FAILURE)) { + ret2 = group_op(svcName, RG_CONDSTART); + } else { clulog(LOG_WARNING, "Inline recovery of %s failed\n", svcName); return ret; }
- clulog(LOG_NOTICE, "Inline recovery of %s succeeded\n", + clulog(LOG_NOTICE, "Inline recovery of %s complete\n", svcName); if (ret & SFL_PARTIAL) { clulog(LOG_NOTICE, "Note: Some non-critical "
cluster-commits@lists.fedorahosted.org