Blob Blame History Raw
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! */