|
|
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 |
{
|