Blob Blame History Raw
commit fab09782a337c492c62028a519df25ee316abee2
Author: Andrew Beekhof <andrew@beekhof.net>
Date:   Wed Aug 7 10:33:04 2013 +1000

    Fix: PE: Correctly account for the location preferences of things colocated with a group

diff --git a/pengine/group.c b/pengine/group.c
index 823ea08..7e8e026 100644
--- a/pengine/group.c
+++ b/pengine/group.c
@@ -59,8 +59,8 @@ group_color(resource_t * rsc, node_t * prefer, pe_working_set_t * data_set)
         g_list_concat(group_data->first_child->rsc_cons, rsc->rsc_cons);
     rsc->rsc_cons = NULL;
 
-    group_data->first_child->rsc_cons_lhs =
-        g_list_concat(group_data->first_child->rsc_cons_lhs, rsc->rsc_cons_lhs);
+    group_data->last_child->rsc_cons_lhs =
+        g_list_concat(group_data->last_child->rsc_cons_lhs, rsc->rsc_cons_lhs);
     rsc->rsc_cons_lhs = NULL;
 
     dump_node_scores(show_scores ? 0 : scores_log_level, rsc, __PRETTY_FUNCTION__,
diff --git a/pengine/native.c b/pengine/native.c
index ef8ae0f..37f5211 100644
--- a/pengine/native.c
+++ b/pengine/native.c
@@ -364,6 +364,15 @@ rsc_merge_weights(resource_t * rsc, const char *rhs, GHashTable * nodes, const c
         }
         clear_bit(flags, pe_weights_init);
 
+    } else if (rsc->variant == pe_group && rsc->children) {
+        GListPtr iter = rsc->children;
+
+        pe_rsc_trace(rsc, "%s: Combining scores from %d children of %s", rhs, g_list_length(iter), rsc->id);
+        work = node_hash_dup(nodes);
+        for(iter = rsc->children; iter->next != NULL; iter = iter->next) {
+            work = rsc_merge_weights(iter->data, rhs, work, attr, factor, flags);
+        }
+
     } else {
         pe_rsc_trace(rsc, "%s: Combining scores from %s", rhs, rsc->id);
         work = node_hash_dup(nodes);
@@ -383,8 +392,22 @@ rsc_merge_weights(resource_t * rsc, const char *rhs, GHashTable * nodes, const c
 
         if (is_set(flags, pe_weights_forward)) {
             gIter = rsc->rsc_cons;
+            crm_trace("Checking %d additional colocation constraints", g_list_length(gIter));
+
+        } else if(rsc->variant == pe_group && rsc->children) {
+            GListPtr last = rsc->children;
+
+            while (last->next != NULL) {
+                last = last->next;
+            }
+
+            gIter = ((resource_t*)last->data)->rsc_cons_lhs;
+            crm_trace("Checking %d additional optional group colocation constraints from %s",
+                      g_list_length(gIter), ((resource_t*)last->data)->id);
+
         } else {
             gIter = rsc->rsc_cons_lhs;
+            crm_trace("Checking %d additional optional colocation constraints %s", g_list_length(gIter), rsc->id);
         }
 
         for (; gIter != NULL; gIter = gIter->next) {
diff --git a/pengine/test10/clone-anon-failcount.scores b/pengine/test10/clone-anon-failcount.scores
index fb98a30..012bfe9 100644
--- a/pengine/test10/clone-anon-failcount.scores
+++ b/pengine/test10/clone-anon-failcount.scores
@@ -298,7 +298,7 @@ native_color: clnUMdummy01:1 allocation score on srv04: -INFINITY
 native_color: clnUMdummy02:0 allocation score on srv01: -INFINITY
 native_color: clnUMdummy02:0 allocation score on srv02: -INFINITY
 native_color: clnUMdummy02:0 allocation score on srv03: -INFINITY
-native_color: clnUMdummy02:0 allocation score on srv04: 100
+native_color: clnUMdummy02:0 allocation score on srv04: 104
 native_color: clnUMdummy02:1 allocation score on srv01: -INFINITY
 native_color: clnUMdummy02:1 allocation score on srv02: -INFINITY
 native_color: clnUMdummy02:1 allocation score on srv03: -INFINITY