cluster: RHEL6 - rgmanager: clean up independent subtree restart handling
Lon Hohberger
lon at fedoraproject.org
Tue Feb 1 18:11:00 UTC 2011
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c7187470032d2ab7c32a6a3ae43a358e1a99656b
Commit: c7187470032d2ab7c32a6a3ae43a358e1a99656b
Parent: 0ffd512aea6ed74ed0127284d0112bcbffa33061
Author: Lon Hohberger <lhh at redhat.com>
AuthorDate: Tue Sep 14 10:10:05 2010 -0400
Committer: Lon Hohberger <lhh at redhat.com>
CommitterDate: Tue Feb 1 12:34:22 2011 -0500
rgmanager: clean up independent subtree restart handling
Resolves: rhbz#634277
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 30c7179..55cc146 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -509,9 +509,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);
@@ -521,11 +518,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;
}
@@ -1511,7 +1510,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);
@@ -1552,7 +1552,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);
@@ -1573,18 +1573,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) {
- logt_print(LOG_WARNING, "Failure to stop %s:%s"
+ logt_print(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;
}
}
@@ -1593,7 +1596,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;
@@ -1601,8 +1605,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 9328a88..babac7a 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -1248,17 +1248,20 @@ handle_started_status(const 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 {
logt_print(LOG_WARNING, "Inline recovery of %s failed\n",
svcName);
return ret;
}
- logt_print(LOG_NOTICE, "Inline recovery of %s succeeded\n",
+ logt_print(LOG_NOTICE, "Inline recovery of %s complete\n",
svcName);
if (ret & SFL_PARTIAL) {
logt_print(LOG_NOTICE, "Note: Some non-critical "
More information about the cluster-commits
mailing list