50 pcmk__rsc_debug(rsc,
"Assignment dependency loop detected involving %s",
69 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
75 node = member->
cmds->
assign(member, prefer, stop_if_fail);
76 if (first_assigned_node == NULL) {
77 first_assigned_node = node;
87 return first_assigned_node;
123 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
161member_internal_constraints(gpointer
data, gpointer user_data)
164 struct member_data *member_data = (
struct member_data *) user_data;
175 if (member_data->previous_member == NULL) {
177 if (member_data->ordered) {
182 }
else if (member_data->colocated) {
191 member, member_data->previous_member, NULL, NULL,
195 if (member_data->promotable) {
229 if (!member_data->ordered) {
234 if (member_data->promotable) {
242 }
else if (member_data->previous_member == NULL) {
244 if (member_data->promotable) {
266 && (member_data->previous_member->running_on == NULL)) {
268 member_data->previous_member,
274 if (member_data->promotable) {
281 member_data->previous_member,
288 if (member_data->ordered && (member_data->previous_member != NULL)
289 && (member_data->previous_member->running_on == NULL)
290 && (member_data->last_active != NULL)
291 && (member_data->last_active->running_on != NULL)) {
295 member_data->last_active = member;
298 member_data->previous_member = member;
310 struct member_data member_data = {
false, };
333 g_list_foreach(rsc->
children, member_internal_constraints, &member_data);
358 pcmk__rsc_trace(primary,
"Processing %s (group %s with %s) for dependent",
359 colocation->
id, dependent->
id, primary->
id);
370 "non-colocated group and %s",
371 dependent->
id, primary->
id);
376 for (GList *iter = dependent->
children; iter != NULL; iter = iter->next) {
401 "Processing colocation %s (%s with group %s) for primary",
402 colocation->
id, dependent->
id, primary->
id);
416 }
else if (primary->
children != NULL) {
423 if (member == NULL) {
433 " non-colocated group %s",
434 dependent->
id, primary->
id);
439 for (
const GList *iter = primary->
children; iter != NULL;
465 CRM_ASSERT((dependent != NULL) && (primary != NULL)
466 && (colocation != NULL));
469 colocate_group_with(dependent, primary, colocation);
475 colocate_with_group(dependent, primary, colocation);
499 for (GList *iter =
action->rsc->children; iter != NULL; iter = iter->next) {
508 if (member_action != NULL) {
539 "%s is not runnable because %s will not %s",
574 uint32_t filter, uint32_t
type,
580 CRM_ASSERT((first != NULL) && (then != NULL) && (then->
rsc != NULL)
588 for (GList *iter = then->
rsc->
children; iter != NULL; iter = iter->next) {
594 if (member_action != NULL) {
614 GList *node_list_orig = NULL;
615 GList *node_list_copy = NULL;
617 CRM_ASSERT(pcmk__is_group(rsc) && (location != NULL));
620 node_list_orig = location->
nodes;
632 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
649 location->
nodes = node_list_copy;
655 location->
nodes = node_list_orig;
656 g_list_free_full(node_list_copy, free);
663 GList *colocated_rscs)
669 if (orig_rsc == NULL) {
674 || pcmk__is_clone(rsc->
parent)) {
679 colocated_rscs = g_list_prepend(colocated_rscs, (gpointer) rsc);
680 for (
const GList *iter = rsc->children;
681 iter != NULL; iter = iter->next) {
696 return colocated_rscs;
705 CRM_ASSERT((orig_rsc != NULL) && (list != NULL) && pcmk__is_group(rsc));
721 rsc->
id, orig_rsc->
id);
727 if (rsc->
parent != NULL) {
738 for (
const GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
741 if (member != orig_rsc) {
754 CRM_ASSERT((orig_rsc != NULL) && (list != NULL) && pcmk__is_group(rsc));
764 if ((rsc == orig_rsc)
767 rsc->
id, orig_rsc->
id);
773 if (rsc->
parent != NULL) {
784 for (
const GList *iter = rsc->
children;
785 iter != NULL; iter = iter->next) {
787 if (member != orig_rsc) {
799 for (
const GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
801 if (orig_rsc == member) {
806 crm_trace(
"Adding mandatory '%s with' colocations to list for "
807 "member %s because earlier member %s is unmanaged",
808 rsc->
id, orig_rsc->
id, member->
id);
809 for (
const GList *cons_iter = rsc->
rsc_cons; cons_iter != NULL;
810 cons_iter = cons_iter->next) {
857 const char *log_id, GHashTable **nodes,
859 float factor, uint32_t
flags)
863 CRM_ASSERT(pcmk__is_group(source_rsc) && (nodes != NULL)
864 && ((colocation != NULL)
865 || ((target_rsc == NULL) && (*nodes == NULL))));
867 if (log_id == NULL) {
868 log_id = source_rsc->
id;
874 log_id, source_rsc->
id);
894 if (*nodes == NULL) {
897 member = source_rsc->
children->data;
899 pcmk__rsc_trace(source_rsc,
"%s: Merging scores from group %s using member %s "
900 "(at %.6f)", log_id, source_rsc->
id, member->
id, factor);
902 colocation, factor,
flags);
910 GHashTable *utilization)
914 CRM_ASSERT((orig_rsc != NULL) && (utilization != NULL)
915 && pcmk__is_group(rsc));
921 pcmk__rsc_trace(orig_rsc,
"%s: Adding group %s as colocated utilization",
922 orig_rsc->
id, rsc->
id);
924 || pcmk__is_clone(rsc->
parent)) {
926 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
930 && (g_list_find(all_rscs, member) == NULL)) {
941 && (g_list_find(all_rscs, member) == NULL)) {
954 for (GList *iter = rsc->
children; iter != NULL; iter = iter->next) {
@ pcmk__ar_first_implies_then
@ pcmk__ar_then_implies_first
@ pcmk__ar_intermediate_stop
@ pcmk__ar_then_implies_first_graphed
If 'then' is required, 'first' must be added to the transition graph.
@ pcmk__ar_none
No relation (compare with equality rather than bit set)
@ pcmk__ar_first_implies_then_graphed
If 'first' is required and runnable, 'then' must be in graph.
@ pcmk__ar_unrunnable_first_blocks
'then' is runnable (and migratable) only if 'first' is runnable
@ pcmk__ar_ordered
Actions are ordered (optionally, if no other flags are set)
#define pcmk__set_relation_flags(ar_flags, flags_to_set)
#define PCMK_ACTION_PROMOTED
#define PCMK_ACTION_RUNNING
#define PCMK_ACTION_PROMOTE
#define PCMK_ACTION_START
#define PCMK_ACTION_STOPPED
const char * pcmk_action_text(enum action_tasks action)
Get string equivalent of an action type.
#define PCMK_ACTION_DEMOTED
#define PCMK_ACTION_DEMOTE
#define pcmk__clear_raw_action_flags(action_flags, action_name, to_clear)
#define pcmk__set_action_flags(action, flags_to_set)
char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms)
Generate an operation key (RESOURCE_ACTION_INTERVAL)
#define pcmk__clear_action_flags(action, flags_to_clear)
gboolean crm_is_true(const char *s)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
enum crm_ais_msg_types type
G_GNUC_INTERNAL void pcmk__add_this_with_list(GList **list, GList *addition, const pcmk_resource_t *rsc)
#define pcmk__order_starts(rsc1, rsc2, flags)
G_GNUC_INTERNAL void pcmk__new_colocation(const char *id, const char *node_attr, int score, pcmk_resource_t *dependent, pcmk_resource_t *primary, const char *dependent_role, const char *primary_role, uint32_t flags)
#define pcmk__order_resource_actions(first_rsc, first_task, then_rsc, then_task, flags)
G_GNUC_INTERNAL uint32_t pcmk__update_ordered_actions(pcmk_action_t *first, pcmk_action_t *then, const pcmk_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__add_this_with(GList **list, const pcmk__colocation_t *colocation, const pcmk_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__add_with_this_list(GList **list, GList *addition, const pcmk_resource_t *rsc)
G_GNUC_INTERNAL GList * pcmk__colocated_resources(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList *colocated_rscs)
#define pcmk__order_stops(rsc1, rsc2, flags)
G_GNUC_INTERNAL void pcmk__apply_location(pcmk_resource_t *rsc, pcmk__location_t *constraint)
#define crm_trace(fmt, args...)
#define pcmk__config_err(fmt...)
pcmk_scheduler_t * scheduler
#define PCMK_META_PROMOTABLE
void pcmk__group_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)
void pcmk__with_group_colocations(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList **list)
void pcmk__group_internal_constraints(pcmk_resource_t *rsc)
pcmk_node_t * pcmk__group_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, bool stop_if_fail)
void pcmk__group_apply_location(pcmk_resource_t *rsc, pcmk__location_t *location)
GList * pcmk__group_colocated_resources(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList *colocated_rscs)
void pcmk__group_shutdown_lock(pcmk_resource_t *rsc)
uint32_t pcmk__group_update_ordered_actions(pcmk_action_t *first, pcmk_action_t *then, const pcmk_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pcmk_scheduler_t *scheduler)
void pcmk__group_add_utilization(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
void pcmk__group_with_colocations(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList **list)
void pcmk__group_create_actions(pcmk_resource_t *rsc)
uint32_t pcmk__group_action_flags(pcmk_action_t *action, const pcmk_node_t *node)
void pcmk__group_apply_coloc_score(pcmk_resource_t *dependent, const pcmk_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
GList * pcmk__copy_node_list(const GList *list, bool reset)
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
pcmk_resource_t * pe__last_group_member(const pcmk_resource_t *group)
#define pe__show_node_scores(level, rsc, text, nodes, scheduler)
pcmk_action_t * find_first_action(const GList *input, const char *uuid, const char *task, const pcmk_node_t *on_node)
void pe__set_next_role(pcmk_resource_t *rsc, enum rsc_role_e role, const char *why)
pcmk_action_t * custom_action(pcmk_resource_t *rsc, char *key, const char *task, const pcmk_node_t *on_node, gboolean optional, pcmk_scheduler_t *scheduler)
Create or update an action object.
enum action_tasks get_complex_task(const pcmk_resource_t *rsc, const char *name)
bool pe__group_flag_is_set(const pcmk_resource_t *group, uint32_t flags)
@ pcmk_rsc_updating_nodes
#define pcmk__set_rsc_flags(resource, flags_to_set)
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
@ pcmk_sched_output_scores
#define pcmk__rsc_info(rsc, fmt, args...)
#define pcmk__rsc_trace(rsc, fmt, args...)
#define pcmk__rsc_debug(rsc, fmt, args...)
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
Location constraint object.
pcmk_assignment_methods_t * cmds
pcmk_scheduler_t * cluster
pcmk_node_t * allocated_to
GHashTable * allowed_nodes
enum rsc_role_e next_role
void(* create_actions)(pcmk_resource_t *rsc)
void(* add_utilization)(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
void(* shutdown_lock)(pcmk_resource_t *rsc)
void(* this_with_colocations)(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList **list)
GList *(* colocated_resources)(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList *colocated_rscs)
uint32_t(* action_flags)(pcmk_action_t *action, const pcmk_node_t *node)
void(* with_this_colocations)(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList **list)
void(* internal_constraints)(pcmk_resource_t *rsc)
pcmk_node_t *(* assign)(pcmk_resource_t *rsc, const pcmk_node_t *prefer, bool stop_if_fail)
void(* 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)
uint32_t(* update_ordered_actions)(pcmk_action_t *first, pcmk_action_t *then, const pcmk_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pcmk_scheduler_t *scheduler)
void(* apply_location)(pcmk_resource_t *rsc, pcmk__location_t *location)
Wrappers for and extensions to libxml2.