Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F2823019
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
114 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/pengine/clone.c b/pengine/clone.c
index b7295beaa2..a5b5fcca0d 100644
--- a/pengine/clone.c
+++ b/pengine/clone.c
@@ -1,1346 +1,1373 @@
/*
* Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <crm_internal.h>
#include <crm/msg_xml.h>
#include <allocate.h>
#include <utils.h>
#include <lib/crm/pengine/utils.h>
#define VARIANT_CLONE 1
#include <lib/crm/pengine/variant.h>
gint sort_clone_instance(gconstpointer a, gconstpointer b);
resource_t *find_compatible_child(
resource_t *local_child, resource_t *rsc, enum rsc_role_e filter);
void clone_create_notifications(
resource_t *rsc, action_t *action, action_t *action_complete,
pe_working_set_t *data_set);
void child_stopping_constraints(
clone_variant_data_t *clone_data,
resource_t *self, resource_t *child, resource_t *last,
pe_working_set_t *data_set);
void child_starting_constraints(
clone_variant_data_t *clone_data,
resource_t *self, resource_t *child, resource_t *last,
pe_working_set_t *data_set);
static node_t *
parent_node_instance(const resource_t *rsc, node_t *node)
{
node_t *ret = NULL;
if(node != NULL) {
ret = pe_find_node_id(
rsc->parent->allowed_nodes, node->details->id);
}
return ret;
}
static gboolean did_fail(const resource_t *rsc)
{
if(is_set(rsc->flags, pe_rsc_failed)) {
return TRUE;
}
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
if(did_fail(child_rsc)) {
return TRUE;
}
);
return FALSE;
}
gint sort_clone_instance(gconstpointer a, gconstpointer b)
{
int level = LOG_DEBUG_3;
node_t *node1 = NULL;
node_t *node2 = NULL;
gboolean can1 = TRUE;
gboolean can2 = TRUE;
const resource_t *resource1 = (const resource_t*)a;
const resource_t *resource2 = (const resource_t*)b;
CRM_ASSERT(resource1 != NULL);
CRM_ASSERT(resource2 != NULL);
/* allocation order:
* - active instances
* - instances running on nodes with the least copies
* - active instances on nodes that cant support them or are to be fenced
* - failed instances
* - inactive instances
*/
do_crm_log(level+1, "%s ? %s", resource1->id, resource2->id);
if(resource1->running_on && resource2->running_on) {
if(g_list_length(resource1->running_on) < g_list_length(resource2->running_on)) {
do_crm_log(level, "%s < %s: running_on", resource1->id, resource2->id);
return -1;
} else if(g_list_length(resource1->running_on) > g_list_length(resource2->running_on)) {
do_crm_log(level, "%s > %s: running_on", resource1->id, resource2->id);
return 1;
}
}
if(resource1->running_on) {
node1 = resource1->running_on->data;
}
if(resource2->running_on) {
node2 = resource2->running_on->data;
}
+ if(node1) {
+ node_t *match = pe_find_node_id(resource1->allowed_nodes, node1->details->id);
+ if(match->weight < 0) {
+ do_crm_log(level, "%s: current location is unavailable", resource1->id);
+ node1 = NULL;
+ can1 = FALSE;
+ }
+ }
+
+ if(node2) {
+ node_t *match = pe_find_node_id(resource2->allowed_nodes, node2->details->id);
+ if(match->weight < 0) {
+ do_crm_log(level, "%s: current location is unavailable", resource2->id);
+ node2 = NULL;
+ can2 = FALSE;
+ }
+ }
+
+ if(can1 != can2) {
+ if(can1) {
+ do_crm_log(level, "%s < %s: availability of current location", resource1->id, resource2->id);
+ return -1;
+ }
+ do_crm_log(level, "%s > %s: availability of current location", resource1->id, resource2->id);
+ return 1;
+ }
+
if(resource1->priority < resource2->priority) {
- do_crm_log(level, "%s < %s: score", resource1->id, resource2->id);
+ do_crm_log(level, "%s < %s: priority", resource1->id, resource2->id);
return 1;
} else if(resource1->priority > resource2->priority) {
- do_crm_log(level, "%s > %s: score", resource1->id, resource2->id);
+ do_crm_log(level, "%s > %s: priority", resource1->id, resource2->id);
return -1;
}
if(node1 == NULL && node2 == NULL) {
do_crm_log(level, "%s == %s: not active",
resource1->id, resource2->id);
return 0;
}
if(node1 != node2) {
if(node1 == NULL) {
do_crm_log(level, "%s > %s: active", resource1->id, resource2->id);
return 1;
} else if(node2 == NULL) {
do_crm_log(level, "%s < %s: active", resource1->id, resource2->id);
return -1;
}
}
can1 = can_run_resources(node1);
can2 = can_run_resources(node2);
if(can1 != can2) {
if(can1) {
do_crm_log(level, "%s < %s: can", resource1->id, resource2->id);
return -1;
}
do_crm_log(level, "%s > %s: can", resource1->id, resource2->id);
return 1;
}
node1 = parent_node_instance(resource1, node1);
node2 = parent_node_instance(resource2, node2);
if(node1 != NULL && node2 == NULL) {
do_crm_log(level, "%s < %s: not allowed", resource1->id, resource2->id);
return -1;
} else if(node1 == NULL && node2 != NULL) {
do_crm_log(level, "%s > %s: not allowed", resource1->id, resource2->id);
return 1;
}
if(node1 == NULL) {
do_crm_log(level, "%s == %s: not allowed", resource1->id, resource2->id);
return 0;
}
if(node1->count < node2->count) {
do_crm_log(level, "%s < %s: count", resource1->id, resource2->id);
return -1;
} else if(node1->count > node2->count) {
do_crm_log(level, "%s > %s: count", resource1->id, resource2->id);
return 1;
}
if(node1->weight < node2->weight) {
do_crm_log(level, "%s < %s: node score", resource1->id, resource2->id);
return 1;
} else if(node1->weight > node2->weight) {
do_crm_log(level, "%s > %s: node score", resource1->id, resource2->id);
return -1;
}
can1 = did_fail(resource1);
can2 = did_fail(resource2);
if(can1 != can2) {
if(can1) {
do_crm_log(level, "%s > %s: failed", resource1->id, resource2->id);
return 1;
}
do_crm_log(level, "%s < %s: failed", resource1->id, resource2->id);
return -1;
}
do_crm_log(level, "%s == %s: default %d", resource1->id, resource2->id, node2->weight);
return 0;
}
static node_t *
can_run_instance(resource_t *rsc, node_t *node)
{
node_t *local_node = NULL;
clone_variant_data_t *clone_data = NULL;
if(can_run_resources(node) == FALSE) {
goto bail;
}
local_node = parent_node_instance(rsc, node);
get_clone_variant_data(clone_data, rsc->parent);
if(local_node == NULL) {
crm_warn("%s cannot run on %s: node not allowed",
rsc->id, node->details->uname);
goto bail;
} else if(local_node->count < clone_data->clone_node_max) {
return local_node;
} else {
crm_debug_2("%s cannot run on %s: node full",
rsc->id, node->details->uname);
}
bail:
if(node) {
common_update_score(rsc, node->details->id, -INFINITY);
}
return NULL;
}
static node_t *
color_instance(resource_t *rsc, pe_working_set_t *data_set)
{
node_t *chosen = NULL;
node_t *local_node = NULL;
crm_debug_2("Processing %s", rsc->id);
if(is_not_set(rsc->flags, pe_rsc_provisional)) {
return rsc->fns->location(rsc, NULL, FALSE);
} else if(is_set(rsc->flags, pe_rsc_allocating)) {
crm_debug("Dependancy loop detected involving %s", rsc->id);
return NULL;
}
if(rsc->allowed_nodes) {
slist_iter(try_node, node_t, rsc->allowed_nodes, lpc,
can_run_instance(rsc, try_node);
);
}
chosen = rsc->cmds->color(rsc, data_set);
if(chosen) {
local_node = pe_find_node_id(
rsc->parent->allowed_nodes, chosen->details->id);
if(local_node) {
local_node->count++;
} else if(is_set(rsc->flags, pe_rsc_managed)) {
/* what to do? we can't enforce per-node limits in this case */
crm_config_err("%s not found in %s (list=%d)",
chosen->details->id, rsc->parent->id,
g_list_length(rsc->parent->allowed_nodes));
}
}
return chosen;
}
static void append_parent_colocation(resource_t *rsc, resource_t *child)
{
slist_iter(cons, rsc_colocation_t, rsc->rsc_cons, lpc,
child->rsc_cons = g_list_append(child->rsc_cons, cons));
slist_iter(cons, rsc_colocation_t, rsc->rsc_cons_lhs, lpc,
child->rsc_cons_lhs = g_list_append(child->rsc_cons_lhs, cons));
}
node_t *
clone_color(resource_t *rsc, pe_working_set_t *data_set)
{
int allocated = 0;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
if(is_not_set(rsc->flags, pe_rsc_provisional)) {
return NULL;
} else if(is_set(rsc->flags, pe_rsc_allocating)) {
crm_debug("Dependancy loop detected involving %s", rsc->id);
return NULL;
}
set_bit(rsc->flags, pe_rsc_allocating);
crm_debug_2("Processing %s", rsc->id);
/* this information is used by sort_clone_instance() when deciding in which
* order to allocate clone instances
*/
slist_iter(
constraint, rsc_colocation_t, rsc->rsc_cons_lhs, lpc,
rsc->allowed_nodes = constraint->rsc_lh->cmds->merge_weights(
constraint->rsc_lh, rsc->id, rsc->allowed_nodes,
constraint->score/INFINITY, TRUE);
);
dump_node_scores(LOG_DEBUG_2, rsc, __FUNCTION__, rsc->allowed_nodes);
/* count now tracks the number of clones currently allocated */
slist_iter(node, node_t, rsc->allowed_nodes, lpc,
node->count = 0;
);
slist_iter(child, resource_t, rsc->children, lpc,
if(g_list_length(child->running_on) > 0) {
node_t *child_node = child->running_on->data;
node_t *local_node = parent_node_instance(
child, child->running_on->data);
if(local_node) {
local_node->count++;
} else {
crm_err("%s is running on %s which isn't allowed",
child->id, child_node->details->uname);
}
}
);
rsc->children = g_list_sort(rsc->children, sort_clone_instance);
/* count now tracks the number of clones we have allocated */
slist_iter(node, node_t, rsc->allowed_nodes, lpc,
node->count = 0;
);
rsc->allowed_nodes = g_list_sort(
rsc->allowed_nodes, sort_node_weight);
slist_iter(child, resource_t, rsc->children, lpc,
if(allocated >= clone_data->clone_max) {
crm_debug("Child %s not allocated - limit reached", child->id);
resource_location(child, NULL, -INFINITY, "clone_color:limit_reached", data_set);
} else {
append_parent_colocation(rsc, child);
}
if(color_instance(child, data_set)) {
allocated++;
}
);
crm_debug("Allocated %d %s instances of a possible %d",
allocated, rsc->id, clone_data->clone_max);
clear_bit(rsc->flags, pe_rsc_provisional);
clear_bit(rsc->flags, pe_rsc_allocating);
return NULL;
}
static void
clone_update_pseudo_status(
resource_t *child, gboolean *stopping, gboolean *starting)
{
CRM_ASSERT(stopping != NULL);
CRM_ASSERT(starting != NULL);
slist_iter(
action, action_t, child->actions, lpc,
if(*starting && *stopping) {
return;
} else if(action->optional) {
crm_debug_3("Skipping optional: %s", action->uuid);
continue;
} else if(action->pseudo == FALSE && action->runnable == FALSE){
crm_debug_3("Skipping unrunnable: %s", action->uuid);
continue;
} else if(safe_str_eq(CRMD_ACTION_STOP, action->task)) {
crm_debug_2("Stopping due to: %s", action->uuid);
*stopping = TRUE;
} else if(safe_str_eq(CRMD_ACTION_START, action->task)) {
if(action->runnable == FALSE) {
crm_debug_3("Skipping pseudo-op: %s run=%d, pseudo=%d",
action->uuid, action->runnable, action->pseudo);
} else {
crm_debug_2("Starting due to: %s", action->uuid);
crm_debug_3("%s run=%d, pseudo=%d",
action->uuid, action->runnable, action->pseudo);
*starting = TRUE;
}
}
);
}
void clone_create_actions(resource_t *rsc, pe_working_set_t *data_set)
{
gboolean child_starting = FALSE;
gboolean child_stopping = FALSE;
action_t *stop = NULL;
action_t *start = NULL;
action_t *action_complete = NULL;
resource_t *last_start_rsc = NULL;
resource_t *last_stop_rsc = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
crm_debug_2("Creating actions for %s", rsc->id);
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
child_rsc->cmds->create_actions(child_rsc, data_set);
clone_update_pseudo_status(
child_rsc, &child_stopping, &child_starting);
if(is_set(child_rsc->flags, pe_rsc_starting)) {
last_start_rsc = child_rsc;
}
if(is_set(child_rsc->flags, pe_rsc_stopping)) {
last_stop_rsc = child_rsc;
}
);
/* start */
start = start_action(rsc, NULL, !child_starting);
action_complete = custom_action(
rsc, started_key(rsc),
CRMD_ACTION_STARTED, NULL, !child_starting, TRUE, data_set);
start->pseudo = TRUE;
start->runnable = TRUE;
action_complete->pseudo = TRUE;
action_complete->runnable = TRUE;
action_complete->priority = INFINITY;
/* crm_err("Upgrading priority for %s to INFINITY", action_complete->uuid); */
child_starting_constraints(clone_data, rsc, NULL, last_start_rsc, data_set);
clone_create_notifications(
rsc, start, action_complete, data_set);
/* stop */
stop = stop_action(rsc, NULL, !child_stopping);
action_complete = custom_action(
rsc, stopped_key(rsc),
CRMD_ACTION_STOPPED, NULL, !child_stopping, TRUE, data_set);
stop->pseudo = TRUE;
stop->runnable = TRUE;
action_complete->pseudo = TRUE;
action_complete->runnable = TRUE;
action_complete->priority = INFINITY;
/* crm_err("Upgrading priority for %s to INFINITY", action_complete->uuid); */
child_stopping_constraints(clone_data, rsc, NULL, last_stop_rsc, data_set);
clone_create_notifications(rsc, stop, action_complete, data_set);
rsc->actions = rsc->actions;
if(stop->post_notified != NULL && start->pre_notify != NULL) {
order_actions(stop->post_notified, start->pre_notify, pe_order_optional);
}
}
void
clone_create_notifications(
resource_t *rsc, action_t *action, action_t *action_complete,
pe_working_set_t *data_set)
{
/*
* pre_notify -> pre_notify_complete -> pseudo_action
* -> (real actions) -> pseudo_action_complete
* -> post_notify -> post_notify_complete
*
* if the pre_noitfy requires confirmation,
* then a list of confirmations will be added as triggers
* to pseudo_action in clone_expand()
*/
action_t *notify = NULL;
action_t *notify_complete = NULL;
enum action_tasks task;
char *notify_key = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
if(is_not_set(rsc->flags, pe_rsc_notify)) {
return;
}
task = text2task(action->task);
/* create pre_notify */
notify_key = generate_notify_key(
rsc->id, "pre", action->task);
notify = custom_action(rsc, notify_key,
CRMD_ACTION_NOTIFY, NULL,
action->optional, TRUE, data_set);
add_hash_param(notify->meta, "notify_type", "pre");
add_hash_param(notify->meta, "notify_operation", action->task);
if(clone_data->notify_confirm) {
add_hash_param(notify->meta, "notify_confirm", "yes");
} else {
add_hash_param(notify->meta, "notify_confirm", "no");
}
/* create pre_notify_complete */
notify_key = generate_notify_key(
rsc->id, "confirmed-pre", action->task);
notify_complete = custom_action(rsc, notify_key,
CRMD_ACTION_NOTIFIED, NULL,
action->optional, TRUE, data_set);
add_hash_param(notify_complete->meta, "notify_type", "pre");
add_hash_param(notify_complete->meta, "notify_operation", action->task);
if(clone_data->notify_confirm) {
add_hash_param(notify->meta, "notify_confirm", "yes");
} else {
add_hash_param(notify->meta, "notify_confirm", "no");
}
notify->pseudo = TRUE;
notify->runnable = TRUE;
notify_complete->pseudo = TRUE;
notify_complete->runnable = TRUE;
/* pre_notify before pre_notify_complete */
custom_action_order(
rsc, NULL, notify,
rsc, NULL, notify_complete,
pe_order_implies_left, data_set);
/* pre_notify_complete before action */
custom_action_order(
rsc, NULL, notify_complete,
rsc, NULL, action,
pe_order_implies_left, data_set);
action->pre_notify = notify;
action->pre_notified = notify_complete;
/* create post_notify */
notify_key = generate_notify_key
(rsc->id, "post", action->task);
notify = custom_action(rsc, notify_key,
CRMD_ACTION_NOTIFY, NULL,
action_complete->optional, TRUE, data_set);
add_hash_param(notify->meta, "notify_type", "post");
add_hash_param(notify->meta, "notify_operation", action->task);
if(clone_data->notify_confirm) {
add_hash_param(notify->meta, "notify_confirm", "yes");
} else {
add_hash_param(notify->meta, "notify_confirm", "no");
}
/* action_complete before post_notify */
custom_action_order(
rsc, NULL, action_complete,
rsc, NULL, notify,
pe_order_implies_right, data_set);
/* create post_notify_complete */
notify_key = generate_notify_key(
rsc->id, "confirmed-post", action->task);
notify_complete = custom_action(rsc, notify_key,
CRMD_ACTION_NOTIFIED, NULL,
action->optional, TRUE, data_set);
add_hash_param(notify_complete->meta, "notify_type", "pre");
add_hash_param(notify_complete->meta, "notify_operation", action->task);
if(clone_data->notify_confirm) {
add_hash_param(notify->meta, "notify_confirm", "yes");
} else {
add_hash_param(notify->meta, "notify_confirm", "no");
}
notify->pseudo = TRUE;
notify->runnable = TRUE;
notify->priority = INFINITY;
notify->runnable = action_complete->runnable;
notify_complete->pseudo = TRUE;
notify_complete->runnable = TRUE;
notify_complete->priority = INFINITY;
notify_complete->runnable = action_complete->runnable;
/* post_notify before post_notify_complete */
custom_action_order(
rsc, NULL, notify,
rsc, NULL, notify_complete,
pe_order_implies_left, data_set);
action->post_notify = notify;
action->post_notified = notify_complete;
if(safe_str_eq(action->task, CRMD_ACTION_STOP)) {
/* post_notify_complete before start */
custom_action_order(
rsc, NULL, notify_complete,
rsc, start_key(rsc), NULL,
pe_order_optional, data_set);
} else if(safe_str_eq(action->task, CRMD_ACTION_START)) {
/* post_notify_complete before promote */
custom_action_order(
rsc, NULL, notify_complete,
rsc, promote_key(rsc), NULL,
pe_order_optional, data_set);
} else if(safe_str_eq(action->task, CRMD_ACTION_DEMOTE)) {
/* post_notify_complete before promote */
custom_action_order(
rsc, NULL, notify_complete,
rsc, stop_key(rsc), NULL,
pe_order_optional, data_set);
}
}
void
child_starting_constraints(
clone_variant_data_t *clone_data,
resource_t *rsc, resource_t *child, resource_t *last,
pe_working_set_t *data_set)
{
if(child == NULL && last == NULL) {
crm_debug("%s has no active children", rsc->id);
return;
}
if(child != NULL) {
order_start_start(rsc, child, pe_order_runnable_left);
custom_action_order(
child, start_key(child), NULL,
rsc, started_key(rsc), NULL,
pe_order_optional, data_set);
}
if(clone_data->ordered) {
if(child == NULL) {
/* last child start before global started */
custom_action_order(
last, start_key(last), NULL,
rsc, started_key(rsc), NULL,
pe_order_runnable_left, data_set);
} else if(last == NULL) {
/* global start before first child start */
order_start_start(
rsc, child, pe_order_implies_left);
} else {
/* child/child relative start */
order_start_start(last, child, pe_order_implies_left);
}
}
}
void
child_stopping_constraints(
clone_variant_data_t *clone_data,
resource_t *rsc, resource_t *child, resource_t *last,
pe_working_set_t *data_set)
{
if(child == NULL && last == NULL) {
crm_debug("%s has no active children", rsc->id);
return;
}
if(child != NULL) {
order_stop_stop(rsc, child, pe_order_shutdown);
custom_action_order(
child, stop_key(child), NULL,
rsc, stopped_key(rsc), NULL,
pe_order_optional, data_set);
}
if(clone_data->ordered) {
if(last == NULL) {
/* first child stop before global stopped */
custom_action_order(
child, stop_key(child), NULL,
rsc, stopped_key(rsc), NULL,
pe_order_runnable_left, data_set);
} else if(child == NULL) {
/* global stop before last child stop */
order_stop_stop(
rsc, last, pe_order_implies_left);
} else {
/* child/child relative stop */
order_stop_stop(child, last, pe_order_implies_left);
}
}
}
void
clone_internal_constraints(resource_t *rsc, pe_working_set_t *data_set)
{
resource_t *last_rsc = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
native_internal_constraints(rsc, data_set);
/* global stop before stopped */
custom_action_order(
rsc, stop_key(rsc), NULL,
rsc, stopped_key(rsc), NULL,
pe_order_runnable_left, data_set);
/* global start before started */
custom_action_order(
rsc, start_key(rsc), NULL,
rsc, started_key(rsc), NULL,
pe_order_runnable_left, data_set);
/* global stopped before start */
custom_action_order(
rsc, stopped_key(rsc), NULL,
rsc, start_key(rsc), NULL,
pe_order_optional, data_set);
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
child_rsc->cmds->internal_constraints(child_rsc, data_set);
child_starting_constraints(
clone_data, rsc, child_rsc, last_rsc, data_set);
child_stopping_constraints(
clone_data, rsc, child_rsc, last_rsc, data_set);
last_rsc = child_rsc;
);
}
resource_t*
find_compatible_child(
resource_t *local_child, resource_t *rsc, enum rsc_role_e filter)
{
node_t *local_node = NULL;
node_t *node = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
local_node = local_child->fns->location(local_child, NULL, FALSE);
if(local_node == NULL) {
crm_debug("Can't colocate unrunnable child %s with %s",
local_child->id, rsc->id);
return NULL;
}
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, FALSE);
node = child_rsc->fns->location(child_rsc, NULL, FALSE);
if(filter != RSC_ROLE_UNKNOWN && next_role != filter) {
crm_debug_2("Filtered %s", child_rsc->id);
continue;
}
if(node->details == local_node->details) {
crm_info("Colocating %s with %s on %s",
local_child->id, child_rsc->id, node->details->uname);
return child_rsc;
}
);
crm_debug("Can't colocate child %s with %s",
local_child->id, rsc->id);
return NULL;
}
void clone_rsc_colocation_lh(
resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint)
{
gboolean do_interleave = FALSE;
resource_t *rsc = constraint->rsc_lh;
clone_variant_data_t *clone_data = NULL;
clone_variant_data_t *clone_data_rh = NULL;
if(rsc == NULL) {
pe_err("rsc_lh was NULL for %s", constraint->id);
return;
} else if(constraint->rsc_rh == NULL) {
pe_err("rsc_rh was NULL for %s", constraint->id);
return;
} else {
crm_debug_4("Processing constraints from %s", rsc->id);
}
get_clone_variant_data(clone_data, rsc);
if(constraint->rsc_rh->variant == pe_clone
|| constraint->rsc_rh->variant == pe_master) {
get_clone_variant_data(
clone_data_rh, constraint->rsc_rh);
if(clone_data->clone_node_max
!= clone_data_rh->clone_node_max) {
crm_config_err("Cannot interleave "XML_CIB_TAG_INCARNATION
" %s and %s because"
" they do not support the same number of"
" resources per node",
constraint->rsc_lh->id, constraint->rsc_rh->id);
/* only the LHS side needs to be labeled as interleave */
} else if(clone_data->interleave) {
do_interleave = TRUE;
} else if(constraint->score >= INFINITY) {
GListPtr lhs = NULL, rhs = NULL;
lhs = rsc_lh->allowed_nodes;
slist_iter(
child_rsc, resource_t, rsc_rh->children, lpc,
node_t *chosen = child_rsc->fns->location(child_rsc, NULL, FALSE);
if(chosen != NULL) {
rhs = g_list_append(rhs, chosen);
}
);
rsc_lh->allowed_nodes = node_list_and(lhs, rhs, FALSE);
pe_free_shallow_adv(rhs, FALSE);
pe_free_shallow(lhs);
return;
}
} else if(constraint->score >= INFINITY) {
crm_config_err("Manditory co-location of clones (%s) with other"
" non-clone (%s) resources is not supported",
rsc_lh->id, rsc_rh->id);
return;
}
if(do_interleave) {
resource_t *rh_child = NULL;
slist_iter(lh_child, resource_t, rsc->children, lpc,
CRM_ASSERT(lh_child != NULL);
rh_child = find_compatible_child(
lh_child, rsc_rh, RSC_ROLE_UNKNOWN);
if(rh_child == NULL) {
continue;
}
lh_child->cmds->rsc_colocation_lh(
lh_child, rh_child, constraint);
);
return;
}
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
child_rsc->cmds->rsc_colocation_lh(child_rsc, constraint->rsc_rh, constraint);
);
}
void clone_rsc_colocation_rh(
resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint)
{
clone_variant_data_t *clone_data = NULL;
CRM_CHECK(rsc_lh != NULL, return);
CRM_CHECK(rsc_lh->variant == pe_native, return);
get_clone_variant_data(clone_data, rsc_rh);
crm_debug_3("Processing constraint %s: %d", constraint->id, constraint->score);
if(rsc_rh == NULL) {
pe_err("rsc_rh was NULL for %s", constraint->id);
return;
} else if(is_set(rsc_rh->flags, pe_rsc_provisional)) {
crm_debug_3("%s is still provisional", rsc_rh->id);
return;
} else if(constraint->score >= INFINITY) {
GListPtr lhs = NULL, rhs = NULL;
lhs = rsc_lh->allowed_nodes;
slist_iter(
child_rsc, resource_t, rsc_rh->children, lpc,
node_t *chosen = child_rsc->fns->location(child_rsc, NULL, FALSE);
if(chosen != NULL) {
rhs = g_list_append(rhs, chosen);
}
);
rsc_lh->allowed_nodes = node_list_and(lhs, rhs, FALSE);
pe_free_shallow_adv(rhs, FALSE);
pe_free_shallow(lhs);
return;
}
slist_iter(
child_rsc, resource_t, rsc_rh->children, lpc,
child_rsc->cmds->rsc_colocation_rh(rsc_lh, child_rsc, constraint);
);
}
void clone_rsc_order_lh(resource_t *rsc, order_constraint_t *order, pe_working_set_t *data_set)
{
resource_t *r1 = NULL;
resource_t *r2 = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
crm_debug_2("%s->%s", order->lh_action_task, order->rh_action_task);
r1 = uber_parent(rsc);
r2 = uber_parent(order->rh_rsc);
if(r1 == r2) {
native_rsc_order_lh(rsc, order, data_set);
return;
}
#if 0
if(order->type != pe_order_optional) {
crm_debug("Upgraded ordering constraint %d - 0x%.6x", order->id, order->type);
native_rsc_order_lh(rsc, order, data_set);
}
#endif
if(order->type & pe_order_implies_left) {
if(rsc->variant == order->rh_rsc->variant) {
crm_debug_2("Clone-to-clone ordering: %s -> %s 0x%.6x",
order->lh_action_task, order->rh_action_task, order->type);
/* stop instances on the same nodes as stopping RHS instances */
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
native_rsc_order_lh(child_rsc, order, data_set);
);
} else {
/* stop everything */
crm_debug_2("Clone-to-* ordering: %s -> %s 0x%.6x",
order->lh_action_task, order->rh_action_task, order->type);
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
native_rsc_order_lh(child_rsc, order, data_set);
);
}
}
convert_non_atomic_task(rsc, order);
native_rsc_order_lh(rsc, order, data_set);
}
void clone_rsc_order_rh(
action_t *lh_action, resource_t *rsc, order_constraint_t *order)
{
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
crm_debug_2("%s->%s", lh_action->uuid, order->rh_action_task);
native_rsc_order_rh(lh_action, rsc, order);
}
void clone_rsc_location(resource_t *rsc, rsc_to_node_t *constraint)
{
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
crm_debug_3("Processing location constraint %s for %s",
constraint->id, rsc->id);
native_rsc_location(rsc, constraint);
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
child_rsc->cmds->rsc_location(child_rsc, constraint);
);
}
static gint
sort_notify_entries(gconstpointer a, gconstpointer b)
{
int tmp;
const notify_entry_t *entry_a = a;
const notify_entry_t *entry_b = b;
if(entry_a == NULL && entry_b == NULL) { return 0; }
if(entry_a == NULL) { return 1; }
if(entry_b == NULL) { return -1; }
if(entry_a->rsc == NULL && entry_b->rsc == NULL) { return 0; }
if(entry_a->rsc == NULL) { return 1; }
if(entry_b->rsc == NULL) { return -1; }
tmp = strcmp(entry_a->rsc->id, entry_b->rsc->id);
if(tmp != 0) {
return tmp;
}
if(entry_a->node == NULL && entry_b->node == NULL) { return 0; }
if(entry_a->node == NULL) { return 1; }
if(entry_b->node == NULL) { return -1; }
return strcmp(entry_a->node->details->id, entry_b->node->details->id);
}
static void
expand_list(GListPtr list, int clones,
char **rsc_list, char **node_list, char **uuid_list)
{
const char *uname = NULL;
const char *rsc_id = NULL;
const char *last_rsc_id = NULL;
CRM_CHECK(list != NULL, return);
if(rsc_list) {
CRM_CHECK(*rsc_list == NULL, *rsc_list = NULL);
}
if(node_list) {
CRM_CHECK(*node_list == NULL, *node_list = NULL);
}
slist_iter(entry, notify_entry_t, list, lpc,
CRM_CHECK(entry != NULL, continue);
CRM_CHECK(entry->rsc != NULL, continue);
CRM_CHECK(entry->node != NULL, continue);
rsc_id = entry->rsc->id;
uname = entry->node->details->uname;
CRM_ASSERT(uname != NULL);
CRM_ASSERT(rsc_id != NULL);
/* filter dups */
if(safe_str_eq(rsc_id, last_rsc_id)) {
continue;
}
last_rsc_id = rsc_id;
if(rsc_list != NULL) {
int existing_len = 0;
int len = 2 + strlen(rsc_id); /* +1 space, +1 EOS */
if(rsc_list && *rsc_list) {
existing_len = strlen(*rsc_list);
}
crm_debug_5("Adding %s (%dc) at offset %d",
rsc_id, len-2, existing_len);
crm_realloc(*rsc_list, len + existing_len);
sprintf(*rsc_list + existing_len, "%s ", rsc_id);
}
if(node_list != NULL) {
int existing_len = 0;
int len = 2 + strlen(uname);
if(node_list && *node_list) {
existing_len = strlen(*node_list);
}
crm_debug_5("Adding %s (%dc) at offset %d",
uname, len-2, existing_len);
crm_realloc(*node_list, len + existing_len);
sprintf(*node_list + existing_len, "%s ", uname);
}
);
}
void clone_expand(resource_t *rsc, pe_working_set_t *data_set)
{
char *rsc_list = NULL;
char *node_list = NULL;
char *uuid_list = NULL;
notify_data_t *n_data = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
crm_malloc0(n_data, sizeof(notify_data_t));
n_data->keys = g_hash_table_new_full(
g_str_hash, g_str_equal,
g_hash_destroy_str, g_hash_destroy_str);
crm_debug_2("Processing actions from %s", rsc->id);
if(is_set(rsc->flags, pe_rsc_notify)) {
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
slist_iter(
op, action_t, rsc->actions, lpc2,
child_rsc->cmds->create_notify_element(
child_rsc, op, n_data, data_set);
);
);
}
/* expand the notify data */
if(is_set(rsc->flags, pe_rsc_notify) && n_data->stop) {
n_data->stop = g_list_sort(
n_data->stop, sort_notify_entries);
rsc_list = NULL; node_list = NULL;
expand_list(n_data->stop, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_stop_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_stop_uname"), node_list);
}
if(is_set(rsc->flags, pe_rsc_notify) && n_data->start) {
n_data->start = g_list_sort(
n_data->start, sort_notify_entries);
rsc_list = NULL; node_list = NULL;
expand_list(n_data->start, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_start_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_start_uname"), node_list);
}
if(is_set(rsc->flags, pe_rsc_notify) && n_data->demote) {
n_data->demote = g_list_sort(
n_data->demote, sort_notify_entries);
rsc_list = NULL; node_list = NULL;
expand_list(n_data->demote, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_demote_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_demote_uname"), node_list);
}
if(is_set(rsc->flags, pe_rsc_notify) && n_data->promote) {
n_data->promote = g_list_sort(
n_data->promote, sort_notify_entries);
rsc_list = NULL; node_list = NULL; uuid_list = NULL;
expand_list(n_data->promote, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_promote_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_promote_uname"), node_list);
}
if(is_set(rsc->flags, pe_rsc_notify) && n_data->active) {
n_data->active = g_list_sort(
n_data->active, sort_notify_entries);
rsc_list = NULL; node_list = NULL; uuid_list = NULL;
expand_list(n_data->active, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_active_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_active_uname"), node_list);
}
if(is_set(rsc->flags, pe_rsc_notify) && n_data->slave) {
n_data->slave = g_list_sort(
n_data->slave, sort_notify_entries);
rsc_list = NULL; node_list = NULL; uuid_list = NULL;
expand_list(n_data->slave, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_slave_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_slave_uname"), node_list);
}
if(is_set(rsc->flags, pe_rsc_notify) && n_data->master) {
n_data->master = g_list_sort(
n_data->master, sort_notify_entries);
rsc_list = NULL; node_list = NULL; uuid_list = NULL;
expand_list(n_data->master, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_master_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_master_uname"), node_list);
}
if(is_set(rsc->flags, pe_rsc_notify) && n_data->inactive) {
n_data->inactive = g_list_sort(
n_data->inactive, sort_notify_entries);
rsc_list = NULL; node_list = NULL; uuid_list = NULL;
expand_list(n_data->inactive, clone_data->clone_max,
&rsc_list, &node_list, &uuid_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_inactive_resource"), rsc_list);
g_hash_table_insert(
n_data->keys,
crm_strdup("notify_inactive_uname"), node_list);
}
/* yes, we DO need this second loop */
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
child_rsc->cmds->expand(child_rsc, data_set);
);
/* slist_iter( */
/* action, action_t, rsc->actions, lpc2, */
/* if(safe_str_eq(action->task, CRMD_ACTION_NOTIFY)) { */
/* action->meta_xml = notify_xml; */
/* } */
/* ); */
native_expand(rsc, data_set);
/* destroy the notify_data */
pe_free_shallow(n_data->stop);
pe_free_shallow(n_data->start);
pe_free_shallow(n_data->demote);
pe_free_shallow(n_data->promote);
pe_free_shallow(n_data->master);
pe_free_shallow(n_data->slave);
pe_free_shallow(n_data->active);
pe_free_shallow(n_data->inactive);
g_hash_table_destroy(n_data->keys);
crm_free(n_data);
}
static gint sort_rsc_id(gconstpointer a, gconstpointer b)
{
const resource_t *resource1 = (const resource_t*)a;
const resource_t *resource2 = (const resource_t*)b;
CRM_ASSERT(resource1 != NULL);
CRM_ASSERT(resource2 != NULL);
return strcmp(resource1->id, resource2->id);
}
static resource_t *find_instance_on(resource_t *rsc, node_t *node)
{
slist_iter(child, resource_t, rsc->children, lpc,
slist_iter(known ,node_t, child->known_on, lpc2,
if(node->details == known->details) {
return child;
}
);
);
return NULL;
}
gboolean
clone_create_probe(resource_t *rsc, node_t *node, action_t *complete,
gboolean force, pe_working_set_t *data_set)
{
gboolean any_created = FALSE;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
rsc->children = g_list_sort(rsc->children, sort_rsc_id);
if(is_not_set(rsc->flags, pe_rsc_unique)
&& clone_data->clone_node_max == 1) {
/* only look for one copy */
resource_t *child = NULL;
/* Try whoever we probed last time */
child = find_instance_on(rsc, node);
if(child) {
return child->cmds->create_probe(
child, node, complete, force, data_set);
}
/* Try whoever we plan on starting there */
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
node_t *local_node = child_rsc->fns->location(child_rsc, NULL, FALSE);
if(local_node == NULL) {
continue;
}
if(local_node->details == node->details) {
return child_rsc->cmds->create_probe(
child_rsc, node, complete, force, data_set);
}
);
/* Fall back to the first clone instance */
child = rsc->children->data;
return child->cmds->create_probe(child, node, complete, force, data_set);
}
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
if(child_rsc->cmds->create_probe(
child_rsc, node, complete, force, data_set)) {
any_created = TRUE;
}
if(any_created
&& is_not_set(rsc->flags, pe_rsc_unique)
&& clone_data->clone_node_max == 1) {
/* only look for one copy (clone :0) */
break;
}
);
return any_created;
}
diff --git a/pengine/master.c b/pengine/master.c
index c05f7ef47f..6ecd068762 100644
--- a/pengine/master.c
+++ b/pengine/master.c
@@ -1,822 +1,831 @@
/*
* Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <crm_internal.h>
#include <crm/msg_xml.h>
#include <allocate.h>
#include <lib/crm/pengine/utils.h>
#include <utils.h>
#define VARIANT_CLONE 1
#include <lib/crm/pengine/variant.h>
extern gint sort_clone_instance(gconstpointer a, gconstpointer b);
extern void clone_create_notifications(
resource_t *rsc, action_t *action, action_t *action_complete,
pe_working_set_t *data_set);
extern int master_score(resource_t *rsc, node_t *node, int not_set_value);
static void
child_promoting_constraints(
clone_variant_data_t *clone_data, enum pe_ordering type,
resource_t *rsc, resource_t *child, resource_t *last, pe_working_set_t *data_set)
{
/* if(clone_data->ordered */
/* || clone_data->self->restart_type == pe_restart_restart) { */
/* type = pe_order_implies_left; */
/* } */
if(child == NULL) {
if(clone_data->ordered && last != NULL) {
crm_debug_4("Ordered version (last node)");
/* last child promote before promoted started */
custom_action_order(
last, promote_key(last), NULL,
rsc, promoted_key(rsc), NULL,
type, data_set);
}
} else if(clone_data->ordered) {
crm_debug_4("Ordered version");
if(last == NULL) {
/* global promote before first child promote */
last = rsc;
} /* else: child/child relative promote */
order_start_start(last, child, type);
custom_action_order(
last, promote_key(last), NULL,
child, promote_key(child), NULL,
type, data_set);
} else {
crm_debug_4("Un-ordered version");
/* child promote before global promoted */
custom_action_order(
child, promote_key(child), NULL,
rsc, promoted_key(rsc), NULL,
type, data_set);
/* global promote before child promote */
custom_action_order(
rsc, promote_key(rsc), NULL,
child, promote_key(child), NULL,
type, data_set);
}
}
static void
child_demoting_constraints(
clone_variant_data_t *clone_data, enum pe_ordering type,
resource_t *rsc, resource_t *child, resource_t *last, pe_working_set_t *data_set)
{
/* if(clone_data->ordered */
/* || clone_data->self->restart_type == pe_restart_restart) { */
/* type = pe_order_implies_left; */
/* } */
if(child == NULL) {
if(clone_data->ordered && last != NULL) {
crm_debug_4("Ordered version (last node)");
/* global demote before first child demote */
custom_action_order(
rsc, demote_key(rsc), NULL,
last, demote_key(last), NULL,
pe_order_implies_left, data_set);
}
} else if(clone_data->ordered && last != NULL) {
crm_debug_4("Ordered version");
/* child/child relative demote */
custom_action_order(child, demote_key(child), NULL,
last, demote_key(last), NULL,
type, data_set);
} else if(clone_data->ordered) {
crm_debug_4("Ordered version (1st node)");
/* first child stop before global stopped */
custom_action_order(
child, demote_key(child), NULL,
rsc, demoted_key(rsc), NULL,
type, data_set);
} else {
crm_debug_4("Un-ordered version");
/* child demote before global demoted */
custom_action_order(
child, demote_key(child), NULL,
rsc, demoted_key(rsc), NULL,
type, data_set);
/* global demote before child demote */
custom_action_order(
rsc, demote_key(rsc), NULL,
child, demote_key(child), NULL,
type, data_set);
}
}
static void
master_update_pseudo_status(
resource_t *child, gboolean *demoting, gboolean *promoting)
{
CRM_ASSERT(demoting != NULL);
CRM_ASSERT(promoting != NULL);
slist_iter(
action, action_t, child->actions, lpc,
if(*promoting && *demoting) {
return;
} else if(action->optional) {
continue;
} else if(safe_str_eq(CRMD_ACTION_DEMOTE, action->task)) {
*demoting = TRUE;
} else if(safe_str_eq(CRMD_ACTION_PROMOTE, action->task)) {
*promoting = TRUE;
}
);
}
#define apply_master_location(list) \
slist_iter( \
cons, rsc_to_node_t, list, lpc2, \
cons_node = NULL; \
if(cons->role_filter == RSC_ROLE_MASTER) { \
crm_debug("Applying %s to %s", \
cons->id, child_rsc->id); \
cons_node = pe_find_node_id( \
cons->node_list_rh, chosen->details->id); \
} \
if(cons_node != NULL) { \
int new_priority = merge_weights( \
child_rsc->priority, cons_node->weight); \
crm_debug("\t%s: %d->%d (%d)", child_rsc->id, \
child_rsc->priority, new_priority, cons_node->weight); \
child_rsc->priority = new_priority; \
} \
);
static node_t *
can_be_master(resource_t *rsc)
{
node_t *node = NULL;
node_t *local_node = NULL;
resource_t *parent = uber_parent(rsc);
clone_variant_data_t *clone_data = NULL;
int level = LOG_DEBUG_2;
#if 0
enum rsc_role_e role = RSC_ROLE_UNKNOWN;
role = rsc->fns->state(rsc, FALSE);
crm_info("%s role: %s", rsc->id, role2text(role));
#endif
if(rsc->children) {
slist_iter(
child, resource_t, rsc->children, lpc,
if(can_be_master(child) == NULL) {
do_crm_log(level, "Child %s of %s can't be promoted", child->id, rsc->id);
return NULL;
}
);
}
node = rsc->fns->location(rsc, NULL, FALSE);
if(rsc->priority < 0) {
do_crm_log(level, "%s cannot be master: preference: %d",
rsc->id, rsc->priority);
return NULL;
} else if(node == NULL) {
do_crm_log(level, "%s cannot be master: not allocated",
rsc->id);
return NULL;
} else if(can_run_resources(node) == FALSE) {
do_crm_log(level, "Node cant run any resources: %s",
node->details->uname);
return NULL;
}
get_clone_variant_data(clone_data, parent);
local_node = pe_find_node_id(
parent->allowed_nodes, node->details->id);
if(local_node == NULL) {
crm_err("%s cannot run on %s: node not allowed",
rsc->id, node->details->uname);
return NULL;
} else if(local_node->count < clone_data->master_node_max) {
return local_node;
} else {
do_crm_log(level, "%s cannot be master on %s: node full",
rsc->id, node->details->uname);
}
return NULL;
}
static gint sort_master_instance(gconstpointer a, gconstpointer b)
{
int rc;
enum rsc_role_e role1 = RSC_ROLE_UNKNOWN;
enum rsc_role_e role2 = RSC_ROLE_UNKNOWN;
const resource_t *resource1 = (const resource_t*)a;
const resource_t *resource2 = (const resource_t*)b;
CRM_ASSERT(resource1 != NULL);
CRM_ASSERT(resource2 != NULL);
role1 = resource1->fns->state(resource1, TRUE);
role2 = resource2->fns->state(resource2, TRUE);
rc = sort_rsc_index(a, b);
if( rc != 0 ) {
return rc;
}
if(role1 > role2) {
return -1;
} else if(role1 < role2) {
return 1;
}
return sort_clone_instance(a, b);
}
static void master_promotion_order(resource_t *rsc)
{
node_t *node = NULL;
node_t *chosen = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
if(clone_data->merged_master_weights) {
return;
}
clone_data->merged_master_weights = TRUE;
crm_info("Merging weights for %s", rsc->id);
slist_iter(
child, resource_t, rsc->children, lpc,
crm_debug_2("%s: %d", child->id, child->sort_index);
);
dump_node_scores(LOG_DEBUG_3, rsc, "Before", rsc->allowed_nodes);
#if 1
slist_iter(
child, resource_t, rsc->children, lpc,
chosen = child->fns->location(child, NULL, FALSE);
if(chosen == NULL || child->sort_index < 0) {
crm_debug_3("Skipping %s", child->id);
continue;
}
node = (node_t*)pe_find_node_id(
rsc->allowed_nodes, chosen->details->id);
CRM_ASSERT(node != NULL);
node->weight = merge_weights(child->sort_index, node->weight);
);
dump_node_scores(LOG_DEBUG_3, rsc, "Middle", rsc->allowed_nodes);
#endif
slist_iter(
constraint, rsc_colocation_t, rsc->rsc_cons_lhs, lpc,
if(constraint->role_rh == RSC_ROLE_MASTER) {
rsc->allowed_nodes = constraint->rsc_lh->cmds->merge_weights(
constraint->rsc_lh, rsc->id, rsc->allowed_nodes,
constraint->score/INFINITY, TRUE);
}
);
dump_node_scores(LOG_DEBUG_3, rsc, "After", rsc->allowed_nodes);
/* write them back and sort */
slist_iter(
child, resource_t, rsc->children, lpc,
chosen = child->fns->location(child, NULL, FALSE);
if(chosen == NULL || child->sort_index < 0) {
crm_debug_2("%s: %d", child->id, child->sort_index);
continue;
}
node = (node_t*)pe_find_node_id(
rsc->allowed_nodes, chosen->details->id);
CRM_ASSERT(node != NULL);
child->sort_index = node->weight;
crm_debug_2("%s: %d", child->id, child->sort_index);
);
rsc->children = g_list_sort(rsc->children, sort_master_instance);
}
int
master_score(resource_t *rsc, node_t *node, int not_set_value)
{
char *attr_name;
char *name = rsc->id;
const char *attr_value;
int score = not_set_value, len = 0;
if(rsc->fns->state(rsc, TRUE) < RSC_ROLE_STARTED) {
return score;
}
+ if(rsc->running_on) {
+ node_t *match = pe_find_node_id(rsc->allowed_nodes, node->details->id);
+ if(match->weight < 0) {
+ crm_debug_2("%s on %s has score: %d - ignoring master pref",
+ rsc->id, match->details->uname, match->weight);
+ return score;
+ }
+ }
+
#if 0
if(rsc->clone_name) {
name = rsc->clone_name;
crm_err("%s ::= %s", rsc->id, rsc->clone_name);
}
#endif
len = 8 + strlen(name);
crm_malloc0(attr_name, len);
sprintf(attr_name, "master-%s", name);
crm_debug_3("looking for %s on %s", attr_name,
node->details->uname);
attr_value = g_hash_table_lookup(
node->details->attrs, attr_name);
if(attr_value == NULL) {
crm_free(attr_name);
len = 8 + strlen(rsc->long_name);
crm_malloc0(attr_name, len);
sprintf(attr_name, "master-%s", rsc->long_name);
crm_debug_3("looking for %s on %s", attr_name,
node->details->uname);
attr_value = g_hash_table_lookup(
node->details->attrs, attr_name);
}
if(attr_value != NULL) {
crm_debug_2("%s[%s] = %s", attr_name,
node->details->uname, crm_str(attr_value));
score = char2score(attr_value);
}
crm_free(attr_name);
return score;
}
#define max(a, b) a<b?b:a
static void
apply_master_prefs(resource_t *rsc)
{
int score, new_score;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
if(clone_data->applied_master_prefs) {
/* Make sure we only do this once */
return;
}
clone_data->applied_master_prefs = TRUE;
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
slist_iter(
node, node_t, child_rsc->allowed_nodes, lpc,
if(can_run_resources(node) == FALSE) {
/* This node will never be promoted to master,
* so don't apply the master score as that may
* lead to clone shuffling
*/
continue;
}
score = master_score(child_rsc, node, 0);
new_score = merge_weights(node->weight, score);
if(new_score != node->weight) {
crm_debug("\t%s: Updating preference for %s (%d->%d)",
child_rsc->id, node->details->uname, node->weight, new_score);
node->weight = new_score;
}
new_score = max(child_rsc->priority, score);
if(new_score != child_rsc->priority) {
crm_debug("\t%s: Updating priority (%d->%d)",
child_rsc->id, child_rsc->priority, new_score);
child_rsc->priority = new_score;
}
);
);
}
static void set_role(resource_t *rsc, enum rsc_role_e role, gboolean current)
{
if(current) {
rsc->role = role;
} else {
rsc->next_role = role;
if(role == RSC_ROLE_MASTER) {
add_hash_param(rsc->parameters, crm_meta_name("role"), role2text(role));
}
}
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
set_role(child_rsc, role, current);
);
}
node_t *
master_color(resource_t *rsc, pe_working_set_t *data_set)
{
int promoted = 0;
node_t *chosen = NULL;
node_t *cons_node = NULL;
enum rsc_role_e next_role = RSC_ROLE_UNKNOWN;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
apply_master_prefs(rsc);
clone_color(rsc, data_set);
/* count now tracks the number of masters allocated */
slist_iter(node, node_t, rsc->allowed_nodes, lpc,
node->count = 0;
);
/*
* assign priority
*/
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
GListPtr list = NULL;
crm_debug_2("Assigning priority for %s", child_rsc->id);
if(child_rsc->fns->state(child_rsc, TRUE) == RSC_ROLE_STARTED) {
set_role(child_rsc, RSC_ROLE_SLAVE, TRUE);
}
chosen = child_rsc->fns->location(child_rsc, &list, FALSE);
if(g_list_length(list) > 1) {
crm_config_err("Cannot promote non-colocated child %s", child_rsc->id);
}
g_list_free(list);
if(chosen == NULL) {
continue;
}
next_role = child_rsc->fns->state(child_rsc, FALSE);
switch(next_role) {
case RSC_ROLE_STARTED:
CRM_CHECK(chosen != NULL, break);
/*
* Default to -1 if no value is set
*
* This allows master locations to be specified
* based solely on rsc_location constraints,
* but prevents anyone from being promoted if
* neither a constraint nor a master-score is present
*/
child_rsc->priority = master_score(child_rsc, chosen, -1);
break;
case RSC_ROLE_SLAVE:
case RSC_ROLE_STOPPED:
child_rsc->priority = -INFINITY;
break;
case RSC_ROLE_MASTER:
/* the only reason we should be here is if
* we're re-creating actions after a stonith
*/
promoted++;
break;
default:
CRM_CHECK(FALSE/* unhandled */,
crm_err("Unknown resource role: %d for %s",
next_role, child_rsc->id));
}
apply_master_location(child_rsc->rsc_location);
apply_master_location(rsc->rsc_location);
slist_iter(
cons, rsc_colocation_t, child_rsc->rsc_cons, lpc2,
child_rsc->cmds->rsc_colocation_lh(child_rsc, cons->rsc_rh, cons);
);
child_rsc->sort_index = child_rsc->priority;
crm_debug_2("Assigning priority for %s: %d", child_rsc->id, child_rsc->priority);
if(next_role == RSC_ROLE_MASTER) {
child_rsc->sort_index = INFINITY;
}
);
master_promotion_order(rsc);
/* mark the first N as masters */
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
chosen = NULL;
crm_debug_2("Processing %s", child_rsc->id);
if(promoted < clone_data->master_max) {
chosen = can_be_master(child_rsc);
}
crm_debug("%s master score: %d", child_rsc->id, child_rsc->priority);
if(chosen == NULL) {
next_role = child_rsc->fns->state(child_rsc, FALSE);
if(next_role == RSC_ROLE_STARTED) {
set_role(child_rsc, RSC_ROLE_SLAVE, FALSE);
}
continue;
}
chosen->count++;
crm_info("Promoting %s", child_rsc->id);
set_role(child_rsc, RSC_ROLE_MASTER, FALSE);
clone_data->masters_allocated++;
promoted++;
);
crm_info("%s: Promoted %d instances of a possible %d to master",
rsc->id, promoted, clone_data->master_max);
return NULL;
}
void master_create_actions(resource_t *rsc, pe_working_set_t *data_set)
{
action_t *action = NULL;
action_t *action_complete = NULL;
gboolean any_promoting = FALSE;
gboolean any_demoting = FALSE;
resource_t *last_promote_rsc = NULL;
resource_t *last_demote_rsc = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
crm_debug("Creating actions for %s", rsc->id);
/* create actions as normal */
clone_create_actions(rsc, data_set);
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
gboolean child_promoting = FALSE;
gboolean child_demoting = FALSE;
crm_debug_2("Creating actions for %s", child_rsc->id);
child_rsc->cmds->create_actions(child_rsc, data_set);
master_update_pseudo_status(
child_rsc, &child_demoting, &child_promoting);
any_demoting = any_demoting || child_demoting;
any_promoting = any_promoting || child_promoting;
);
/* promote */
action = promote_action(rsc, NULL, !any_promoting);
action_complete = custom_action(
rsc, promoted_key(rsc),
CRMD_ACTION_PROMOTED, NULL, !any_promoting, TRUE, data_set);
action->pseudo = TRUE;
action->runnable = FALSE;
action_complete->pseudo = TRUE;
action_complete->runnable = FALSE;
action_complete->priority = INFINITY;
if(clone_data->masters_allocated > 0) {
action->runnable = TRUE;
action_complete->runnable = TRUE;
}
child_promoting_constraints(clone_data, pe_order_optional,
rsc, NULL, last_promote_rsc, data_set);
clone_create_notifications(rsc, action, action_complete, data_set);
/* demote */
action = demote_action(rsc, NULL, !any_demoting);
action_complete = custom_action(
rsc, demoted_key(rsc),
CRMD_ACTION_DEMOTED, NULL, !any_demoting, TRUE, data_set);
action_complete->priority = INFINITY;
action->pseudo = TRUE;
action->runnable = TRUE;
action_complete->pseudo = TRUE;
action_complete->runnable = TRUE;
child_demoting_constraints(clone_data, pe_order_optional,
rsc, NULL, last_demote_rsc, data_set);
clone_create_notifications(rsc, action, action_complete, data_set);
/* restore the correct priority */
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
child_rsc->priority = rsc->priority;
);
}
void
master_internal_constraints(resource_t *rsc, pe_working_set_t *data_set)
{
resource_t *last_rsc = NULL;
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc);
clone_internal_constraints(rsc, data_set);
/* global stopped before start */
custom_action_order(
rsc, stopped_key(rsc), NULL,
rsc, start_key(rsc), NULL,
pe_order_optional, data_set);
/* global stopped before promote */
custom_action_order(
rsc, stopped_key(rsc), NULL,
rsc, promote_key(rsc), NULL,
pe_order_optional, data_set);
/* global demoted before start */
custom_action_order(
rsc, demoted_key(rsc), NULL,
rsc, start_key(rsc), NULL,
pe_order_optional, data_set);
/* global started before promote */
custom_action_order(
rsc, started_key(rsc), NULL,
rsc, promote_key(rsc), NULL,
pe_order_optional, data_set);
/* global demoted before stop */
custom_action_order(
rsc, demoted_key(rsc), NULL,
rsc, stop_key(rsc), NULL,
pe_order_optional, data_set);
/* global demote before demoted */
custom_action_order(
rsc, demote_key(rsc), NULL,
rsc, demoted_key(rsc), NULL,
pe_order_optional, data_set);
/* global demoted before promote */
custom_action_order(
rsc, demoted_key(rsc), NULL,
rsc, promote_key(rsc), NULL,
pe_order_optional, data_set);
slist_iter(
child_rsc, resource_t, rsc->children, lpc,
/* child demote before promote */
custom_action_order(
child_rsc, demote_key(child_rsc), NULL,
child_rsc, promote_key(child_rsc), NULL,
pe_order_optional, data_set);
child_promoting_constraints(clone_data, pe_order_optional,
rsc, child_rsc, last_rsc, data_set);
child_demoting_constraints(clone_data, pe_order_optional,
rsc, child_rsc, last_rsc, data_set);
last_rsc = child_rsc;
);
}
extern resource_t *find_compatible_child(resource_t *local_child, resource_t *rsc, enum rsc_role_e filter);
static void node_list_update_one(GListPtr list1, node_t *other, int score)
{
node_t *node = NULL;
if(other == NULL) {
return;
}
node = (node_t*)pe_find_node_id(list1, other->details->id);
if(node != NULL) {
crm_debug_2("%s: %d + %d",
node->details->uname, node->weight, other->weight);
node->weight = merge_weights(node->weight, score);
}
}
void master_rsc_colocation_rh(
resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint)
{
clone_variant_data_t *clone_data = NULL;
get_clone_variant_data(clone_data, rsc_rh);
CRM_CHECK(rsc_rh != NULL, return);
if(is_set(rsc_rh->flags, pe_rsc_provisional)) {
return;
} else if(constraint->role_rh == RSC_ROLE_UNKNOWN) {
crm_debug_3("Handling %s as a clone colocation", constraint->id);
clone_rsc_colocation_rh(rsc_lh, rsc_rh, constraint);
return;
}
CRM_CHECK(rsc_lh != NULL, return);
CRM_CHECK(rsc_lh->variant == pe_native, return);
crm_debug_2("Processing constraint %s: %d", constraint->id, constraint->score);
if(constraint->role_rh == RSC_ROLE_UNKNOWN) {
slist_iter(
child_rsc, resource_t, rsc_rh->children, lpc,
child_rsc->cmds->rsc_colocation_rh(rsc_lh, child_rsc, constraint);
);
} else if(is_set(rsc_lh->flags, pe_rsc_provisional)) {
GListPtr lhs = NULL, rhs = NULL;
lhs = rsc_lh->allowed_nodes;
slist_iter(
child_rsc, resource_t, rsc_rh->children, lpc,
node_t *chosen = child_rsc->fns->location(child_rsc, NULL, FALSE);
enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, FALSE);
crm_debug_3("Processing: %s", child_rsc->id);
if(chosen != NULL
&& next_role == constraint->role_rh) {
crm_debug_3("Applying: %s %s", child_rsc->id,
role2text(next_role));
node_list_update_one(rsc_lh->allowed_nodes, chosen, constraint->score);
rhs = g_list_append(rhs, chosen);
}
);
/* Only do this if its not a master-master colocation
* Doing this unconditionally would prevent the slaves from being started
*/
if(constraint->score > 0
&& (constraint->role_lh != RSC_ROLE_MASTER
|| constraint->role_rh != RSC_ROLE_MASTER)) {
rsc_lh->allowed_nodes = node_list_and(lhs, rhs, FALSE);
pe_free_shallow(lhs);
}
pe_free_shallow_adv(rhs, FALSE);
} else if(constraint->role_lh == RSC_ROLE_MASTER) {
resource_t *rh_child = find_compatible_child(rsc_lh, rsc_rh, constraint->role_rh);
if(rh_child == NULL && constraint->score >= INFINITY) {
crm_debug_2("%s can't be promoted %s", rsc_lh->id, constraint->id);
rsc_lh->priority = -INFINITY;
} else if(rh_child != NULL) {
int new_priority = merge_weights(rsc_lh->priority, constraint->score);
crm_debug("Applying %s to %s", constraint->id, rsc_lh->id);
crm_debug("\t%s: %d->%d", rsc_lh->id, rsc_lh->priority, new_priority);
rsc_lh->priority = new_priority;
}
}
return;
}
diff --git a/pengine/regression.sh b/pengine/regression.sh
index e7642929c1..cd713dff1a 100755
--- a/pengine/regression.sh
+++ b/pengine/regression.sh
@@ -1,279 +1,280 @@
#!/bin/bash
# Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
if [ -x /usr/bin/valgrind ]; then
export G_SLICE=always-malloc
VALGRIND_CMD="valgrind -q --show-reachable=yes --leak-check=full --trace-children=no --time-stamp=yes --num-callers=20 --suppressions=./ptest.supp"
fi
. regression.core.sh
create_mode="true"
echo Generating test outputs for these tests...
# do_test
echo Done.
echo ""
echo Performing the following tests...
create_mode="false"
echo ""
do_test simple1 "Offline "
do_test simple2 "Start "
do_test simple3 "Start 2 "
do_test simple4 "Start Failed"
do_test simple6 "Stop Start "
do_test simple7 "Shutdown "
#do_test simple8 "Stonith "
#do_test simple9 "Lower version"
#do_test simple10 "Higher version"
do_test simple11 "Priority (ne)"
do_test simple12 "Priority (eq)"
do_test simple8 "Stickiness"
echo ""
do_test params-0 "Params: No change"
do_test params-1 "Params: Changed"
do_test params-2 "Params: Resource definition"
do_test params-4 "Params: Reload"
do_test novell-251689 "Resource definition change + target_role=stopped"
echo ""
do_test orphan-0 "Orphan ignore"
do_test orphan-1 "Orphan stop"
echo ""
do_test target-0 "Target Role : baseline"
do_test target-1 "Target Role : test"
echo ""
do_test date-1 "Dates" -d "2005-020"
do_test date-2 "Date Spec - Pass" -d "2005-020T12:30"
do_test date-3 "Date Spec - Fail" -d "2005-020T11:30"
do_test probe-0 "Probe (anon clone)"
do_test probe-1 "Pending Probe"
do_test standby "Standby"
do_test comments "Comments"
echo ""
do_test rsc_dep1 "Must not "
do_test rsc_dep3 "Must "
do_test rsc_dep5 "Must not 3 "
do_test rsc_dep7 "Must 3 "
do_test rsc_dep10 "Must (but cant)"
do_test rsc_dep2 "Must (running) "
do_test rsc_dep8 "Must (running : alt) "
do_test rsc_dep4 "Must (running + move)"
echo ""
do_test order1 "Order start 1 "
do_test order2 "Order start 2 "
do_test order3 "Order stop "
do_test order4 "Order (multiple) "
do_test order5 "Order (move) "
do_test order6 "Order (move w/ restart) "
do_test order7 "Order (manditory) "
do_test order-optional "Order (score=0) "
do_test order-required "Order (score=INFINITY) "
echo ""
do_test coloc-loop "Colocation - loop"
do_test coloc-many-one "Colocation - many-to-one"
do_test coloc-list "Colocation - many-to-one with list"
do_test coloc-group "Colocation - groups"
do_test coloc-slave-anti "Anti-colocation with slave shouldn't prevent master colocation"
#echo ""
#do_test agent1 "version: lt (empty)"
#do_test agent2 "version: eq "
#do_test agent3 "version: gt "
echo ""
do_test attrs1 "string: eq (and) "
do_test attrs2 "string: lt / gt (and)"
do_test attrs3 "string: ne (or) "
do_test attrs4 "string: exists "
do_test attrs5 "string: not_exists "
do_test attrs6 "is_dc: true "
do_test attrs7 "is_dc: false "
do_test attrs8 "score_attribute "
echo ""
do_test mon-rsc-1 "Schedule Monitor - start"
do_test mon-rsc-2 "Schedule Monitor - move "
do_test mon-rsc-3 "Schedule Monitor - pending start "
do_test mon-rsc-4 "Schedule Monitor - move/pending start"
echo ""
do_test rec-rsc-0 "Resource Recover - no start "
do_test rec-rsc-1 "Resource Recover - start "
do_test rec-rsc-2 "Resource Recover - monitor "
do_test rec-rsc-3 "Resource Recover - stop - ignore"
do_test rec-rsc-4 "Resource Recover - stop - block "
do_test rec-rsc-5 "Resource Recover - stop - fence "
do_test rec-rsc-6 "Resource Recover - multiple - restart"
do_test rec-rsc-7 "Resource Recover - multiple - stop "
do_test rec-rsc-8 "Resource Recover - multiple - block "
do_test rec-rsc-9 "Resource Recover - group/group"
echo ""
do_test quorum-1 "No quorum - ignore"
do_test quorum-2 "No quorum - freeze"
do_test quorum-3 "No quorum - stop "
do_test quorum-4 "No quorum - start anyway"
do_test quorum-5 "No quorum - start anyway (group)"
do_test quorum-6 "No quorum - start anyway (clone)"
echo ""
do_test rec-node-1 "Node Recover - Startup - no fence"
do_test rec-node-2 "Node Recover - Startup - fence "
do_test rec-node-3 "Node Recover - HA down - no fence"
do_test rec-node-4 "Node Recover - HA down - fence "
do_test rec-node-5 "Node Recover - CRM down - no fence"
do_test rec-node-6 "Node Recover - CRM down - fence "
do_test rec-node-7 "Node Recover - no quorum - ignore "
do_test rec-node-8 "Node Recover - no quorum - freeze "
do_test rec-node-9 "Node Recover - no quorum - stop "
do_test rec-node-10 "Node Recover - no quorum - stop w/fence"
do_test rec-node-11 "Node Recover - CRM down w/ group - fence "
do_test rec-node-12 "Node Recover - nothing active - fence "
do_test rec-node-13 "Node Recover - failed resource + shutdown - fence "
do_test rec-node-15 "Node Recover - unknown lrm section"
do_test rec-node-14 "Serialize all stonith's"
echo ""
do_test multi1 "Multiple Active (stop/start)"
echo ""
do_test migrate-1 "Migrate (migrate)"
do_test migrate-2 "Migrate (stable)"
do_test migrate-3 "Migrate (failed migrate_to)"
do_test migrate-4 "Migrate (failed migrate_from)"
do_test novell-252693 "Migration in a stopping stack"
do_test novell-252693-2 "Migration in a starting stack"
do_test novell-252693-3 "Non-Migration in a starting and stopping stack"
do_test bug-1820 "Migration in a group"
do_test bug-1820-1 "Non-migration in a group"
#echo ""
#do_test complex1 "Complex "
echo ""
do_test group1 "Group "
do_test group2 "Group + Native "
do_test group3 "Group + Group "
do_test group4 "Group + Native (nothing)"
do_test group5 "Group + Native (move) "
do_test group6 "Group + Group (move) "
do_test group7 "Group colocation"
do_test group13 "Group colocation (cant run)"
do_test group8 "Group anti-colocation"
do_test group9 "Group recovery"
do_test group10 "Group partial recovery"
do_test group11 "Group target_role"
do_test group14 "Group stop (graph terminated)"
do_test group15 "-ve group colocation"
do_test bug-1573 "Partial stop of a group with two children"
do_test bug-1718 "Mandatory group ordering - Stop group_FUN"
echo ""
do_test clone-anon-probe-1 "Probe the correct (anonymous) clone instance for each node"
do_test clone-anon-probe-2 "Avoid needless re-probing of anonymous clones"
do_test inc0 "Incarnation start"
do_test inc1 "Incarnation start order"
do_test inc2 "Incarnation silent restart, stop, move"
do_test inc3 "Inter-incarnation ordering, silent restart, stop, move"
do_test inc4 "Inter-incarnation ordering, silent restart, stop, move (ordered)"
do_test inc5 "Inter-incarnation ordering, silent restart, stop, move (restart 1)"
do_test inc6 "Inter-incarnation ordering, silent restart, stop, move (restart 2)"
do_test inc7 "Clone colocation"
do_test inc8 "Clone anti-colocation"
do_test inc9 "Non-unique clone"
do_test inc10 "Non-unique clone (stop)"
do_test inc11 "Primitive colocation with clones"
do_test inc12 "Clone shutdown"
do_test cloned-group "Make sure only the correct number of cloned groups are started"
+do_test clone-no-shuffle "Dont prioritize allocation of instances that must be moved"
echo ""
do_test master-0 "Stopped -> Slave"
do_test master-1 "Stopped -> Promote"
do_test master-2 "Stopped -> Promote : notify"
do_test master-3 "Stopped -> Promote : master location"
do_test master-4 "Started -> Promote : master location"
do_test master-5 "Promoted -> Promoted"
do_test master-6 "Promoted -> Promoted (2)"
do_test master-7 "Promoted -> Fenced"
do_test master-8 "Promoted -> Fenced -> Moved"
do_test master-9 "Stopped + Promotable + No quorum"
do_test master-10 "Stopped -> Promotable : notify with monitor"
do_test master-11 "Stopped -> Promote : colocation"
do_test novell-239082 "Demote/Promote ordering"
do_test novell-239087 "Stable master placement"
do_test master-12 "Promotion based solely on rsc_location constraints"
do_test master-13 "Include preferences of colocated resources when placing master"
do_test master-demote "Ordering when actions depends on demoting a slave resource"
do_test master-ordering "Prevent resources from starting that need a master"
do_test bug-1765 "Master-Master Colocation (dont stop the slaves)"
do_test master-group "Promotion of cloned groups"
do_test bug-lf-1852 "Don't shuffle master/slave instances unnecessarily"
echo ""
do_test managed-0 "Managed (reference)"
do_test managed-1 "Not managed - down "
do_test managed-2 "Not managed - up "
echo ""
do_test interleave-0 "Interleave (reference)"
do_test interleave-1 "coloc - not interleaved"
do_test interleave-2 "coloc - interleaved "
do_test interleave-3 "coloc - interleaved (2)"
echo ""
do_test notify-0 "Notify reference"
do_test notify-1 "Notify simple"
do_test notify-2 "Notify simple, confirm"
do_test notify-3 "Notify move, confirm"
do_test novell-239079 "Notification priority"
#do_test notify-2 "Notify - 764"
echo ""
do_test 594 "OSDL #594"
do_test 662 "OSDL #662"
do_test 696 "OSDL #696"
do_test 726 "OSDL #726"
do_test 735 "OSDL #735"
do_test 764 "OSDL #764"
do_test 797 "OSDL #797"
do_test 829 "OSDL #829"
do_test 994 "OSDL #994"
do_test 994-2 "OSDL #994 - with a dependant resource (potentially broken)"
do_test 1360 "OSDL #1360 - Clone stickiness"
do_test 1484 "OSDL #1484 - on_fail=stop"
do_test 1494 "OSDL #1494 - Clone stability"
do_test unrunnable-1 "Unrunnable"
do_test stonith-0 "Stonith loop - 1"
do_test stonith-1 "Stonith loop - 2"
do_test stonith-2 "Stonith loop - 3"
do_test bug-1572-1 "Recovery of groups depending on master/slave"
do_test bug-1572-2 "Recovery of groups depending on master/slave when the master is never re-promoted"
do_test bug-1685 "Depends-on-master ordering"
do_test bug-1822 "Dont promote partially active groups"
do_test bug-pm-12 "Recover only the failed portion of a cloned group"
echo ""
test_results
diff --git a/pengine/testcases/clone-no-shuffle.dot b/pengine/testcases/clone-no-shuffle.dot
new file mode 100644
index 0000000000..a3dc6c7ace
--- /dev/null
+++ b/pengine/testcases/clone-no-shuffle.dot
@@ -0,0 +1,82 @@
+digraph "g" {
+"all_stopped" [ style=bold color="green" fontcolor="orange" ]
+"drbd1:0_demote_0 dktest2sles10" -> "drbd1:0_stop_0 dktest2sles10" [ style = bold]
+"drbd1:0_demote_0 dktest2sles10" -> "ms-drbd1_demoted_0" [ style = bold]
+"drbd1:0_demote_0 dktest2sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:0_post_notify_demote_0 dktest2sles10" -> "ms-drbd1_confirmed-post_notify_demote_0" [ style = bold]
+"drbd1:0_post_notify_demote_0 dktest2sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:0_pre_notify_demote_0 dktest2sles10" -> "ms-drbd1_confirmed-pre_notify_demote_0" [ style = bold]
+"drbd1:0_pre_notify_demote_0 dktest2sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:0_pre_notify_stop_0 dktest2sles10" -> "ms-drbd1_confirmed-pre_notify_stop_0" [ style = bold]
+"drbd1:0_pre_notify_stop_0 dktest2sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:0_stop_0 dktest2sles10" -> "all_stopped" [ style = bold]
+"drbd1:0_stop_0 dktest2sles10" -> "ms-drbd1_stopped_0" [ style = bold]
+"drbd1:0_stop_0 dktest2sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:1_monitor_0 dktest1sles10" -> "probe_complete dktest1sles10" [ style = bold]
+"drbd1:1_monitor_0 dktest1sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:1_monitor_11000 dktest1sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:1_post_notify_start_0 dktest1sles10" -> "ms-drbd1_confirmed-post_notify_start_0" [ style = bold]
+"drbd1:1_post_notify_start_0 dktest1sles10" [ style=bold color="green" fontcolor="black" ]
+"drbd1:1_start_0 dktest1sles10" -> "drbd1:1_monitor_11000 dktest1sles10" [ style = bold]
+"drbd1:1_start_0 dktest1sles10" -> "ms-drbd1_running_0" [ style = bold]
+"drbd1:1_start_0 dktest1sles10" [ style=bold color="green" fontcolor="black" ]
+"ms-drbd1_confirmed-post_notify_demote_0" -> "ms-drbd1_pre_notify_stop_0" [ style = bold]
+"ms-drbd1_confirmed-post_notify_demote_0" -> "ms-drbd1_stop_0" [ style = bold]
+"ms-drbd1_confirmed-post_notify_demote_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_confirmed-post_notify_start_0" -> "drbd1:1_monitor_11000 dktest1sles10" [ style = bold]
+"ms-drbd1_confirmed-post_notify_start_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_confirmed-post_notify_stop_0" -> "ms-drbd1_pre_notify_start_0" [ style = bold]
+"ms-drbd1_confirmed-post_notify_stop_0" -> "ms-drbd1_start_0" [ style = bold]
+"ms-drbd1_confirmed-post_notify_stop_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_confirmed-pre_notify_demote_0" -> "ms-drbd1_demote_0" [ style = bold]
+"ms-drbd1_confirmed-pre_notify_demote_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_confirmed-pre_notify_start_0" -> "ms-drbd1_start_0" [ style = bold]
+"ms-drbd1_confirmed-pre_notify_start_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_confirmed-pre_notify_stop_0" -> "ms-drbd1_stop_0" [ style = bold]
+"ms-drbd1_confirmed-pre_notify_stop_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_demote_0" -> "drbd1:0_demote_0 dktest2sles10" [ style = bold]
+"ms-drbd1_demote_0" -> "ms-drbd1_demoted_0" [ style = bold]
+"ms-drbd1_demote_0" -> "ms-drbd1_stop_0" [ style = bold]
+"ms-drbd1_demote_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_demoted_0" -> "ms-drbd1_post_notify_demote_0" [ style = bold]
+"ms-drbd1_demoted_0" -> "ms-drbd1_start_0" [ style = bold]
+"ms-drbd1_demoted_0" -> "ms-drbd1_stop_0" [ style = bold]
+"ms-drbd1_demoted_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_post_notify_demote_0" -> "drbd1:0_post_notify_demote_0 dktest2sles10" [ style = bold]
+"ms-drbd1_post_notify_demote_0" -> "ms-drbd1_confirmed-post_notify_demote_0" [ style = bold]
+"ms-drbd1_post_notify_demote_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_post_notify_start_0" -> "drbd1:1_post_notify_start_0 dktest1sles10" [ style = bold]
+"ms-drbd1_post_notify_start_0" -> "ms-drbd1_confirmed-post_notify_start_0" [ style = bold]
+"ms-drbd1_post_notify_start_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_post_notify_stop_0" -> "ms-drbd1_confirmed-post_notify_stop_0" [ style = bold]
+"ms-drbd1_post_notify_stop_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_pre_notify_demote_0" -> "drbd1:0_pre_notify_demote_0 dktest2sles10" [ style = bold]
+"ms-drbd1_pre_notify_demote_0" -> "ms-drbd1_confirmed-pre_notify_demote_0" [ style = bold]
+"ms-drbd1_pre_notify_demote_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_pre_notify_start_0" -> "ms-drbd1_confirmed-pre_notify_start_0" [ style = bold]
+"ms-drbd1_pre_notify_start_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_pre_notify_stop_0" -> "drbd1:0_pre_notify_stop_0 dktest2sles10" [ style = bold]
+"ms-drbd1_pre_notify_stop_0" -> "ms-drbd1_confirmed-pre_notify_stop_0" [ style = bold]
+"ms-drbd1_pre_notify_stop_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_running_0" -> "ms-drbd1_post_notify_start_0" [ style = bold]
+"ms-drbd1_running_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_start_0" -> "drbd1:1_start_0 dktest1sles10" [ style = bold]
+"ms-drbd1_start_0" -> "ms-drbd1_running_0" [ style = bold]
+"ms-drbd1_start_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_stop_0" -> "drbd1:0_stop_0 dktest2sles10" [ style = bold]
+"ms-drbd1_stop_0" -> "ms-drbd1_start_0" [ style = bold]
+"ms-drbd1_stop_0" -> "ms-drbd1_stopped_0" [ style = bold]
+"ms-drbd1_stop_0" [ style=bold color="green" fontcolor="orange" ]
+"ms-drbd1_stopped_0" -> "ms-drbd1_post_notify_stop_0" [ style = bold]
+"ms-drbd1_stopped_0" -> "ms-drbd1_start_0" [ style = bold]
+"ms-drbd1_stopped_0" [ style=bold color="green" fontcolor="orange" ]
+"probe_complete dktest1sles10" -> "probe_complete" [ style = bold]
+"probe_complete dktest1sles10" [ style=bold color="green" fontcolor="black" ]
+"probe_complete" -> "ms-drbd1_start_0" [ style = bold]
+"probe_complete" [ style=bold color="green" fontcolor="orange" ]
+"testip_monitor_0 dktest1sles10" -> "probe_complete dktest1sles10" [ style = bold]
+"testip_monitor_0 dktest1sles10" [ style=bold color="green" fontcolor="black" ]
+"testip_stop_0 dktest2sles10" -> "all_stopped" [ style = bold]
+"testip_stop_0 dktest2sles10" -> "ms-drbd1_demote_0" [ style = bold]
+"testip_stop_0 dktest2sles10" [ style=bold color="green" fontcolor="black" ]
+}
diff --git a/pengine/testcases/clone-no-shuffle.exp b/pengine/testcases/clone-no-shuffle.exp
new file mode 100644
index 0000000000..45d841ebae
--- /dev/null
+++ b/pengine/testcases/clone-no-shuffle.exp
@@ -0,0 +1,442 @@
+ <transition_graph cluster-delay="60s" batch-limit="30" transition_id="0">
+ <synapse id="0">
+ <action_set>
+ <rsc_op id="9" operation="demote" operation_key="drbd1:0_demote_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <primitive id="drbd1:0" long-id="ms-drbd1:drbd1:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_notify_demote_uname="dktest2sles10 " CRM_meta_notify_stop_uname="dktest2sles10 " CRM_meta_timeout="20000" CRM_meta_notify_stop_resource="drbd1:0 " CRM_meta_notify_start_uname="dktest1sles10 " CRM_meta_notify_start_resource="drbd1:1 " CRM_meta_notify_demote_resource="drbd1:0 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="31" operation="demote" operation_key="ms-drbd1_demote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="1">
+ <action_set>
+ <rsc_op id="10" operation="stop" operation_key="drbd1:0_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <primitive id="drbd1:0" long-id="ms-drbd1:drbd1:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" CRM_meta_notify_demote_uname="dktest2sles10 " CRM_meta_notify_stop_uname="dktest2sles10 " CRM_meta_timeout="20000" CRM_meta_notify_stop_resource="drbd1:0 " CRM_meta_notify_start_uname="dktest1sles10 " CRM_meta_notify_start_resource="drbd1:1 " CRM_meta_notify_demote_resource="drbd1:0 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="9" operation="demote" operation_key="drbd1:0_demote_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="19" operation="stop" operation_key="ms-drbd1_stop_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="2">
+ <action_set>
+ <rsc_op id="44" operation="notify" operation_key="drbd1:0_pre_notify_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <primitive id="drbd1:0" long-id="ms-drbd1:drbd1:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" CRM_meta_notify_operation="stop" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_notify_demote_uname="dktest2sles10 " CRM_meta_notify_stop_uname="dktest2sles10 " CRM_meta_notify_stop_resource="drbd1:0 " CRM_meta_notify_start_uname="dktest1sles10 " CRM_meta_notify_start_resource="drbd1:1 " CRM_meta_notify_demote_resource="drbd1:0 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="21" operation="notify" operation_key="ms-drbd1_pre_notify_stop_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="3">
+ <action_set>
+ <rsc_op id="45" operation="notify" operation_key="drbd1:0_pre_notify_demote_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <primitive id="drbd1:0" long-id="ms-drbd1:drbd1:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" CRM_meta_notify_operation="demote" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_notify_demote_uname="dktest2sles10 " CRM_meta_notify_stop_uname="dktest2sles10 " CRM_meta_notify_stop_resource="drbd1:0 " CRM_meta_notify_start_uname="dktest1sles10 " CRM_meta_notify_start_resource="drbd1:1 " CRM_meta_notify_demote_resource="drbd1:0 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="33" operation="notify" operation_key="ms-drbd1_pre_notify_demote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="4" priority="1000000">
+ <action_set>
+ <rsc_op id="46" operation="notify" operation_key="drbd1:0_post_notify_demote_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <primitive id="drbd1:0" long-id="ms-drbd1:drbd1:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" CRM_meta_notify_operation="demote" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_notify_demote_uname="dktest2sles10 " CRM_meta_notify_stop_uname="dktest2sles10 " CRM_meta_notify_stop_resource="drbd1:0 " CRM_meta_notify_start_uname="dktest1sles10 " CRM_meta_notify_start_resource="drbd1:1 " CRM_meta_notify_demote_resource="drbd1:0 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="35" operation="notify" operation_key="ms-drbd1_post_notify_demote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="5">
+ <action_set>
+ <rsc_op id="7" operation="monitor" operation_key="drbd1:1_monitor_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d">
+ <primitive id="drbd1:1" long-id="ms-drbd1:drbd1:1" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_op_target_rc="7" CRM_meta_globally_unique="false" CRM_meta_clone="1" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="6">
+ <action_set>
+ <rsc_op id="11" operation="start" operation_key="drbd1:1_start_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d">
+ <primitive id="drbd1:1" long-id="ms-drbd1:drbd1:1" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_notify_demote_uname="dktest2sles10 " CRM_meta_notify_stop_uname="dktest2sles10 " CRM_meta_timeout="20000" CRM_meta_notify_stop_resource="drbd1:0 " CRM_meta_notify_start_uname="dktest1sles10 " CRM_meta_notify_start_resource="drbd1:1 " CRM_meta_notify_demote_resource="drbd1:0 " CRM_meta_globally_unique="false" CRM_meta_clone="1" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="13" operation="start" operation_key="ms-drbd1_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="7">
+ <action_set>
+ <rsc_op id="12" operation="monitor" operation_key="drbd1:1_monitor_11000" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d">
+ <primitive id="drbd1:1" long-id="ms-drbd1:drbd1:1" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_id="op-ms-drbd1-2" CRM_meta_start_delay="30000" CRM_meta_role="Slave" CRM_meta_timeout="45000" CRM_meta_name="monitor" CRM_meta_interval="11000" CRM_meta_globally_unique="false" CRM_meta_clone="1" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="11" operation="start" operation_key="drbd1:1_start_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="18" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="8" priority="1000000">
+ <action_set>
+ <rsc_op id="47" operation="notify" operation_key="drbd1:1_post_notify_start_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d">
+ <primitive id="drbd1:1" long-id="ms-drbd1:drbd1:1" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.1" CRM_meta_notify_operation="start" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" drbd_resource="drbd1" CRM_meta_stateful="true" CRM_meta_notify_demote_uname="dktest2sles10 " CRM_meta_notify_stop_uname="dktest2sles10 " CRM_meta_notify_stop_resource="drbd1:0 " CRM_meta_notify_start_uname="dktest1sles10 " CRM_meta_notify_start_resource="drbd1:1 " CRM_meta_notify_demote_resource="drbd1:0 " CRM_meta_globally_unique="false" CRM_meta_clone="1" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="17" operation="notify" operation_key="ms-drbd1_post_notify_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="9">
+ <action_set>
+ <pseudo_event id="13" operation="start" operation_key="ms-drbd1_start_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="4" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="16" operation="notified" operation_key="ms-drbd1_confirmed-pre_notify_start_0"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="19" operation="stop" operation_key="ms-drbd1_stop_0"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="20" operation="stopped" operation_key="ms-drbd1_stopped_0"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="24" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_stop_0"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="32" operation="demoted" operation_key="ms-drbd1_demoted_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="10" priority="1000000">
+ <action_set>
+ <pseudo_event id="14" operation="running" operation_key="ms-drbd1_running_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="11" operation="start" operation_key="drbd1:1_start_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="13" operation="start" operation_key="ms-drbd1_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="11">
+ <action_set>
+ <pseudo_event id="15" operation="notify" operation_key="ms-drbd1_pre_notify_start_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" CRM_meta_notify_operation="start" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="24" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_stop_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="12">
+ <action_set>
+ <pseudo_event id="16" operation="notified" operation_key="ms-drbd1_confirmed-pre_notify_start_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="start" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="15" operation="notify" operation_key="ms-drbd1_pre_notify_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="13" priority="1000000">
+ <action_set>
+ <pseudo_event id="17" operation="notify" operation_key="ms-drbd1_post_notify_start_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" CRM_meta_notify_operation="start" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="14" operation="running" operation_key="ms-drbd1_running_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="14" priority="1000000">
+ <action_set>
+ <pseudo_event id="18" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_start_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="start" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="17" operation="notify" operation_key="ms-drbd1_post_notify_start_0"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="47" operation="notify" operation_key="drbd1:1_post_notify_start_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="15">
+ <action_set>
+ <pseudo_event id="19" operation="stop" operation_key="ms-drbd1_stop_0">
+ <attributes crm_feature_set="2.1" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="22" operation="notified" operation_key="ms-drbd1_confirmed-pre_notify_stop_0"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="31" operation="demote" operation_key="ms-drbd1_demote_0"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="32" operation="demoted" operation_key="ms-drbd1_demoted_0"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="36" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_demote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="16" priority="1000000">
+ <action_set>
+ <pseudo_event id="20" operation="stopped" operation_key="ms-drbd1_stopped_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="10" operation="stop" operation_key="drbd1:0_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="19" operation="stop" operation_key="ms-drbd1_stop_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="17">
+ <action_set>
+ <pseudo_event id="21" operation="notify" operation_key="ms-drbd1_pre_notify_stop_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" CRM_meta_notify_operation="stop" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="36" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_demote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="18">
+ <action_set>
+ <pseudo_event id="22" operation="notified" operation_key="ms-drbd1_confirmed-pre_notify_stop_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="stop" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="21" operation="notify" operation_key="ms-drbd1_pre_notify_stop_0"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="44" operation="notify" operation_key="drbd1:0_pre_notify_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="19" priority="1000000">
+ <action_set>
+ <pseudo_event id="23" operation="notify" operation_key="ms-drbd1_post_notify_stop_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" CRM_meta_notify_operation="stop" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="20" operation="stopped" operation_key="ms-drbd1_stopped_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="20" priority="1000000">
+ <action_set>
+ <pseudo_event id="24" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_stop_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="stop" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="23" operation="notify" operation_key="ms-drbd1_post_notify_stop_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="21">
+ <action_set>
+ <pseudo_event id="31" operation="demote" operation_key="ms-drbd1_demote_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="34" operation="notified" operation_key="ms-drbd1_confirmed-pre_notify_demote_0"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="37" operation="stop" operation_key="testip_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="22" priority="1000000">
+ <action_set>
+ <pseudo_event id="32" operation="demoted" operation_key="ms-drbd1_demoted_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="9" operation="demote" operation_key="drbd1:0_demote_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="31" operation="demote" operation_key="ms-drbd1_demote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="23">
+ <action_set>
+ <pseudo_event id="33" operation="notify" operation_key="ms-drbd1_pre_notify_demote_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" CRM_meta_notify_operation="demote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="24">
+ <action_set>
+ <pseudo_event id="34" operation="notified" operation_key="ms-drbd1_confirmed-pre_notify_demote_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="demote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="33" operation="notify" operation_key="ms-drbd1_pre_notify_demote_0"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="45" operation="notify" operation_key="drbd1:0_pre_notify_demote_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="25" priority="1000000">
+ <action_set>
+ <pseudo_event id="35" operation="notify" operation_key="ms-drbd1_post_notify_demote_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" CRM_meta_notify_operation="demote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="32" operation="demoted" operation_key="ms-drbd1_demoted_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="26" priority="1000000">
+ <action_set>
+ <pseudo_event id="36" operation="notified" operation_key="ms-drbd1_confirmed-post_notify_demote_0">
+ <attributes crm_feature_set="2.1" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="demote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="35" operation="notify" operation_key="ms-drbd1_post_notify_demote_0"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="46" operation="notify" operation_key="drbd1:0_post_notify_demote_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="27">
+ <action_set>
+ <rsc_op id="8" operation="monitor" operation_key="testip_monitor_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d">
+ <primitive id="testip" long-id="testip" class="ocf" provider="heartbeat" type="IPaddr2"/>
+ <attributes crm_feature_set="2.1" ip="10.200.200.222" cidr_netmask="24" broadcast="10.200.200.255" nic="eth1" CRM_meta_timeout="20000" CRM_meta_op_target_rc="7"/>
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="28">
+ <action_set>
+ <rsc_op id="37" operation="stop" operation_key="testip_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <primitive id="testip" long-id="testip" class="ocf" provider="heartbeat" type="IPaddr2"/>
+ <attributes crm_feature_set="2.1" CRM_meta_timeout="20000"/>
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="29">
+ <action_set>
+ <pseudo_event id="3" operation="all_stopped" operation_key="all_stopped">
+ <attributes crm_feature_set="2.1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="10" operation="stop" operation_key="drbd1:0_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="37" operation="stop" operation_key="testip_stop_0" on_node="dktest2sles10" on_node_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="30">
+ <action_set>
+ <pseudo_event id="4" operation="probe_complete" operation_key="probe_complete">
+ <attributes crm_feature_set="2.1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="6" operation="probe_complete" operation_key="probe_complete" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="31" priority="1000000">
+ <action_set>
+ <rsc_op id="6" operation="probe_complete" operation_key="probe_complete" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d">
+ <attributes crm_feature_set="2.1" CRM_meta_op_no_wait="true"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="7" operation="monitor" operation_key="drbd1:1_monitor_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="8" operation="monitor" operation_key="testip_monitor_0" on_node="dktest1sles10" on_node_uuid="c563f60c-45a8-439e-85dc-645f4ecc150d"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ </transition_graph>
+
diff --git a/pengine/testcases/clone-no-shuffle.xml b/pengine/testcases/clone-no-shuffle.xml
new file mode 100644
index 0000000000..a46b729153
--- /dev/null
+++ b/pengine/testcases/clone-no-shuffle.xml
@@ -0,0 +1,110 @@
+ <cib generated="true" admin_epoch="0" epoch="5" num_updates="41" ignore_dtd="false" num_peers="2" have_quorum="1" cib_feature_revision="2.0" crm_feature_set="2.1" dc_uuid="6676c8d5-552e-4a86-a2ea-172e954f7342" ccm_transition="4" cib-last-written="Wed Mar 26 11:55:00 2008">
+ <configuration>
+ <crm_config>
+ <cluster_property_set id="cib-bootstrap-options">
+ <attributes>
+ <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="0.6.2-node: 7f22385d1b41c36c4cc54f292e55869caa94ab7e"/>
+ <nvpair name="no-quorum-policy" value="stop" id="no-quorum-policy"/>
+ <nvpair name="symmetric-cluster" value="true" id="symmetric-cluster"/>
+ <nvpair name="stonith-enabled" value="true" id="stonith-enabled"/>
+ <nvpair name="stonith-action" value="reboot" id="stonith-action"/>
+ <nvpair name="default-resource-stickiness" value="0" id="default-resource-stickiness"/>
+ <nvpair name="default-resource-failure-stickiness" value="-100" id="default-resource-failure-stickiness"/>
+ <nvpair name="is-managed-default" value="true" id="is-managed-default"/>
+ <nvpair name="default-action-timeout" value="20s" id="default-action-timeout"/>
+ <nvpair name="stop-orphan-resources" value="true" id="stop-orphan-resources"/>
+ <nvpair name="stop-orphan-actions" value="true" id="stop-orphan-actions"/>
+ <nvpair name="remove-after-stop" value="false" id="remove-after-stop"/>
+ <nvpair name="startup-fencing" value="true" id="startup-fencing"/>
+ <nvpair name="last-lrm-refresh" id="cib-bootstrap-options-last-lrm-refresh" value="1204805697"/>
+ </attributes>
+ </cluster_property_set>
+ </crm_config>
+ <nodes>
+ <node id="6676c8d5-552e-4a86-a2ea-172e954f7342" uname="dktest2sles10" type="normal"/>
+ <node id="c563f60c-45a8-439e-85dc-645f4ecc150d" uname="dktest1sles10" type="normal"/>
+ </nodes>
+ <resources>
+ <master_slave id="ms-drbd1">
+ <meta_attributes id="ma-ms-drbd1">
+ <attributes>
+ <nvpair id="ma-ms-drbd1-1" name="clone_max" value="2"/>
+ <nvpair id="ma-ms-drbd1-2" name="clone_node_max" value="1"/>
+ <nvpair id="ma-ms-drbd1-3" name="master_max" value="1"/>
+ <nvpair id="ma-ms-drbd1-4" name="master_node_max" value="1"/>
+ <nvpair id="ma-ms-drbd1-5" name="notify" value="yes"/>
+ <nvpair id="ma-ms-drbd1-6" name="globally_unique" value="false"/>
+ <nvpair id="ma-ms-drbd1-7" name="target_role" value="started"/>
+ </attributes>
+ </meta_attributes>
+ <primitive class="ocf" provider="heartbeat" type="drbd" id="drbd1">
+ <instance_attributes id="ia-drbd1">
+ <attributes>
+ <nvpair id="ia-drbd1-1" name="drbd_resource" value="drbd1"/>
+ </attributes>
+ </instance_attributes>
+ <operations>
+ <op id="op-ms-drbd1-1" name="monitor" interval="10s" timeout="15s" start_delay="30s" role="Master"/>
+ <op id="op-ms-drbd1-2" name="monitor" interval="11s" timeout="15s" start_delay="30s" role="Slave"/>
+ </operations>
+ </primitive>
+ </master_slave>
+ <primitive id="testip" class="ocf" type="IPaddr2" provider="heartbeat">
+ <instance_attributes id="ia-testip">
+ <attributes>
+ <nvpair id="ia-testip-1" name="ip" value="10.200.200.222"/>
+ <nvpair id="ia-testip-2" name="broadcast" value="10.200.200.255"/>
+ <nvpair id="ia-testip-3" name="nic" value="eth1"/>
+ <nvpair id="ia-testip-4" name="cidr_netmask" value="24"/>
+ </attributes>
+ </instance_attributes>
+ <operations>
+ <op id="op-proftpd-1" name="monitor" interval="21s" timeout="5s" start_delay="21s"/>
+ </operations>
+ </primitive>
+ </resources>
+ <constraints>
+ <rsc_order id="drbd1_before_testip" from="testip" action="start" to="ms-drbd1" to_action="promote"/>
+ <rsc_colocation id="testip_on_drbd1" to="ms-drbd1" to_role="master" from="testip" score="infinity"/>
+ </constraints>
+ </configuration>
+ <status>
+ <node_state id="6676c8d5-552e-4a86-a2ea-172e954f7342" uname="dktest2sles10" crmd="online" crm-debug-origin="do_lrm_query" shutdown="0" ha="active" in_ccm="true" join="member" expected="member">
+ <transient_attributes id="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <instance_attributes id="status-6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <attributes>
+ <nvpair id="status-6676c8d5-552e-4a86-a2ea-172e954f7342-pingd10220" name="pingd10220" value="750"/>
+ <nvpair id="status-6676c8d5-552e-4a86-a2ea-172e954f7342-probe_complete" name="probe_complete" value="true"/>
+ <nvpair id="status-6676c8d5-552e-4a86-a2ea-172e954f7342-fail-count-drbd1:0" name="fail-count-drbd1:0" value="1"/>
+ </attributes>
+ </instance_attributes>
+ <instance_attributes id="master-6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <attributes>
+ <nvpair id="status-master-drbd1:0-6676c8d5-552e-4a86-a2ea-172e954f7342" name="master-drbd1:0" value="10"/>
+ </attributes>
+ </instance_attributes>
+ </transient_attributes>
+ <lrm id="6676c8d5-552e-4a86-a2ea-172e954f7342">
+ <lrm_resources>
+ <lrm_resource id="drbd1:0" type="drbd" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="drbd1:0_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" transition_key="4:3:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="4:7;4:3:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="2" crm_feature_set="2.1" rc_code="7" op_status="4" interval="0" last_run="96950" last_rc_change="96950" exec_time="100" queue_time="0" op_digest="b9cf2b3d762cdf1ed2eb02a10ad36f06"/>
+ <lrm_rsc_op id="drbd1:0_start_0" operation="start" crm-debug-origin="build_active_RAs" transition_key="9:3:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="0:0;9:3:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="4" crm_feature_set="2.1" rc_code="0" op_status="0" interval="0" last_run="95500" last_rc_change="95500" exec_time="150" queue_time="0" op_digest="b9cf2b3d762cdf1ed2eb02a10ad36f06"/>
+ <lrm_rsc_op id="drbd1:0_promote_0" operation="promote" crm-debug-origin="build_active_RAs" transition_key="8:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="0:0;8:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="7" crm_feature_set="2.1" rc_code="0" op_status="0" interval="0" last_run="91010" last_rc_change="91010" exec_time="130" queue_time="0" op_digest="b9cf2b3d762cdf1ed2eb02a10ad36f06"/>
+ <lrm_rsc_op id="drbd1:0_monitor_10000" operation="monitor" crm-debug-origin="build_active_RAs" transition_key="9:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="4:8;9:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="10" crm_feature_set="2.1" rc_code="8" op_status="4" interval="10000" last_run="8190" last_rc_change="58500" exec_time="50" queue_time="0" op_digest="e54028ea0c87b98f35b3e83c3bc800d6"/>
+ <lrm_rsc_op id="drbd1:0_post_notify_stop_0" operation="notify" crm-debug-origin="build_active_RAs" transition_key="47:5:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="0:0;47:5:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="13" crm_feature_set="2.1" rc_code="0" op_status="0" interval="0" last_run="52000" last_rc_change="52000" exec_time="90" queue_time="0" op_digest="b9cf2b3d762cdf1ed2eb02a10ad36f06"/>
+ </lrm_resource>
+ <lrm_resource id="testip" type="IPaddr2" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="testip_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" transition_key="5:3:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="4:7;5:3:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="3" crm_feature_set="2.1" rc_code="7" op_status="4" interval="0" last_run="96950" last_rc_change="96950" exec_time="70" queue_time="0" op_digest="8ef566e41dbc36177896c80fa7d2176b"/>
+ <lrm_rsc_op id="testip_start_0" operation="start" crm-debug-origin="build_active_RAs" transition_key="38:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="0:0;38:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="9" crm_feature_set="2.1" rc_code="0" op_status="0" interval="0" last_run="88520" last_rc_change="88520" exec_time="60" queue_time="0" op_digest="8ef566e41dbc36177896c80fa7d2176b"/>
+ <lrm_rsc_op id="testip_monitor_21000" operation="monitor" crm-debug-origin="build_active_RAs" transition_key="39:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" transition_magic="0:0;39:4:9d0bfd83-75ef-4da1-bc8d-8ee972b05fc3" call_id="11" crm_feature_set="2.1" rc_code="0" op_status="0" interval="21000" last_run="4300" last_rc_change="67420" exec_time="40" queue_time="0" op_digest="179ca11a2bb1cedf4bb653e653bd6ba9"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ </node_state>
+ <node_state id="c563f60c-45a8-439e-85dc-645f4ecc150d" uname="dktest1sles10" crmd="online" crm-debug-origin="do_lrm_query" ha="active" in_ccm="true" join="member" expected="member" shutdown="0">
+ <lrm id="c563f60c-45a8-439e-85dc-645f4ecc150d">
+ <lrm_resources/>
+ </lrm>
+ </node_state>
+ </status>
+ </cib>
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Jan 25, 7:03 AM (1 d, 19 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1321602
Default Alt Text
(114 KB)
Attached To
Mode
rP Pacemaker
Attached
Detach File
Event Timeline
Log In to Comment