commit 7d17d8ab2dd91bdcaf2dea199f2ef66b514daea0 Author: Andrew Beekhof Date: Wed Nov 6 14:15:24 2013 +1100 PE: Probe containers not expected to be up RHEL-Only work-around, fixing properly upstream diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h index 7240106..dd52e7f 100644 --- a/include/crm/pengine/internal.h +++ b/include/crm/pengine/internal.h @@ -262,4 +262,5 @@ op_digest_cache_t *rsc_action_digest_cmp(resource_t * rsc, xmlNode * xml_op, nod gboolean is_remote_node(xmlNode *xml); +resource_t * rsc_contains_remote_node(pe_working_set_t * data_set, resource_t *rsc); #endif diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h index 8eb4a1d..eb52464 100644 --- a/include/crm/pengine/status.h +++ b/include/crm/pengine/status.h @@ -183,6 +183,7 @@ struct node_s { # define pe_rsc_migrating 0x00400000ULL # define pe_rsc_failure_ignored 0x01000000ULL +# define pe_rsc_unexpectedly_running 0x02000000ULL # define pe_rsc_needs_quorum 0x10000000ULL # define pe_rsc_needs_fencing 0x20000000ULL diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c index 78ceb85..56ed291 100644 --- a/lib/pengine/unpack.c +++ b/lib/pengine/unpack.c @@ -2014,6 +2014,9 @@ unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * d { xmlNode *rsc_entry = NULL; gboolean found_orphaned_container_filler = FALSE; + GListPtr unexpected_containers = NULL; + GListPtr gIter = NULL; + resource_t *remote = NULL; CRM_CHECK(node != NULL, return FALSE); @@ -2025,9 +2028,29 @@ unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * d if (crm_str_eq((const char *)rsc_entry->name, XML_LRM_TAG_RESOURCE, TRUE)) { resource_t *rsc; rsc = unpack_lrm_rsc_state(node, rsc_entry, data_set); - if (rsc && is_set(rsc->flags, pe_rsc_orphan_container_filler)) { + if (!rsc) { + continue; + } + if (is_set(rsc->flags, pe_rsc_orphan_container_filler)) { found_orphaned_container_filler = TRUE; } + if (is_set(rsc->flags, pe_rsc_unexpectedly_running)) { + remote = rsc_contains_remote_node(data_set, rsc); + if (remote) { + unexpected_containers = g_list_append(unexpected_containers, remote); + } + } + } + } + + /* If a container resource is unexpectedly up... and the remote-node + * connection resource for that container is not up, the entire container + * must be recovered. */ + for (gIter = unexpected_containers; gIter != NULL; gIter = gIter->next) { + remote = (resource_t *) gIter->data; + if (remote->role != RSC_ROLE_STARTED) { + crm_warn("Recovering container resource %s. Resource is unexpectedly running and involves a remote-node."); + set_bit(remote->container->flags, pe_rsc_failed); } } @@ -2037,7 +2060,7 @@ unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * d if (found_orphaned_container_filler) { handle_orphaned_container_fillers(lrm_rsc_list, data_set); } - + g_list_free(unexpected_containers); return TRUE; } @@ -2366,6 +2389,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, case PCMK_OCF_OK: if (is_probe && target_rc == 7) { task_status_i = PCMK_LRM_OP_DONE; + set_bit(rsc->flags, pe_rsc_unexpectedly_running); pe_rsc_info(rsc, "Operation %s found resource %s active on %s", task, rsc->id, node->details->uname); diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c index 1e3877d..e9997a2 100644 --- a/lib/pengine/utils.c +++ b/lib/pengine/utils.c @@ -1776,3 +1776,24 @@ const char *rsc_printable_id(resource_t *rsc) } return rsc->id; } + +resource_t * +rsc_contains_remote_node(pe_working_set_t * data_set, resource_t *rsc) +{ + if (is_set(data_set->flags, pe_flag_have_remote_nodes) == FALSE) { + return FALSE; + } + + if (rsc->fillers) { + GListPtr gIter = NULL; + for (gIter = rsc->fillers; gIter != NULL; gIter = gIter->next) { + resource_t *filler = (resource_t *) gIter->data; + + if (filler->is_remote_node) { + return filler; + } + } + } + return NULL; +} +