From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19949 invoked by alias); 11 Jun 2009 20:28:11 -0000 Received: (qmail 19943 invoked by alias); 11 Jun 2009 20:28:11 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS X-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS X-Spam-Check-By: sourceware.org X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on bastion2.fedora.phx.redhat.com Subject: cluster: RHEL53 - rgmanager: Fix restart-after-migrate issue To: cluster-cvs-relay@redhat.com X-Project: Cluster Project X-Git-Module: cluster.git X-Git-Refname: refs/heads/RHEL53 X-Git-Reftype: branch X-Git-Oldrev: 45b4462cb12adb960f87cbc25cb0edad281bb7c7 X-Git-Newrev: a5fb1d3e2b6178bf818e4a1246b0d9ad9ad8ffee From: Lon Hohberger Message-Id: <20090611202751.2914D1201D7@lists.fedorahosted.org> Date: Thu, 11 Jun 2009 20:28:00 -0000 X-Scanned-By: MIMEDefang 2.58 on 172.16.52.254 Mailing-List: contact cluster-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cluster-cvs-owner@sourceware.org X-SW-Source: 2009-q2/txt/msg00509.txt.bz2 Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=a5fb1d3e2b6178bf818e4a1246b0d9ad9ad8ffee Commit: a5fb1d3e2b6178bf818e4a1246b0d9ad9ad8ffee Parent: 45b4462cb12adb960f87cbc25cb0edad281bb7c7 Author: Lon Hohberger AuthorDate: Thu Jun 11 11:30:56 2009 -0400 Committer: Lon Hohberger 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 --- 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() - + Mapping of the hostname of a target member to a different hostname