commit 7d47ad8be7a9c31a1eba2a3714a645ae3985fc37 Author: Andrew Beekhof Date: Fri Aug 9 15:00:40 2013 +1000 Bug cl#5171 - PE: Don't prevent clones from running due to dependant resources (cherry picked from commit 1c057f8808c71763134ae829851d2a2b3b604d07) diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h index a6b9369..7240106 100644 --- a/include/crm/pengine/internal.h +++ b/include/crm/pengine/internal.h @@ -129,6 +129,7 @@ pe_hash_table_lookup(GHashTable * hash, gconstpointer key) extern action_t *get_pseudo_op(const char *name, pe_working_set_t * data_set); extern gboolean order_actions(action_t * lh_action, action_t * rh_action, enum pe_ordering order); +GHashTable *node_hash_dup(GHashTable * hash); extern GListPtr node_list_and(GListPtr list1, GListPtr list2, gboolean filter); extern GListPtr node_list_xor(GListPtr list1, GListPtr list2, gboolean filter); diff --git a/pengine/clone.c b/pengine/clone.c index b15f76f..9113e9d 100644 --- a/pengine/clone.c +++ b/pengine/clone.c @@ -385,8 +385,9 @@ color_instance(resource_t * rsc, node_t * prefer, gboolean all_coloc, pe_working { node_t *chosen = NULL; node_t *local_node = NULL; + GHashTable *backup = NULL; - pe_rsc_trace(rsc, "Processing %s", rsc->id); + pe_rsc_trace(rsc, "Processing %s %d", rsc->id, all_coloc); if (is_not_set(rsc->flags, pe_rsc_provisional)) { return rsc->fns->location(rsc, NULL, FALSE); @@ -421,15 +422,19 @@ color_instance(resource_t * rsc, node_t * prefer, gboolean all_coloc, pe_working } } + backup = node_hash_dup(rsc->allowed_nodes); chosen = rsc->cmds->allocate(rsc, prefer, data_set); if (chosen) { local_node = pe_hash_table_lookup(rsc->parent->allowed_nodes, chosen->details->id); if (prefer && chosen && chosen->details != prefer->details) { - crm_err("Pre-allocation failed: got %s instead of %s", - chosen->details->uname, prefer->details->uname); + crm_notice("Pre-allocation failed: got %s instead of %s", + chosen->details->uname, prefer->details->uname); + g_hash_table_destroy(rsc->allowed_nodes); + rsc->allowed_nodes = backup; native_deallocate(rsc); chosen = NULL; + backup = NULL; } else if (local_node) { local_node->count++; @@ -442,6 +447,9 @@ color_instance(resource_t * rsc, node_t * prefer, gboolean all_coloc, pe_working } } + if(backup) { + g_hash_table_destroy(backup); + } return chosen; } @@ -587,7 +595,7 @@ clone_color(resource_t * rsc, node_t * prefer, pe_working_set_t * data_set) } } - pe_rsc_trace(rsc, "Done pre-allocating"); + pe_rsc_trace(rsc, "Done pre-allocating (%d of %d)", allocated, clone_data->clone_max); g_list_free(nodes); for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { diff --git a/pengine/native.c b/pengine/native.c index 21ad629..4016a3c 100644 --- a/pengine/native.c +++ b/pengine/native.c @@ -313,7 +313,7 @@ node_hash_update(GHashTable * list1, GHashTable * list2, const char *attr, float } } -static GHashTable * +GHashTable * node_hash_dup(GHashTable * hash) { /* Hack! */