86 const GList *iter = NULL;
90 for (iter = rsc->
priv->
children; iter != NULL; iter = iter->next) {
97 for (iter = rsc->
priv->
actions; iter != NULL; iter = iter->next) {
100 if (*promoting && *demoting) {
131 const GList *location_constraints,
134 for (
const GList *iter = location_constraints; iter; iter = iter->next) {
142 if (constraint_node != NULL) {
147 "Applying location %s to %s promotion priority on "
149 location->
id, child->
id,
150 pcmk__node_name(constraint_node),
176 iter != NULL; iter = iter->next) {
180 if (node_to_be_promoted_on(child) == NULL) {
182 "%s can't be promoted because member %s can't",
190 pcmk__rsc_trace(rsc,
"%s can't be promoted because it won't be active",
196 crm_notice(
"Unmanaged instance %s will be left promoted on %s",
197 rsc->
id, pcmk__node_name(node));
206 "%s can't be promoted because its promotion priority "
213 "%s can't be promoted because %s can't run resources",
214 rsc->
id, pcmk__node_name(node));
219 local_node = g_hash_table_lookup(
parent->priv->allowed_nodes,
222 if (local_node == NULL) {
229 "%s can't be promoted because %s is not allowed "
230 "on %s (scheduler bug?)",
231 rsc->
id,
parent->id, pcmk__node_name(node));
238 "%s can't be promoted because %s has "
239 "maximum promoted instances already",
240 rsc->
id, pcmk__node_name(node));
259cmp_promotable_instance(gconstpointer a, gconstpointer b)
272 "%s has higher promotion priority (%s) than %s (%d)",
281 "%s has lower promotion priority (%s) than %s (%d)",
293 "%s has higher promotion priority than %s "
294 "(higher current role)",
297 }
else if (role1 < role2) {
299 "%s has lower promotion priority than %s "
300 "(lower current role)",
321add_promotion_priority_to_node_score(gpointer
data, gpointer user_data)
330 if (promotion_priority < 0) {
332 "Not adding promotion priority of %s: negative (%s)",
338 if (chosen == NULL) {
339 pcmk__rsc_trace(clone,
"Not adding promotion priority of %s: inactive",
351 "Added cumulative priority of %s (%s) to score on %s "
365apply_coloc_to_primary(gpointer
data, gpointer user_data)
379 pcmk__rsc_trace(clone,
"Applying colocation %s (%s with promoted %s) @%s",
386 colocation, factor,
flags);
397set_promotion_priority_to_node_score(gpointer
data, gpointer user_data)
409 "Final promotion priority for %s is %s "
410 "(unmanaged promoted)",
413 }
else if (chosen == NULL) {
416 "Final promotion priority for %s is %s "
417 "(will not be active)",
422 "Final promotion priority for %s is %s "
423 "(ignoring node score)",
436 "Adding scores for %s: "
437 "final promotion priority for %s is %s",
438 clone->
id, child->
id,
452 GList *colocations = NULL;
461 iter != NULL; iter = iter->next) {
466 "Adding scores for %s: "
467 "initial promotion priority for %s is %s",
468 clone->
id, child->
id,
475 add_promotion_priority_to_node_score, clone);
479 g_list_foreach(colocations, apply_coloc_to_primary, clone);
480 g_list_free(colocations);
490 set_promotion_priority_to_node_score, clone);
494 cmp_promotable_instance);
512 for (GList *iter = clone->
priv->
children; iter; iter = iter->next) {
520 if (active != NULL) {
541 for (GList *iter = clone->
priv->
children; iter; iter = iter->next) {
575 return (allowed != NULL) && (allowed->
assign->
score >= 0);
593 const char *reason =
"allowed";
599 active = find_active_anon_instance(
parent,
id, node);
608 if ((active == NULL) && anonymous_known_on(
parent,
id, node)) {
620 reason =
"none probed";
630 node->
priv->
id) != NULL)) {
634 "Ignoring %s promotion score (for %s) on %s: "
636 rsc->
id,
id, pcmk__node_name(node));
642 if (is_allowed(rsc, node)) {
644 rsc->
id,
id, pcmk__node_name(node), reason);
650 "Ignoring %s promotion score (for %s) on %s: not allowed",
651 rsc->
id,
id, pcmk__node_name(node));
670 char *attr_name = NULL;
671 const char *attr_value = NULL;
672 const char *
target = NULL;
703 const char *
name = NULL;
704 const char *attr_value = NULL;
706 if (is_default != NULL) {
710 CRM_CHECK((rsc != NULL) && (node != NULL),
return 0);
719 iter != NULL; iter = iter->next) {
722 bool child_default =
false;
723 int child_score = promotion_score(child, node, &child_default);
725 if (!child_default && (is_default != NULL)) {
728 score += child_score;
733 if (!promotion_score_applies(rsc, node)) {
743 attr_value = promotion_attr_value(rsc, node,
name);
744 if (attr_value != NULL) {
746 name, pcmk__node_name(node),
747 pcmk__s(attr_value,
"(unset)"));
755 if (strcmp(rsc->
id, rsc_name) != 0) {
756 attr_value = promotion_attr_value(rsc, node, rsc_name);
758 rsc_name, pcmk__node_name(node), rsc->
id,
759 pcmk__s(attr_value,
"(unset)"));
764 if (attr_value == NULL) {
768 if (is_default != NULL) {
774 crm_warn(
"Using 0 as promotion score for %s on %s "
775 "because '%s' is not a valid score",
776 rsc->
id, pcmk__node_name(node), attr_value);
796 iter != NULL; iter = iter->next) {
802 int score, new_score;
805 while (g_hash_table_iter_next(&iter, NULL, (
void **) &node)) {
813 score = promotion_score(child_rsc, node, NULL);
819 "Added %s promotion priority (%s) to score "
822 pcmk__node_name(node),
829 "Updating %s priority to promotion score "
847set_current_role_unpromoted(
void *
data,
void *user_data)
855 g_list_foreach(rsc->
priv->
children, set_current_role_unpromoted, NULL);
866set_next_role_unpromoted(
void *
data,
void *user_data)
869 GList *assigned = NULL;
872 if (assigned == NULL) {
876 g_list_free(assigned);
878 g_list_foreach(rsc->
priv->
children, set_next_role_unpromoted, NULL);
889set_next_role_promoted(
void *
data, gpointer user_data)
896 g_list_foreach(rsc->
priv->
children, set_next_role_promoted, NULL);
909 const char *score_s = NULL;
921 out->
message(out,
"promotion-score", instance, chosen, score_s);
923 }
else if (chosen == NULL) {
925 "%s promotion score (inactive): %s (priority=%d)",
930 "%s promotion score on %s: %s (priority=%d)",
931 instance->
id, pcmk__node_name(chosen),
944set_instance_priority(gpointer
data, gpointer user_data)
957 set_current_role_unpromoted(instance, NULL);
963 if (pcmk__list_of_multiple(list)) {
968 if (chosen == NULL) {
972 next_role = instance->
priv->
fns->
state(instance,
false);
978 bool is_default =
false;
980 instance->
priv->
priority = promotion_score(instance, chosen,
1006 next_role, instance->
id));
1017 for (GList *iter = list; iter != NULL; iter = iter->next) {
1041set_instance_role(gpointer
data, gpointer user_data)
1044 int *count = (
int *) user_data;
1050 show_promotion_score(instance);
1058 chosen = node_to_be_promoted_on(instance);
1061 if (chosen == NULL) {
1062 set_next_role_unpromoted(instance, NULL);
1069 crm_notice(
"Clone instance %s cannot be promoted without quorum",
1071 set_next_role_unpromoted(instance, NULL);
1078 pcmk__node_name(chosen));
1079 set_next_role_promoted(instance, NULL);
1093 GHashTableIter iter;
1098 while (g_hash_table_iter_next(&iter, NULL, (
void **)&node)) {
1103 g_list_foreach(rsc->
priv->
children, set_instance_priority, rsc);
1104 sort_promotable_instances(rsc);
1107 g_list_foreach(rsc->
priv->
children, set_instance_role, &promoted);
1108 pcmk__rsc_info(rsc,
"%s: Promoted %d instances of a possible %d",
1123 bool *any_promoting,
bool *any_demoting)
1126 iter != NULL; iter = iter->next) {
1131 check_for_role_change(instance, any_demoting, any_promoting);
1149 iter != NULL; iter = iter->next) {
1166 bool any_promoting =
false;
1167 bool any_demoting =
false;
1170 create_promotable_instance_actions(clone, &any_promoting, &any_demoting);
1176 reset_instance_priorities(clone);
1193 iter != NULL; iter = iter->next) {
1202 order_instance_promotion(clone, instance, previous);
1203 order_instance_demotion(clone, instance, previous);
1204 previous = instance;
1223 GHashTableIter iter;
1225 const char *primary_value = NULL;
1235 "Applying %s (%s with %s on %s by %s @%d) to %s",
1237 colocation->
primary->
id, pcmk__node_name(primary_node),
1238 attr, colocation->
score, dependent->
id);
1241 while (g_hash_table_iter_next(&iter, NULL, (
void **) &node)) {
1249 "Added %s score (%s) to %s (now %s)",
1252 pcmk__node_name(node),
1270 GList *affected_nodes = NULL;
1277 iter != NULL; iter = iter->next) {
1289 update_dependent_allowed_nodes(dependent, primary, node,
1291 affected_nodes = g_list_prepend(affected_nodes, node);
1307 "Applying %s (mandatory %s with %s) to %s",
1311 affected_nodes,
true);
1313 g_list_free(affected_nodes);
1338 if (primary_instance != NULL) {
1344 "Applying %s (%s with %s) to %s priority "
1352 return colocation->
score;
1358 "Applying %s (%s with %s) to %s: can't be promoted",
@ pcmk__ar_then_implies_first_graphed
If 'then' is required, 'first' must be added to the transition graph.
@ pcmk__ar_first_implies_then_graphed
If 'first' is required and runnable, 'then' must be in graph.
@ pcmk__ar_ordered
Actions are ordered (optionally, if no other flags are set)
#define PCMK_ACTION_PROMOTED
#define PCMK_ACTION_PROMOTE
#define PCMK_ACTION_DEMOTED
#define PCMK_ACTION_DEMOTE
const char * pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, enum pcmk__rsc_node node_type)
@ pcmk__clone_promotion_added
@ pcmk__clone_promotion_constrained
char * pcmk_promotion_score_name(const char *rsc_id)
Return the name of the node attribute used as a promotion score.
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
@ pcmk__coloc_select_active
@ pcmk__coloc_select_nonnegative
G_GNUC_INTERNAL void pcmk__require_promotion_tickets(pcmk_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__colocation_intersect_nodes(pcmk_resource_t *dependent, const pcmk_resource_t *primary, const pcmk__colocation_t *colocation, const GList *primary_nodes, bool merge_scores)
#define pcmk__order_resource_actions(first_rsc, first_task, then_rsc, then_task, flags)
G_GNUC_INTERNAL pcmk_resource_t * pcmk__find_compatible_instance(const pcmk_resource_t *match_rsc, const pcmk_resource_t *rsc, enum rsc_role_e role, bool current)
G_GNUC_INTERNAL const char * pcmk__colocation_node_attr(const pcmk_node_t *node, const char *attr, const pcmk_resource_t *rsc)
G_GNUC_INTERNAL GList * pcmk__with_this_colocations(const pcmk_resource_t *rsc)
G_GNUC_INTERNAL gint pcmk__cmp_instance(gconstpointer a, gconstpointer b)
G_GNUC_INTERNAL bool pcmk__colocation_has_influence(const pcmk__colocation_t *colocation, const pcmk_resource_t *rsc)
G_GNUC_INTERNAL GList * pcmk__this_with_colocations(const pcmk_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__promotable_restart_ordering(pcmk_resource_t *rsc)
G_GNUC_INTERNAL bool pcmk__node_available(const pcmk_node_t *node, bool consider_score, bool consider_guest)
#define crm_warn(fmt, args...)
#define CRM_LOG_ASSERT(expr)
#define crm_notice(fmt, args...)
#define CRM_CHECK(expr, failure_action)
#define crm_err(fmt, args...)
#define pcmk__config_err(fmt...)
pcmk_scheduler_t * scheduler
#define PCMK_META_CONTAINER_ATTRIBUTE_TARGET
void pe__create_promotable_pseudo_ops(pcmk_resource_t *clone, bool any_promoting, bool any_demoting)
int pe__clone_promoted_node_max(const pcmk_resource_t *clone)
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
#define pe__show_node_scores(level, rsc, text, nodes, scheduler)
bool pe__clone_is_ordered(const pcmk_resource_t *clone)
int pe__set_clone_flag(pcmk_resource_t *clone, enum pcmk__clone_flags flag)
void pe__set_next_role(pcmk_resource_t *rsc, enum rsc_role_e role, const char *why)
char * clone_strip(const char *last_rsc_id)
int pe__clone_promoted_max(const pcmk_resource_t *clone)
@ pcmk_rsc_match_clone_only
Match only clones and their instances, by either clone or instance ID.
@ pcmk_rsc_match_current_node
If matching by node, compare current node instead of assigned node.
@ pcmk__rsc_updating_nodes
#define pcmk__set_rsc_flags(resource, flags_to_set)
@ pcmk__rsc_node_assigned
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
#define pcmk__assert(expr)
const char * pcmk_role_text(enum rsc_role_e role)
Get readable description of a resource role.
@ pcmk_role_started
Started.
@ pcmk_role_unknown
Resource role is unknown.
@ pcmk_role_unpromoted
Unpromoted.
@ pcmk_role_promoted
Promoted.
@ pcmk_role_stopped
Stopped.
@ pcmk_no_quorum_freeze
Do not recover resources from outside partition.
#define pcmk__sched_err(scheduler, fmt...)
#define pcmk__rsc_info(rsc, fmt, args...)
#define pcmk__rsc_trace(rsc, fmt, args...)
#define pcmk__rsc_debug(rsc, fmt, args...)
@ pcmk__sched_output_scores
int pcmk_parse_score(const char *score_s, int *score, int default_score)
Parse an integer score from a string.
const char * pcmk_readable_score(int score)
Return a displayable static string for a score value.
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
int pcmk__add_scores(int score1, int score2)
pcmk_node_t * pe_find_node_id(const GList *node_list, const char *id)
Find a node by ID in a list of nodes.
void(* create_actions)(pcmk_resource_t *rsc)
int(* apply_coloc_score)(pcmk_resource_t *dependent, const pcmk_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
void(* add_colocated_node_scores)(pcmk_resource_t *source_rsc, const pcmk_resource_t *target_rsc, const char *log_id, GHashTable **nodes, const pcmk__colocation_t *colocation, float factor, uint32_t flags)
const char * node_attribute
pcmk_resource_t * primary
pcmk_resource_t * dependent
Location constraint object.
enum rsc_role_e role_filter
pcmk_scheduler_t * scheduler
This structure contains everything that makes up a single output formatter.
int(* message)(pcmk__output_t *out, const char *message_id,...)
GHashTable * probed_nodes
pcmk_scheduler_t * scheduler
enum rsc_role_e orig_role
enum rsc_role_e next_role
const pcmk__assignment_methods_t * cmds
const pcmk__rsc_methods_t * fns
GHashTable * allowed_nodes
GList * location_constraints
pcmk__resource_private_t * priv
pcmk_resource_t *(* find_rsc)(pcmk_resource_t *rsc, const char *search, const pcmk_node_t *node, uint32_t flags)
enum rsc_role_e(* state)(const pcmk_resource_t *rsc, bool current)
pcmk_node_t *(* location)(const pcmk_resource_t *rsc, GList **list, uint32_t target)
pcmk__scheduler_private_t * priv
enum pe_quorum_policy no_quorum_policy
pcmk__node_private_t * priv
struct pcmk__node_assignment * assign
Wrappers for and extensions to libxml2.