From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27071 invoked by alias); 22 Jun 2009 16:53:56 -0000 Received: (qmail 27065 invoked by alias); 22 Jun 2009 16:53:56 -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: rgmanager: master - rgmanager: Fix restart-after-migrate issue To: cluster-cvs-relay@redhat.com X-Project: Cluster Project X-Git-Module: rgmanager.git X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: f6b0f97da4ea4374f0e0b7e2f7a42d99af6371b5 X-Git-Newrev: b05f0232be04683e6ac13f2ef0e40e01b7e76695 From: Lon Hohberger Message-Id: <20090622165327.00E2112020D@lists.fedorahosted.org> Date: Mon, 22 Jun 2009 16:54: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/msg00626.txt.bz2 Gitweb: http://git.fedorahosted.org/git/rgmanager.git?p=rgmanager.git;a=commitdiff;h=b05f0232be04683e6ac13f2ef0e40e01b7e76695 Commit: b05f0232be04683e6ac13f2ef0e40e01b7e76695 Parent: f6b0f97da4ea4374f0e0b7e2f7a42d99af6371b5 Author: Lon Hohberger AuthorDate: Thu Jun 11 11:30:56 2009 -0400 Committer: Lon Hohberger CommitterDate: Mon Jun 22 12:47:26 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 Resolves Red Hat Bugzilla #505340 Signed-off-by: Lon Hohberger --- rgmanager/src/daemons/restree.c | 13 ++++++++----- rgmanager/src/daemons/rg_state.c | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c index 5ab4b3d..8575d16 100644 --- a/rgmanager/src/daemons/restree.c +++ b/rgmanager/src/daemons/restree.c @@ -1083,18 +1083,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); } @@ -1356,7 +1358,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 @@ -1369,6 +1371,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) { @@ -1383,7 +1386,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 4808ddf..cddbaa6 100644 --- a/rgmanager/src/daemons/rg_state.c +++ b/rgmanager/src/daemons/rg_state.c @@ -1157,12 +1157,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)