cluster: RHEL53 - rgmanager: Fix restart-after-migrate issue
Lon Hohberger
lon@fedoraproject.org
Thu Jun 11 20:28:00 GMT 2009
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=a5fb1d3e2b6178bf818e4a1246b0d9ad9ad8ffee
Commit: a5fb1d3e2b6178bf818e4a1246b0d9ad9ad8ffee
Parent: 45b4462cb12adb960f87cbc25cb0edad281bb7c7
Author: Lon Hohberger <lhh@redhat.com>
AuthorDate: Thu Jun 11 11:30:56 2009 -0400
Committer: Lon Hohberger <lhh@redhat.com>
CommitterDate: Thu Jun 11 16:26:48 2009 -0400
rgmanager: Fix restart-after-migrate issue
* Ensures we use RG_STATUS_INQUIRY when determining
if migration has completed,
* Ensures that subsequent RG_STATUS checks clear any
NEEDSTOP flags to reduce the risk of other (yet-unknown)
conditions causing erroneous restarts, and
* Fixes erroneous migration_mapping noise.
Resolves Red Hat Bugzilla #505340
Signed-off-by: Lon Hohberger <lhh@redhat.com>
---
rgmanager/src/daemons/restree.c | 13 ++++++++-----
rgmanager/src/daemons/rg_state.c | 16 ++++++++++++----
rgmanager/src/resources/vm.sh | 2 +-
3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c
index e88fbe2..505980d 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -1112,18 +1112,20 @@ _res_op_by_level(resource_node_t **tree, resource_t *first, void *ret,
void
-mark_nodes(resource_node_t *node, int state, int flags)
+mark_nodes(resource_node_t *node, int state, int setflags, int clearflags)
{
int x;
resource_node_t *child;
list_for(&node->rn_child, child, x) {
if (child->rn_child)
- mark_nodes(child->rn_child, state, flags);
+ mark_nodes(child->rn_child, state, setflags,
+ clearflags);
}
node->rn_state = state;
- node->rn_flags |= (RF_NEEDSTART | RF_NEEDSTOP);
+ node->rn_flags |= (setflags);
+ node->rn_flags &= ~(clearflags);
}
@@ -1381,7 +1383,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
node is independent or not.
*/
mark_nodes(node, RES_FAILED,
- RF_NEEDSTART | RF_NEEDSTOP);
+ RF_NEEDSTART | RF_NEEDSTOP, 0);
/* If we're an independent subtree, return a flag
stating that this section is recoverable apart
@@ -1394,6 +1396,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
return SFL_FAILURE;
}
+ mark_nodes(node, RES_STARTED, 0, RF_NEEDSTOP);
}
if (node->rn_child) {
@@ -1408,7 +1411,7 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree,
if (op == RS_STATUS && (rv & SFL_FAILURE) &&
(node->rn_flags & RF_INDEPENDENT)) {
mark_nodes(node, RES_FAILED,
- RF_NEEDSTART | RF_NEEDSTOP);
+ RF_NEEDSTART | RF_NEEDSTOP, 0);
rv = SFL_RECOVERABLE;
}
}
diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c
index 3b4df10..7229da0 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -1169,12 +1169,20 @@ svc_status(char *svcName)
/* Don't check status for anything not owned */
return 0;
- if (svcStatus.rs_state != RG_STATE_STARTED &&
- svcStatus.rs_state != RG_STATE_MIGRATE)
+ if (svcStatus.rs_state == RG_STATE_STARTED) {
+ /* Running locally and not migrating = normal status
+ * check
+ */
+ ret = group_op(svcName, RG_STATUS);
+ } else if (svcStatus.rs_state == RG_STATE_MIGRATE) {
+ /* Migrating resources need an inquiry check to avoid
+ * setting NEEDSTOP/NEEDSTART in the resource tree.
+ */
+ ret = group_op(svcName, RG_STATUS_INQUIRY);
+ } else {
/* Not-running RGs should not be checked either. */
return 0;
-
- ret = group_op(svcName, RG_STATUS);
+ }
/* For running services, if the return code is 0, we're done*/
if (svcStatus.rs_state == RG_STATE_STARTED)
diff --git a/rgmanager/src/resources/vm.sh b/rgmanager/src/resources/vm.sh
index c61ca7c..e726cea 100755
--- a/rgmanager/src/resources/vm.sh
+++ b/rgmanager/src/resources/vm.sh
@@ -134,7 +134,7 @@ meta_data()
<content type="integer"/>
</parameter>
- <parameter name="migration_mapping">
+ <parameter name="migration_mapping" reconfig="1">
<longdesc lang="en">
Mapping of the hostname of a target member to a different hostname
</longdesc>
More information about the Cluster-cvs
mailing list