cluster: RHEL56 - rgmanager: clean up independent subtree restart handling
Lon Hohberger
lon at fedoraproject.org
Fri Sep 24 22:21:11 UTC 2010
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=4c2014fc4ecd96357881019848a77d25cbe1121b
Commit: 4c2014fc4ecd96357881019848a77d25cbe1121b
Parent: b05534b22a95d15be95035448a20f6fa321a9a10
Author: Lon Hohberger <lhh at redhat.com>
AuthorDate: Tue Sep 14 10:10:05 2010 -0400
Committer: Lon Hohberger <lhh at 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 at 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 "
More information about the cluster-commits
mailing list