Blame SOURCES/bz1078504-pcmk-pengine_fixes_invalid_transition_caused_by_clones_with_more_than_10_instances.patch

7100e8
commit ce507c2a598086b16bfbc1d937c656de4e73ffa6
7100e8
Author: David Vossel <dvossel@redhat.com>
7100e8
Date:   Wed Mar 19 21:43:43 2014 -0400
7100e8
7100e8
    Fix: pengine: fixes invalid transition caused by clones with more than 10 instances
7100e8
    
7100e8
    (cherry picked from commit 9e0b496b269ce0e792370e9c2b22446dfaf3e64a)
7100e8
7100e8
diff --git a/pengine/clone.c b/pengine/clone.c
7100e8
index 9113e9d..52a84df 100644
7100e8
--- a/pengine/clone.c
7100e8
+++ b/pengine/clone.c
7100e8
@@ -28,6 +28,18 @@
7100e8
 gint sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set);
7100e8
 static void append_parent_colocation(resource_t * rsc, resource_t * child, gboolean all);
7100e8
 
7100e8
+static gint
7100e8
+sort_rsc_id(gconstpointer a, gconstpointer b)
7100e8
+{
7100e8
+    const resource_t *resource1 = (const resource_t *)a;
7100e8
+    const resource_t *resource2 = (const resource_t *)b;
7100e8
+
7100e8
+    CRM_ASSERT(resource1 != NULL);
7100e8
+    CRM_ASSERT(resource2 != NULL);
7100e8
+
7100e8
+    return strcmp(resource1->id, resource2->id);
7100e8
+}
7100e8
+
7100e8
 static node_t *
7100e8
 parent_node_instance(const resource_t * rsc, node_t * node)
7100e8
 {
7100e8
@@ -749,7 +761,7 @@ child_ordering_constraints(resource_t * rsc, pe_working_set_t * data_set)
7100e8
     action_t *start = NULL;
7100e8
     action_t *last_stop = NULL;
7100e8
     action_t *last_start = NULL;
7100e8
-    GListPtr gIter = rsc->children;
7100e8
+    GListPtr gIter = NULL;
7100e8
     gboolean active_only = TRUE;        /* change to false to get the old behavior */
7100e8
     clone_variant_data_t *clone_data = NULL;
7100e8
 
7100e8
@@ -758,8 +770,10 @@ child_ordering_constraints(resource_t * rsc, pe_working_set_t * data_set)
7100e8
     if (clone_data->ordered == FALSE) {
7100e8
         return;
7100e8
     }
7100e8
+    /* we have to maintain a consistent sorted child list when building order constraints */
7100e8
+    rsc->children = g_list_sort(rsc->children, sort_rsc_id);
7100e8
 
7100e8
-    for (; gIter != NULL; gIter = gIter->next) {
7100e8
+    for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) {
7100e8
         resource_t *child = (resource_t *) gIter->data;
7100e8
 
7100e8
         key = stop_key(child);
7100e8
@@ -857,7 +871,7 @@ void
7100e8
 clone_internal_constraints(resource_t * rsc, pe_working_set_t * data_set)
7100e8
 {
7100e8
     resource_t *last_rsc = NULL;
7100e8
-    GListPtr gIter = rsc->children;
7100e8
+    GListPtr gIter;
7100e8
     clone_variant_data_t *clone_data = NULL;
7100e8
 
7100e8
     get_clone_variant_data(clone_data, rsc);
7100e8
@@ -872,7 +886,11 @@ clone_internal_constraints(resource_t * rsc, pe_working_set_t * data_set)
7100e8
         new_rsc_order(rsc, RSC_STARTED, rsc, RSC_PROMOTE, pe_order_runnable_left, data_set);
7100e8
     }
7100e8
 
7100e8
-    for (; gIter != NULL; gIter = gIter->next) {
7100e8
+    if (clone_data->ordered) {
7100e8
+        /* we have to maintain a consistent sorted child list when building order constraints */
7100e8
+        rsc->children = g_list_sort(rsc->children, sort_rsc_id);
7100e8
+    }
7100e8
+    for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) {
7100e8
         resource_t *child_rsc = (resource_t *) gIter->data;
7100e8
 
7100e8
         child_rsc->cmds->internal_constraints(child_rsc, data_set);
7100e8
@@ -1400,18 +1418,6 @@ clone_expand(resource_t * rsc, pe_working_set_t * data_set)
7100e8
     clone_data->promote_notify = NULL;
7100e8
 }
7100e8
 
7100e8
-static gint
7100e8
-sort_rsc_id(gconstpointer a, gconstpointer b)
7100e8
-{
7100e8
-    const resource_t *resource1 = (const resource_t *)a;
7100e8
-    const resource_t *resource2 = (const resource_t *)b;
7100e8
-
7100e8
-    CRM_ASSERT(resource1 != NULL);
7100e8
-    CRM_ASSERT(resource2 != NULL);
7100e8
-
7100e8
-    return strcmp(resource1->id, resource2->id);
7100e8
-}
7100e8
-
7100e8
 node_t *
7100e8
 rsc_known_on(resource_t * rsc, GListPtr * list)
7100e8
 {