112 const xmlNode *rsc_entry,
bool active_on_node)
114 bool changed =
false;
115 const char *attr_list[] = {
129 if (active_on_node) {
131 "because %s changed from '%s' to '%s'",
132 rsc->
id, pe__node_name(node), attr_list[i],
133 pcmk__s(old_value,
""), pcmk__s(value,
""));
137 if (changed && active_on_node) {
159 if ((strcmp(rsc->
id,
id) == 0)
163 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
202 set_allocation_methods_for_rsc(
pe_resource_t *rsc,
void *ignored)
205 g_list_foreach(rsc->
children, (GFunc) set_allocation_methods_for_rsc, NULL);
224 GList *colocated_rscs)
226 const GList *iter = NULL;
227 GList *colocations = NULL;
229 if (orig_rsc == NULL) {
233 if ((rsc == NULL) || (g_list_find(colocated_rscs, rsc) != NULL)) {
234 return colocated_rscs;
237 pe_rsc_trace(orig_rsc,
"%s is in colocation chain with %s",
238 rsc->
id, orig_rsc->
id);
239 colocated_rscs = g_list_prepend(colocated_rscs, (gpointer) rsc);
243 for (iter = colocations; iter != NULL; iter = iter->next) {
247 if (primary == orig_rsc) {
260 g_list_free(colocations);
264 for (iter = colocations; iter != NULL; iter = iter->next) {
268 if (dependent == orig_rsc) {
272 if (pe_rsc_is_clone(rsc) && !pe_rsc_is_clone(dependent)) {
285 g_list_free(colocations);
287 return colocated_rscs;
305 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
315 current = pe__current_node(rsc);
329 out->
message(out,
"rsc-action", rsc, current, next);
360 if (!force && (chosen != NULL)) {
366 crm_debug(
"All nodes for resource %s are unavailable, unclean or " 367 "shutting down (%s can%s run resources, with weight %d)",
368 rsc->
id, pe__node_name(chosen),
379 if (chosen == NULL) {
380 crm_debug(
"Could not allocate a node for %s", rsc->
id);
383 for (GList *iter = rsc->
actions; iter != NULL; iter = iter->next) {
397 const char *interval_ms_s = NULL;
398 const char *target_rc_s = NULL;
401 interval_ms_s = g_hash_table_lookup(op->
meta,
403 target_rc_s = g_hash_table_lookup(op->
meta,
405 if ((interval_ms_s != NULL)
416 crm_debug(
"Assigning %s to %s", rsc->
id, pe__node_name(chosen));
426 out->
message(out,
"resource-util", rsc, chosen, __func__);
454 bool changed =
false;
463 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
491 crm_info(
"Unassigning %s from %s", rsc->
id, pe__node_name(old));
520 int fail_count, remaining_tries;
536 if (fail_count <= 0) {
548 if (remaining_tries <= 0) {
549 crm_warn(
"%s cannot run on %s due to reaching migration threshold " 550 "(clean up resource to allow again)" 551 CRM_XS " failures=%d migration-threshold=%d",
552 rsc_to_ban->
id, pe__node_name(node), fail_count,
554 if (failed != NULL) {
555 *failed = rsc_to_ban;
560 crm_info(
"%s can fail %d more time%s on " 561 "%s before reaching migration threshold (%d)",
568 convert_const_pointer(
const void *ptr)
584 get_node_weight(
const pe_node_t *node, GHashTable *nodes)
588 if ((node != NULL) && (nodes != NULL)) {
589 weighted_node = g_hash_table_lookup(nodes, node->
details->
id);
591 return (weighted_node == NULL)? -
INFINITY : weighted_node->
weight;
606 cmp_resources(gconstpointer a, gconstpointer b, gpointer
data)
610 const GList *nodes = (
const GList *)
data;
617 GHashTable *r1_nodes = NULL;
618 GHashTable *r2_nodes = NULL;
619 const char *reason = NULL;
625 if (r1_weight > r2_weight) {
629 if (r1_weight < r2_weight) {
635 reason =
"no node list";
642 resource1->
id, &r1_nodes, NULL,
645 resource2->
id, &r2_nodes, NULL,
653 reason =
"current location";
655 r1_node = pe__current_node(resource1);
658 r2_node = pe__current_node(resource2);
660 r1_weight = get_node_weight(r1_node, r1_nodes);
661 r2_weight = get_node_weight(r2_node, r2_nodes);
662 if (r1_weight > r2_weight) {
666 if (r1_weight < r2_weight) {
673 for (
const GList *iter = nodes; iter != NULL; iter = iter->next) {
676 r1_weight = get_node_weight(node, r1_nodes);
677 r2_weight = get_node_weight(node, r2_nodes);
678 if (r1_weight > r2_weight) {
682 if (r1_weight < r2_weight) {
689 crm_trace(
"%s (%d)%s%s %c %s (%d)%s%s: %s",
690 resource1->
id, r1_weight,
691 ((r1_node == NULL)?
"" :
" on "),
692 ((r1_node == NULL)?
"" : r1_node->
details->
id),
693 ((rc < 0)?
'>' : ((rc > 0)?
'<' :
'=')),
694 resource2->
id, r2_weight,
695 ((r2_node == NULL)?
"" :
" on "),
696 ((r2_node == NULL)?
"" : r2_node->
details->
id),
698 if (r1_nodes != NULL) {
699 g_hash_table_destroy(r1_nodes);
701 if (r2_nodes != NULL) {
702 g_hash_table_destroy(r2_nodes);
720 cmp_resources, nodes);
void pcmk__set_allocation_methods(pe_working_set_t *data_set)
#define CRM_CHECK(expr, failure_action)
G_GNUC_INTERNAL pe_node_t * pcmk__primitive_assign(pe_resource_t *rsc, const pe_node_t *prefer)
G_GNUC_INTERNAL GList * pcmk__group_colocated_resources(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList *colocated_rscs)
#define crm_notice(fmt, args...)
G_GNUC_INTERNAL void pcmk__release_node_capacity(GHashTable *current_utilization, const pe_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__add_rsc_actions_to_graph(pe_resource_t *rsc)
void clone_append_meta(const pe_resource_t *rsc, xmlNode *xml)
G_GNUC_INTERNAL uint32_t pcmk__update_ordered_actions(pe_action_t *first, pe_action_t *then, const pe_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pe_working_set_t *data_set)
G_GNUC_INTERNAL void pcmk__primitive_apply_coloc_score(pe_resource_t *dependent, const pe_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
#define pe__show_node_weights(level, rsc, text, nodes, data_set)
int(* message)(pcmk__output_t *out, const char *message_id,...)
void clone_create_actions(pe_resource_t *rsc)
bool clone_create_probe(pe_resource_t *rsc, pe_node_t *node)
G_GNUC_INTERNAL void pcmk__with_bundle_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
resource_alloc_functions_t * cmds
G_GNUC_INTERNAL void pcmk__with_group_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
G_GNUC_INTERNAL void pcmk__clone_with_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
G_GNUC_INTERNAL void pcmk__group_with_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
pe_node_t * pe__copy_node(const pe_node_t *this_node)
G_GNUC_INTERNAL void pcmk__with_clone_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
void clone_expand(pe_resource_t *rsc)
G_GNUC_INTERNAL enum pe_action_flags pcmk__group_action_flags(pe_action_t *action, const pe_node_t *node)
void pcmk__output_resource_actions(pe_resource_t *rsc)
pe_resource_t * dependent
G_GNUC_INTERNAL GList * pcmk__sort_nodes(GList *nodes, pe_node_t *active_node)
bool pcmk__rsc_agent_changed(pe_resource_t *rsc, pe_node_t *node, const xmlNode *rsc_entry, bool active_on_node)
G_GNUC_INTERNAL void pcmk__group_apply_coloc_score(pe_resource_t *dependent, const pe_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
G_GNUC_INTERNAL void pcmk__consume_node_capacity(GHashTable *current_utilization, const pe_resource_t *rsc)
void pcmk__bundle_expand(pe_resource_t *rsc)
G_GNUC_INTERNAL uint32_t pcmk__group_update_ordered_actions(pe_action_t *first, pe_action_t *then, const pe_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pe_working_set_t *data_set)
bool pcmk__bundle_create_probe(pe_resource_t *rsc, pe_node_t *node)
void pcmk__bundle_internal_constraints(pe_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__add_colocated_node_scores(pe_resource_t *rsc, const char *log_id, GHashTable **nodes, const char *attr, float factor, uint32_t flags)
G_GNUC_INTERNAL pe_node_t * pcmk__clone_assign(pe_resource_t *rsc, const pe_node_t *prefer)
bool pcmk__threshold_reached(pe_resource_t *rsc, const pe_node_t *node, pe_resource_t **failed)
#define pe__set_resource_flags(resource, flags_to_set)
void trigger_unfencing(pe_resource_t *rsc, pe_node_t *node, const char *reason, pe_action_t *dependency, pe_working_set_t *data_set)
#define pe_rsc_provisional
void pcmk__noop_add_graph_meta(const pe_resource_t *rsc, xmlNode *xml)
#define crm_warn(fmt, args...)
GList *(* colocated_resources)(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList *colocated_rscs)
void pcmk__bundle_add_utilization(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
#define crm_debug(fmt, args...)
G_GNUC_INTERNAL bool pcmk__node_available(const pe_node_t *node, bool consider_score, bool consider_guest)
pe_resource_t * uber_parent(pe_resource_t *rsc)
G_GNUC_INTERNAL uint32_t pcmk__instance_update_ordered_actions(pe_action_t *first, pe_action_t *then, const pe_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pe_working_set_t *data_set)
GList * pcmk__with_this_colocations(const pe_resource_t *rsc)
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
bool pe__is_guest_node(const pe_node_t *node)
void clone_internal_constraints(pe_resource_t *rsc)
#define pe_rsc_start_pending
#define pe__clear_action_flags(action, flags_to_clear)
#define crm_trace(fmt, args...)
pe_node_t * pcmk__bundle_allocate(pe_resource_t *rsc, const pe_node_t *prefer)
G_GNUC_INTERNAL pe_node_t * pcmk__group_assign(pe_resource_t *rsc, const pe_node_t *prefer)
GList * pcmk__this_with_colocations(const pe_resource_t *rsc)
void pcmk__bundle_shutdown_lock(pe_resource_t *rsc)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
struct pe_node_shared_s * details
G_GNUC_INTERNAL void pcmk__with_primitive_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
#define XML_AGENT_ATTR_PROVIDER
pe_working_set_t * data_set
G_GNUC_INTERNAL void pcmk__primitive_add_graph_meta(const pe_resource_t *rsc, xmlNode *xml)
void(* output_actions)(pe_resource_t *rsc)
bool pcmk__finalize_assignment(pe_resource_t *rsc, pe_node_t *chosen, bool force)
enum pe_action_flags clone_action_flags(pe_action_t *action, const pe_node_t *node)
G_GNUC_INTERNAL bool pcmk__probe_rsc_on_node(pe_resource_t *rsc, pe_node_t *node)
enum pe_obj_types variant
G_GNUC_INTERNAL void pcmk__output_bundle_actions(pe_resource_t *rsc)
GList * pcmk__colocated_resources(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList *colocated_rscs)
G_GNUC_INTERNAL void pcmk__primitive_internal_constraints(pe_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__clone_apply_coloc_score(pe_resource_t *dependent, const pe_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
G_GNUC_INTERNAL void pcmk__apply_location(pe_resource_t *rsc, pe__location_t *constraint)
G_GNUC_INTERNAL void pcmk__group_shutdown_lock(pe_resource_t *rsc)
void pcmk__bundle_create_actions(pe_resource_t *rsc)
pcmk__action_result_t result
#define pe_flag_show_utilization
void pcmk__bundle_rsc_location(pe_resource_t *rsc, pe__location_t *constraint)
void clone_rsc_location(pe_resource_t *rsc, pe__location_t *constraint)
G_GNUC_INTERNAL void pcmk__primitive_with_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
G_GNUC_INTERNAL void pcmk__group_internal_constraints(pe_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__group_create_actions(pe_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__group_add_colocated_node_scores(pe_resource_t *rsc, const char *log_id, GHashTable **nodes, const char *attr, float factor, uint32_t flags)
enum pe_action_flags pcmk__bundle_action_flags(pe_action_t *action, const pe_node_t *node)
G_GNUC_INTERNAL void pcmk__primitive_shutdown_lock(pe_resource_t *rsc)
void pe__set_next_role(pe_resource_t *rsc, enum rsc_role_e role, const char *why)
This structure contains everything that makes up a single output formatter.
#define XML_LRM_ATTR_INTERVAL_MS
G_GNUC_INTERNAL void pcmk__primitive_add_utilization(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
G_GNUC_INTERNAL void pcmk__bundle_with_colocations(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList **list)
void pcmk__sort_resources(pe_working_set_t *data_set)
#define pe__clear_resource_flags(resource, flags_to_clear)
#define pcmk__plural_s(i)
G_GNUC_INTERNAL void pcmk__bundle_apply_coloc_score(pe_resource_t *dependent, const pe_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
G_GNUC_INTERNAL void pcmk__group_add_utilization(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
#define pe_rsc_failure_ignored
pe_working_set_t * cluster
G_GNUC_INTERNAL void pcmk__group_apply_location(pe_resource_t *rsc, pe__location_t *location)
void pcmk__unassign_resource(pe_resource_t *rsc)
GList * pcmk__rscs_matching_id(const char *id, const pe_working_set_t *data_set)
bool pcmk__assign_resource(pe_resource_t *rsc, pe_node_t *node, bool force)
void pcmk__clone_add_utilization(const pe_resource_t *rsc, const pe_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
#define pe_rsc_trace(rsc, fmt, args...)
G_GNUC_INTERNAL void pcmk__primitive_create_actions(pe_resource_t *rsc)
int pe_get_failcount(const pe_node_t *node, pe_resource_t *rsc, time_t *last_failure, uint32_t flags, const xmlNode *xml_op)
pe_action_t * custom_action(pe_resource_t *rsc, char *key, const char *task, const pe_node_t *on_node, gboolean optional, gboolean foo, pe_working_set_t *data_set)
Create or update an action object.
G_GNUC_INTERNAL enum pcmk__coloc_affects pcmk__colocation_affects(const pe_resource_t *dependent, const pe_resource_t *primary, const pcmk__colocation_t *colocation, bool preview)
#define crm_info(fmt, args...)
#define XML_ATTR_TE_TARGET_RC
void(* add_colocated_node_scores)(pe_resource_t *rsc, const char *log_id, GHashTable **nodes, const char *attr, float factor, uint32_t flags)
G_GNUC_INTERNAL enum pe_action_flags pcmk__primitive_action_flags(pe_action_t *action, const pe_node_t *node)
void pcmk__clone_shutdown_lock(pe_resource_t *rsc)
#define XML_AGENT_ATTR_CLASS