commit 7d47ad8be7a9c31a1eba2a3714a645ae3985fc37
Author: Andrew Beekhof <andrew@beekhof.net>
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! */