From 71c53fb73ff8d33253ff99b84e666913050e16cc Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Fri, 4 Dec 2020 16:13:30 -0600 Subject: [PATCH 1/4] Refactor: scheduler: rename colocation constructor ... per current guidelines. Also make void since no caller used the return value. --- include/pcmki/pcmki_sched_utils.h | 10 ++++---- lib/pacemaker/pcmk_sched_bundle.c | 12 +++++----- lib/pacemaker/pcmk_sched_constraints.c | 43 +++++++++++++++++++--------------- lib/pacemaker/pcmk_sched_group.c | 4 ++-- lib/pacemaker/pcmk_sched_native.c | 4 ++-- 5 files changed, 39 insertions(+), 34 deletions(-) diff --git a/include/pcmki/pcmki_sched_utils.h b/include/pcmki/pcmki_sched_utils.h index f2318c5..fdb3843 100644 --- a/include/pcmki/pcmki_sched_utils.h +++ b/include/pcmki/pcmki_sched_utils.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2019 the Pacemaker project contributors + * Copyright 2004-2020 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -28,10 +28,10 @@ pe__location_t *rsc2node_new(const char *id, pe_resource_t *rsc, int weight, const char *discovery_mode, pe_node_t *node, pe_working_set_t *data_set); -extern gboolean rsc_colocation_new(const char *id, const char *node_attr, int score, - pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, - const char *state_lh, const char *state_rh, - pe_working_set_t * data_set); +void pcmk__new_colocation(const char *id, const char *node_attr, int score, + pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, + const char *state_lh, const char *state_rh, + pe_working_set_t *data_set); extern gboolean rsc_ticket_new(const char *id, pe_resource_t * rsc_lh, pe_ticket_t * ticket, const char *state_lh, const char *loss_policy, diff --git a/lib/pacemaker/pcmk_sched_bundle.c b/lib/pacemaker/pcmk_sched_bundle.c index e9b8a74..02bff7c 100644 --- a/lib/pacemaker/pcmk_sched_bundle.c +++ b/lib/pacemaker/pcmk_sched_bundle.c @@ -140,10 +140,10 @@ pcmk__bundle_allocate(pe_resource_t *rsc, pe_node_t *prefer, * host because pacemaker-remoted only supports a single * active connection */ - rsc_colocation_new("child-remote-with-docker-remote", NULL, - INFINITY, replica->remote, - container_host->details->remote_rsc, NULL, NULL, - data_set); + pcmk__new_colocation("child-remote-with-docker-remote", NULL, + INFINITY, replica->remote, + container_host->details->remote_rsc, NULL, + NULL, data_set); } if (replica->remote) { @@ -310,8 +310,8 @@ pcmk__bundle_internal_constraints(pe_resource_t *rsc, new_rsc_order(replica->container, RSC_STOP, replica->ip, RSC_STOP, pe_order_implies_first|pe_order_preserve, data_set); - rsc_colocation_new("ip-with-docker", NULL, INFINITY, replica->ip, - replica->container, NULL, NULL, data_set); + pcmk__new_colocation("ip-with-docker", NULL, INFINITY, replica->ip, + replica->container, NULL, NULL, data_set); } if (replica->remote) { diff --git a/lib/pacemaker/pcmk_sched_constraints.c b/lib/pacemaker/pcmk_sched_constraints.c index 121754d..cce3f12 100644 --- a/lib/pacemaker/pcmk_sched_constraints.c +++ b/lib/pacemaker/pcmk_sched_constraints.c @@ -1339,22 +1339,23 @@ anti_colocation_order(pe_resource_t * first_rsc, int first_role, } } -gboolean -rsc_colocation_new(const char *id, const char *node_attr, int score, - pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, - const char *state_lh, const char *state_rh, pe_working_set_t * data_set) +void +pcmk__new_colocation(const char *id, const char *node_attr, int score, + pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, + const char *state_lh, const char *state_rh, + pe_working_set_t *data_set) { rsc_colocation_t *new_con = NULL; if ((rsc_lh == NULL) || (rsc_rh == NULL)) { pcmk__config_err("Ignoring colocation '%s' because resource " "does not exist", id); - return FALSE; + return; } new_con = calloc(1, sizeof(rsc_colocation_t)); if (new_con == NULL) { - return FALSE; + return; } if (pcmk__str_eq(state_lh, RSC_ROLE_STARTED_S, pcmk__str_null_matches | pcmk__str_casei)) { @@ -1390,8 +1391,6 @@ rsc_colocation_new(const char *id, const char *node_attr, int score, anti_colocation_order(rsc_lh, new_con->role_lh, rsc_rh, new_con->role_rh, data_set); anti_colocation_order(rsc_rh, new_con->role_rh, rsc_lh, new_con->role_lh, data_set); } - - return TRUE; } /* LHS before RHS */ @@ -2311,8 +2310,8 @@ unpack_colocation_set(xmlNode * set, int score, pe_working_set_t * data_set) EXPAND_CONSTRAINT_IDREF(set_id, resource, ID(xml_rsc)); if (with != NULL) { pe_rsc_trace(resource, "Colocating %s with %s", resource->id, with->id); - rsc_colocation_new(set_id, NULL, local_score, resource, with, role, role, - data_set); + pcmk__new_colocation(set_id, NULL, local_score, resource, + with, role, role, data_set); } with = resource; @@ -2327,8 +2326,8 @@ unpack_colocation_set(xmlNode * set, int score, pe_working_set_t * data_set) EXPAND_CONSTRAINT_IDREF(set_id, resource, ID(xml_rsc)); if (last != NULL) { pe_rsc_trace(resource, "Colocating %s with %s", last->id, resource->id); - rsc_colocation_new(set_id, NULL, local_score, last, resource, role, role, - data_set); + pcmk__new_colocation(set_id, NULL, local_score, last, + resource, role, role, data_set); } last = resource; @@ -2360,8 +2359,9 @@ unpack_colocation_set(xmlNode * set, int score, pe_working_set_t * data_set) EXPAND_CONSTRAINT_IDREF(set_id, with, ID(xml_rsc_with)); pe_rsc_trace(resource, "Anti-Colocating %s with %s", resource->id, with->id); - rsc_colocation_new(set_id, NULL, local_score, resource, with, role, role, - data_set); + pcmk__new_colocation(set_id, NULL, local_score, + resource, with, role, role, + data_set); } } } @@ -2412,7 +2412,8 @@ colocate_rsc_sets(const char *id, xmlNode * set1, xmlNode * set2, int score, } if (rsc_1 != NULL && rsc_2 != NULL) { - rsc_colocation_new(id, NULL, score, rsc_1, rsc_2, role_1, role_2, data_set); + pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, role_1, role_2, + data_set); } else if (rsc_1 != NULL) { for (xml_rsc = pcmk__xe_first_child(set2); xml_rsc != NULL; @@ -2420,7 +2421,8 @@ colocate_rsc_sets(const char *id, xmlNode * set1, xmlNode * set2, int score, if (pcmk__str_eq((const char *)xml_rsc->name, XML_TAG_RESOURCE_REF, pcmk__str_none)) { EXPAND_CONSTRAINT_IDREF(id, rsc_2, ID(xml_rsc)); - rsc_colocation_new(id, NULL, score, rsc_1, rsc_2, role_1, role_2, data_set); + pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, role_1, + role_2, data_set); } } @@ -2430,7 +2432,8 @@ colocate_rsc_sets(const char *id, xmlNode * set1, xmlNode * set2, int score, if (pcmk__str_eq((const char *)xml_rsc->name, XML_TAG_RESOURCE_REF, pcmk__str_none)) { EXPAND_CONSTRAINT_IDREF(id, rsc_1, ID(xml_rsc)); - rsc_colocation_new(id, NULL, score, rsc_1, rsc_2, role_1, role_2, data_set); + pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, role_1, + role_2, data_set); } } @@ -2449,7 +2452,8 @@ colocate_rsc_sets(const char *id, xmlNode * set1, xmlNode * set2, int score, if (pcmk__str_eq((const char *)xml_rsc_2->name, XML_TAG_RESOURCE_REF, pcmk__str_none)) { EXPAND_CONSTRAINT_IDREF(id, rsc_2, ID(xml_rsc_2)); - rsc_colocation_new(id, NULL, score, rsc_1, rsc_2, role_1, role_2, data_set); + pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, + role_1, role_2, data_set); } } } @@ -2534,7 +2538,8 @@ unpack_simple_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) score_i = char2score(score); } - rsc_colocation_new(id, attr, score_i, rsc_lh, rsc_rh, state_lh, state_rh, data_set); + pcmk__new_colocation(id, attr, score_i, rsc_lh, rsc_rh, state_lh, state_rh, + data_set); return TRUE; } diff --git a/lib/pacemaker/pcmk_sched_group.c b/lib/pacemaker/pcmk_sched_group.c index 35f25af..79847e8 100644 --- a/lib/pacemaker/pcmk_sched_group.c +++ b/lib/pacemaker/pcmk_sched_group.c @@ -192,8 +192,8 @@ group_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set) } } else if (group_data->colocated) { - rsc_colocation_new("group:internal_colocation", NULL, INFINITY, - child_rsc, last_rsc, NULL, NULL, data_set); + pcmk__new_colocation("group:internal_colocation", NULL, INFINITY, + child_rsc, last_rsc, NULL, NULL, data_set); } if (pcmk_is_set(top->flags, pe_rsc_promotable)) { diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c index 9196f59..b18f52e 100644 --- a/lib/pacemaker/pcmk_sched_native.c +++ b/lib/pacemaker/pcmk_sched_native.c @@ -1697,8 +1697,8 @@ native_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set) } else { score = INFINITY; /* Force them to run on the same host */ } - rsc_colocation_new("resource-with-container", NULL, score, rsc, - rsc->container, NULL, NULL, data_set); + pcmk__new_colocation("resource-with-container", NULL, score, rsc, + rsc->container, NULL, NULL, data_set); } } -- 1.8.3.1 From 9fced08910267513a3208772cca712e6ebec54bc Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Fri, 4 Dec 2020 16:24:25 -0600 Subject: [PATCH 2/4] Refactor: scheduler,tools: rename colocation type ... per current guidelines --- include/crm/pengine/pe_types.h | 4 ++-- include/pcmki/pcmki_sched_allocate.h | 22 +++++++++++----------- include/pcmki/pcmki_sched_utils.h | 4 ++-- include/pcmki/pcmki_scheduler.h | 5 ++--- lib/pacemaker/pcmk_output.c | 12 ++++++------ lib/pacemaker/pcmk_sched_bundle.c | 4 ++-- lib/pacemaker/pcmk_sched_clone.c | 20 ++++++++++---------- lib/pacemaker/pcmk_sched_constraints.c | 12 ++++++------ lib/pacemaker/pcmk_sched_graph.c | 3 ++- lib/pacemaker/pcmk_sched_group.c | 6 +++--- lib/pacemaker/pcmk_sched_native.c | 18 ++++++++++-------- lib/pacemaker/pcmk_sched_promotable.c | 8 ++++---- lib/pacemaker/pcmk_sched_utilization.c | 4 ++-- tools/crm_resource_runtime.c | 2 +- 14 files changed, 63 insertions(+), 61 deletions(-) diff --git a/include/crm/pengine/pe_types.h b/include/crm/pengine/pe_types.h index 9fea637..59d5ce8 100644 --- a/include/crm/pengine/pe_types.h +++ b/include/crm/pengine/pe_types.h @@ -340,8 +340,8 @@ struct pe_resource_s { //!@{ //! This field should be treated as internal to Pacemaker - GListPtr rsc_cons_lhs; // List of rsc_colocation_t* - GListPtr rsc_cons; // List of rsc_colocation_t* + GListPtr rsc_cons_lhs; // List of pcmk__colocation_t* + GListPtr rsc_cons; // List of pcmk__colocation_t* GListPtr rsc_location; // List of pe__location_t* GListPtr actions; // List of pe_action_t* GListPtr rsc_tickets; // List of rsc_ticket* diff --git a/include/pcmki/pcmki_sched_allocate.h b/include/pcmki/pcmki_sched_allocate.h index a7f8c11..0859eaa 100644 --- a/include/pcmki/pcmki_sched_allocate.h +++ b/include/pcmki/pcmki_sched_allocate.h @@ -26,9 +26,9 @@ struct resource_alloc_functions_s { void (*internal_constraints) (pe_resource_t *, pe_working_set_t *); void (*rsc_colocation_lh) (pe_resource_t *, pe_resource_t *, - rsc_colocation_t *, pe_working_set_t *); + pcmk__colocation_t *, pe_working_set_t *); void (*rsc_colocation_rh) (pe_resource_t *, pe_resource_t *, - rsc_colocation_t *, pe_working_set_t *); + pcmk__colocation_t *, pe_working_set_t *); void (*rsc_location) (pe_resource_t *, pe__location_t *); @@ -56,10 +56,10 @@ pe_node_t *pcmk__native_allocate(pe_resource_t *rsc, pe_node_t *preferred, extern void native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set); extern void native_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set); void native_rsc_colocation_lh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); void native_rsc_colocation_rh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); extern void rsc_ticket_constraint(pe_resource_t * lh_rsc, rsc_ticket_t * rsc_ticket, pe_working_set_t * data_set); @@ -76,10 +76,10 @@ pe_node_t *pcmk__group_allocate(pe_resource_t *rsc, pe_node_t *preferred, extern void group_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set); extern void group_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set); void group_rsc_colocation_lh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); void group_rsc_colocation_rh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); extern enum pe_action_flags group_action_flags(pe_action_t * action, pe_node_t * node); void group_rsc_location(pe_resource_t *rsc, pe__location_t *constraint); @@ -97,11 +97,11 @@ void pcmk__bundle_internal_constraints(pe_resource_t *rsc, pe_working_set_t *data_set); void pcmk__bundle_rsc_colocation_lh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); void pcmk__bundle_rsc_colocation_rh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); void pcmk__bundle_rsc_location(pe_resource_t *rsc, pe__location_t *constraint); enum pe_action_flags pcmk__bundle_action_flags(pe_action_t *action, @@ -114,10 +114,10 @@ pe_node_t *pcmk__clone_allocate(pe_resource_t *rsc, pe_node_t *preferred, extern void clone_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set); extern void clone_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set); void clone_rsc_colocation_lh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); void clone_rsc_colocation_rh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); void clone_rsc_location(pe_resource_t *rsc, pe__location_t *constraint); extern enum pe_action_flags clone_action_flags(pe_action_t * action, pe_node_t * node); @@ -133,7 +133,7 @@ void create_promotable_actions(pe_resource_t *rsc, pe_working_set_t *data_set); void promote_demote_constraints(pe_resource_t *rsc, pe_working_set_t *data_set); void promotable_constraints(pe_resource_t *rsc, pe_working_set_t *data_set); void promotable_colocation_rh(pe_resource_t *lh_rsc, pe_resource_t *rh_rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set); /* extern resource_object_functions_t resource_variants[]; */ diff --git a/include/pcmki/pcmki_sched_utils.h b/include/pcmki/pcmki_sched_utils.h index fdb3843..b8d7750 100644 --- a/include/pcmki/pcmki_sched_utils.h +++ b/include/pcmki/pcmki_sched_utils.h @@ -20,7 +20,7 @@ #include /* Constraint helper functions */ -extern rsc_colocation_t *invert_constraint(rsc_colocation_t * constraint); +pcmk__colocation_t *invert_constraint(pcmk__colocation_t *constraint); pe__location_t *copy_constraint(pe__location_t *constraint); @@ -71,7 +71,7 @@ enum filter_colocation_res { extern enum filter_colocation_res filter_colocation_constraint(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, - rsc_colocation_t * constraint, gboolean preview); + pcmk__colocation_t *constraint, gboolean preview); extern int compare_capacity(const pe_node_t * node1, const pe_node_t * node2); extern void calculate_utilization(GHashTable * current_utilization, diff --git a/include/pcmki/pcmki_scheduler.h b/include/pcmki/pcmki_scheduler.h index 342d57a..b24e994 100644 --- a/include/pcmki/pcmki_scheduler.h +++ b/include/pcmki/pcmki_scheduler.h @@ -10,7 +10,6 @@ #ifndef PENGINE__H # define PENGINE__H -typedef struct rsc_colocation_s rsc_colocation_t; typedef struct rsc_ticket_s rsc_ticket_t; typedef struct lrm_agent_s lrm_agent_t; @@ -37,7 +36,7 @@ enum pe_weights { pe_weights_rollback = 0x10, }; -struct rsc_colocation_s { +typedef struct { const char *id; const char *node_attribute; pe_resource_t *rsc_lh; @@ -47,7 +46,7 @@ struct rsc_colocation_s { int role_rh; int score; -}; +} pcmk__colocation_t; enum loss_ticket_policy_e { loss_ticket_stop, diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c index 0d20a54..500afd1 100644 --- a/lib/pacemaker/pcmk_output.c +++ b/lib/pacemaker/pcmk_output.c @@ -47,7 +47,7 @@ pcmk__out_epilogue(pcmk__output_t *out, xmlNodePtr *xml, int retval) { } static char * -colocations_header(pe_resource_t *rsc, rsc_colocation_t *cons, +colocations_header(pe_resource_t *rsc, pcmk__colocation_t *cons, gboolean dependents) { char *score = NULL; char *retval = NULL; @@ -68,7 +68,7 @@ colocations_header(pe_resource_t *rsc, rsc_colocation_t *cons, static void colocations_xml_node(pcmk__output_t *out, pe_resource_t *rsc, - rsc_colocation_t *cons) { + pcmk__colocation_t *cons) { char *score = NULL; xmlNodePtr node = NULL; @@ -146,7 +146,7 @@ rsc_is_colocated_with_list(pcmk__output_t *out, va_list args) { pe__set_resource_flags(rsc, pe_rsc_allocating); for (GList *lpc = rsc->rsc_cons; lpc != NULL; lpc = lpc->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; char *hdr = NULL; PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, "Resources %s is colocated with", rsc->id); @@ -189,7 +189,7 @@ rsc_is_colocated_with_list_xml(pcmk__output_t *out, va_list args) { pe__set_resource_flags(rsc, pe_rsc_allocating); for (GList *lpc = rsc->rsc_cons; lpc != NULL; lpc = lpc->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; if (pcmk_is_set(cons->rsc_rh->flags, pe_rsc_allocating)) { colocations_xml_node(out, cons->rsc_rh, cons); @@ -221,7 +221,7 @@ rscs_colocated_with_list(pcmk__output_t *out, va_list args) { pe__set_resource_flags(rsc, pe_rsc_allocating); for (GList *lpc = rsc->rsc_cons_lhs; lpc != NULL; lpc = lpc->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; char *hdr = NULL; PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, "Resources colocated with %s", rsc->id); @@ -264,7 +264,7 @@ rscs_colocated_with_list_xml(pcmk__output_t *out, va_list args) { pe__set_resource_flags(rsc, pe_rsc_allocating); for (GList *lpc = rsc->rsc_cons_lhs; lpc != NULL; lpc = lpc->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; if (pcmk_is_set(cons->rsc_lh->flags, pe_rsc_allocating)) { colocations_xml_node(out, cons->rsc_lh, cons); diff --git a/lib/pacemaker/pcmk_sched_bundle.c b/lib/pacemaker/pcmk_sched_bundle.c index 02bff7c..ac9219c 100644 --- a/lib/pacemaker/pcmk_sched_bundle.c +++ b/lib/pacemaker/pcmk_sched_bundle.c @@ -425,7 +425,7 @@ compatible_replica(pe_resource_t *rsc_lh, pe_resource_t *rsc, void pcmk__bundle_rsc_colocation_lh(pe_resource_t *rsc, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { /* -- Never called -- @@ -469,7 +469,7 @@ int copies_per_node(pe_resource_t * rsc) void pcmk__bundle_rsc_colocation_rh(pe_resource_t *rsc_lh, pe_resource_t *rsc, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { GListPtr allocated_rhs = NULL; diff --git a/lib/pacemaker/pcmk_sched_clone.c b/lib/pacemaker/pcmk_sched_clone.c index e419a24..9485a98 100644 --- a/lib/pacemaker/pcmk_sched_clone.c +++ b/lib/pacemaker/pcmk_sched_clone.c @@ -237,7 +237,7 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) if(resource1->parent) { for (gIter = resource1->parent->rsc_cons; gIter; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -252,7 +252,7 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) } for (gIter = resource1->parent->rsc_cons_lhs; gIter; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -269,7 +269,7 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) if(resource2->parent) { for (gIter = resource2->parent->rsc_cons; gIter; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; crm_trace("Applying %s to %s", constraint->id, resource2->id); @@ -281,7 +281,7 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) } for (gIter = resource2->parent->rsc_cons_lhs; gIter; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; crm_trace("Applying %s to %s", constraint->id, resource2->id); @@ -499,7 +499,7 @@ append_parent_colocation(pe_resource_t * rsc, pe_resource_t * child, gboolean al gIter = rsc->rsc_cons; for (; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) gIter->data; if (cons->score == 0) { continue; @@ -511,7 +511,7 @@ append_parent_colocation(pe_resource_t * rsc, pe_resource_t * child, gboolean al gIter = rsc->rsc_cons_lhs; for (; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) gIter->data; if (cons->score == 0) { continue; @@ -645,7 +645,7 @@ pcmk__clone_allocate(pe_resource_t *rsc, pe_node_t *prefer, * order to allocate clone instances */ for (GListPtr gIter = rsc->rsc_cons; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -656,7 +656,7 @@ pcmk__clone_allocate(pe_resource_t *rsc, pe_node_t *prefer, } for (GListPtr gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -1055,7 +1055,7 @@ find_compatible_child(pe_resource_t *local_child, pe_resource_t *rsc, void clone_rsc_colocation_lh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { /* -- Never called -- @@ -1067,7 +1067,7 @@ clone_rsc_colocation_lh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, void clone_rsc_colocation_rh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { GListPtr gIter = NULL; diff --git a/lib/pacemaker/pcmk_sched_constraints.c b/lib/pacemaker/pcmk_sched_constraints.c index cce3f12..1b44837 100644 --- a/lib/pacemaker/pcmk_sched_constraints.c +++ b/lib/pacemaker/pcmk_sched_constraints.c @@ -1204,8 +1204,8 @@ generate_location_rule(pe_resource_t *rsc, xmlNode *rule_xml, static gint sort_cons_priority_lh(gconstpointer a, gconstpointer b) { - const rsc_colocation_t *rsc_constraint1 = (const rsc_colocation_t *)a; - const rsc_colocation_t *rsc_constraint2 = (const rsc_colocation_t *)b; + const pcmk__colocation_t *rsc_constraint1 = (const pcmk__colocation_t *) a; + const pcmk__colocation_t *rsc_constraint2 = (const pcmk__colocation_t *) b; if (a == NULL) { return 1; @@ -1252,8 +1252,8 @@ sort_cons_priority_lh(gconstpointer a, gconstpointer b) static gint sort_cons_priority_rh(gconstpointer a, gconstpointer b) { - const rsc_colocation_t *rsc_constraint1 = (const rsc_colocation_t *)a; - const rsc_colocation_t *rsc_constraint2 = (const rsc_colocation_t *)b; + const pcmk__colocation_t *rsc_constraint1 = (const pcmk__colocation_t *) a; + const pcmk__colocation_t *rsc_constraint2 = (const pcmk__colocation_t *) b; if (a == NULL) { return 1; @@ -1345,7 +1345,7 @@ pcmk__new_colocation(const char *id, const char *node_attr, int score, const char *state_lh, const char *state_rh, pe_working_set_t *data_set) { - rsc_colocation_t *new_con = NULL; + pcmk__colocation_t *new_con = NULL; if ((rsc_lh == NULL) || (rsc_rh == NULL)) { pcmk__config_err("Ignoring colocation '%s' because resource " @@ -1353,7 +1353,7 @@ pcmk__new_colocation(const char *id, const char *node_attr, int score, return; } - new_con = calloc(1, sizeof(rsc_colocation_t)); + new_con = calloc(1, sizeof(pcmk__colocation_t)); if (new_con == NULL) { return; } diff --git a/lib/pacemaker/pcmk_sched_graph.c b/lib/pacemaker/pcmk_sched_graph.c index 51f7063..c012d23 100644 --- a/lib/pacemaker/pcmk_sched_graph.c +++ b/lib/pacemaker/pcmk_sched_graph.c @@ -510,7 +510,8 @@ update_colo_start_chain(pe_action_t *action, pe_working_set_t *data_set) } for (gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *colocate_with = (rsc_colocation_t *)gIter->data; + pcmk__colocation_t *colocate_with = (pcmk__colocation_t *) gIter->data; + if (colocate_with->score == INFINITY) { mark_start_blocked(colocate_with->rsc_lh, action->rsc, data_set); } diff --git a/lib/pacemaker/pcmk_sched_group.c b/lib/pacemaker/pcmk_sched_group.c index 79847e8..f1ce0be 100644 --- a/lib/pacemaker/pcmk_sched_group.c +++ b/lib/pacemaker/pcmk_sched_group.c @@ -282,7 +282,7 @@ group_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set) void group_rsc_colocation_lh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { GListPtr gIter = NULL; @@ -328,7 +328,7 @@ group_rsc_colocation_lh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, void group_rsc_colocation_rh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { GListPtr gIter = rsc_rh->children; @@ -514,7 +514,7 @@ pcmk__group_merge_weights(pe_resource_t *rsc, const char *rhs, factor, flags); for (; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c index b18f52e..87d8bfb 100644 --- a/lib/pacemaker/pcmk_sched_native.c +++ b/lib/pacemaker/pcmk_sched_native.c @@ -434,7 +434,7 @@ pcmk__native_merge_weights(pe_resource_t *rsc, const char *rhs, for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *other = NULL; - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -526,7 +526,7 @@ pcmk__native_allocate(pe_resource_t *rsc, pe_node_t *prefer, pe__show_node_weights(true, rsc, "Pre-alloc", rsc->allowed_nodes); for (gIter = rsc->rsc_cons; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; GHashTable *archive = NULL; pe_resource_t *rsc_rh = constraint->rsc_rh; @@ -560,7 +560,7 @@ pcmk__native_allocate(pe_resource_t *rsc, pe_node_t *prefer, pe__show_node_weights(true, rsc, "Post-coloc", rsc->allowed_nodes); for (gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -1712,7 +1712,7 @@ native_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set) void native_rsc_colocation_lh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { if (rsc_lh == NULL) { @@ -1735,7 +1735,7 @@ native_rsc_colocation_lh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, enum filter_colocation_res filter_colocation_constraint(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, - rsc_colocation_t * constraint, gboolean preview) + pcmk__colocation_t *constraint, gboolean preview) { if (constraint->score == 0) { return influence_nothing; @@ -1819,7 +1819,8 @@ filter_colocation_constraint(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, } static void -influence_priority(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, rsc_colocation_t * constraint) +influence_priority(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, + pcmk__colocation_t *constraint) { const char *rh_value = NULL; const char *lh_value = NULL; @@ -1860,7 +1861,8 @@ influence_priority(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, rsc_colocatio } static void -colocation_match(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, rsc_colocation_t * constraint) +colocation_match(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, + pcmk__colocation_t *constraint) { const char *attribute = CRM_ATTR_ID; const char *value = NULL; @@ -1928,7 +1930,7 @@ colocation_match(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, rsc_colocation_ void native_rsc_colocation_rh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { enum filter_colocation_res filter_results; diff --git a/lib/pacemaker/pcmk_sched_promotable.c b/lib/pacemaker/pcmk_sched_promotable.c index b976344..9a5474a 100644 --- a/lib/pacemaker/pcmk_sched_promotable.c +++ b/lib/pacemaker/pcmk_sched_promotable.c @@ -319,7 +319,7 @@ promotion_order(pe_resource_t *rsc, pe_working_set_t *data_set) gIter = rsc->rsc_cons; for (; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -343,7 +343,7 @@ promotion_order(pe_resource_t *rsc, pe_working_set_t *data_set) gIter = rsc->rsc_cons_lhs; for (; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (constraint->score == 0) { continue; @@ -738,7 +738,7 @@ pcmk__set_instance_roles(pe_resource_t *rsc, pe_working_set_t *data_set) apply_master_location(child_rsc, rsc->rsc_location, chosen); for (gIter2 = child_rsc->rsc_cons; gIter2 != NULL; gIter2 = gIter2->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) gIter2->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) gIter2->data; if (cons->score == 0) { continue; @@ -981,7 +981,7 @@ node_hash_update_one(GHashTable * hash, pe_node_t * other, const char *attr, int void promotable_colocation_rh(pe_resource_t *rsc_lh, pe_resource_t *rsc_rh, - rsc_colocation_t *constraint, + pcmk__colocation_t *constraint, pe_working_set_t *data_set) { GListPtr gIter = NULL; diff --git a/lib/pacemaker/pcmk_sched_utilization.c b/lib/pacemaker/pcmk_sched_utilization.c index b46b2fa..0df3a17 100644 --- a/lib/pacemaker/pcmk_sched_utilization.c +++ b/lib/pacemaker/pcmk_sched_utilization.c @@ -276,7 +276,7 @@ find_colocated_rscs(GListPtr colocated_rscs, pe_resource_t * rsc, pe_resource_t colocated_rscs = g_list_append(colocated_rscs, rsc); for (gIter = rsc->rsc_cons; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; pe_resource_t *rsc_rh = constraint->rsc_rh; /* Break colocation loop */ @@ -298,7 +298,7 @@ find_colocated_rscs(GListPtr colocated_rscs, pe_resource_t * rsc, pe_resource_t } for (gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { - rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; + pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; pe_resource_t *rsc_lh = constraint->rsc_lh; /* Break colocation loop */ diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c index f4500db..e0804fc 100644 --- a/tools/crm_resource_runtime.c +++ b/tools/crm_resource_runtime.c @@ -392,7 +392,7 @@ cli_resource_update_attribute(pcmk__output_t *out, pe_resource_t *rsc, crm_debug("Looking for dependencies %p", rsc->rsc_cons_lhs); pe__set_resource_flags(rsc, pe_rsc_allocating); for (lpc = rsc->rsc_cons_lhs; lpc != NULL; lpc = lpc->next) { - rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; + pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; pe_resource_t *peer = cons->rsc_lh; crm_debug("Checking %s %d", cons->id, cons->score); -- 1.8.3.1 From 83401876df22539c35f09b21135eefc7432f3839 Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Fri, 4 Dec 2020 17:02:36 -0600 Subject: [PATCH 3/4] Refactor: scheduler: make colocation constraint unpacker static ... for linker efficiency. Also make it (and a function it calls) return void since the only caller ignored the value. --- include/pcmki/pcmki_sched_allocate.h | 2 -- lib/pacemaker/pcmk_sched_constraints.c | 45 +++++++++++++++------------------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/include/pcmki/pcmki_sched_allocate.h b/include/pcmki/pcmki_sched_allocate.h index 0859eaa..d226c8c 100644 --- a/include/pcmki/pcmki_sched_allocate.h +++ b/include/pcmki/pcmki_sched_allocate.h @@ -141,8 +141,6 @@ extern resource_alloc_functions_t resource_class_alloc_functions[]; extern gboolean unpack_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set); -extern gboolean unpack_rsc_colocation(xmlNode * xml_obj, pe_working_set_t * data_set); - extern gboolean unpack_rsc_ticket(xmlNode * xml_obj, pe_working_set_t * data_set); void LogNodeActions(pe_working_set_t * data_set, gboolean terminal); diff --git a/lib/pacemaker/pcmk_sched_constraints.c b/lib/pacemaker/pcmk_sched_constraints.c index 1b44837..0029ad7 100644 --- a/lib/pacemaker/pcmk_sched_constraints.c +++ b/lib/pacemaker/pcmk_sched_constraints.c @@ -49,6 +49,7 @@ static pe__location_t *generate_location_rule(pe_resource_t *rsc, pe_working_set_t *data_set, pe_match_data_t *match_data); static void unpack_location(xmlNode *xml_obj, pe_working_set_t *data_set); +static void unpack_rsc_colocation(xmlNode *xml_obj, pe_working_set_t *data_set); static bool evaluate_lifetime(xmlNode *lifetime, pe_working_set_t *data_set) @@ -2463,7 +2464,7 @@ colocate_rsc_sets(const char *id, xmlNode * set1, xmlNode * set2, int score, return TRUE; } -static gboolean +static void unpack_simple_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) { int score_i = 0; @@ -2488,24 +2489,24 @@ unpack_simple_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) if (rsc_lh == NULL) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "does not exist", id, id_lh); - return FALSE; + return; } else if (rsc_rh == NULL) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "does not exist", id, id_rh); - return FALSE; + return; } else if (instance_lh && pe_rsc_is_clone(rsc_lh) == FALSE) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "is not a clone but instance '%s' was requested", id, id_lh, instance_lh); - return FALSE; + return; } else if (instance_rh && pe_rsc_is_clone(rsc_rh) == FALSE) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "is not a clone but instance '%s' was requested", id, id_rh, instance_rh); - return FALSE; + return; } if (instance_lh) { @@ -2514,7 +2515,7 @@ unpack_simple_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) pcmk__config_warn("Ignoring constraint '%s' because resource '%s' " "does not have an instance '%s'", id, id_lh, instance_lh); - return FALSE; + return; } } @@ -2524,7 +2525,7 @@ unpack_simple_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) pcmk__config_warn("Ignoring constraint '%s' because resource '%s' " "does not have an instance '%s'", "'%s'", id, id_rh, instance_rh); - return FALSE; + return; } } @@ -2540,7 +2541,6 @@ unpack_simple_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) pcmk__new_colocation(id, attr, score_i, rsc_lh, rsc_rh, state_lh, state_rh, data_set); - return TRUE; } static gboolean @@ -2660,8 +2660,8 @@ unpack_colocation_tags(xmlNode * xml_obj, xmlNode ** expanded_xml, pe_working_se return TRUE; } -gboolean -unpack_rsc_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) +static void +unpack_rsc_colocation(xmlNode *xml_obj, pe_working_set_t *data_set) { int score_i = 0; xmlNode *set = NULL; @@ -2674,19 +2674,16 @@ unpack_rsc_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) const char *id = crm_element_value(xml_obj, XML_ATTR_ID); const char *score = crm_element_value(xml_obj, XML_RULE_ATTR_SCORE); - gboolean rc = TRUE; - if (score) { score_i = char2score(score); } - rc = unpack_colocation_tags(xml_obj, &expanded_xml, data_set); + if (!unpack_colocation_tags(xml_obj, &expanded_xml, data_set)) { + return; + } if (expanded_xml) { orig_xml = xml_obj; xml_obj = expanded_xml; - - } else if (rc == FALSE) { - return FALSE; } for (set = pcmk__xe_first_child(xml_obj); set != NULL; @@ -2695,11 +2692,11 @@ unpack_rsc_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) if (pcmk__str_eq((const char *)set->name, XML_CONS_TAG_RSC_SET, pcmk__str_none)) { any_sets = TRUE; set = expand_idref(set, data_set->input); - if (unpack_colocation_set(set, score_i, data_set) == FALSE) { - return FALSE; - - } else if (last && colocate_rsc_sets(id, last, set, score_i, data_set) == FALSE) { - return FALSE; + if (!unpack_colocation_set(set, score_i, data_set)) { + return; + } + if (last && !colocate_rsc_sets(id, last, set, score_i, data_set)) { + return; } last = set; } @@ -2710,11 +2707,9 @@ unpack_rsc_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) xml_obj = orig_xml; } - if (any_sets == FALSE) { - return unpack_simple_colocation(xml_obj, data_set); + if (!any_sets) { + unpack_simple_colocation(xml_obj, data_set); } - - return TRUE; } gboolean -- 1.8.3.1 From 2278e01f8d951d939c172ac71e168a11199f84f7 Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Mon, 21 Dec 2020 17:07:45 -0600 Subject: [PATCH 4/4] Refactor: scheduler: functionize checking whether colocation applies This allows us to have more consistent trace messages, and will reduce code duplication when more checks are added later. --- include/pcmki/pcmki_sched_utils.h | 3 +++ lib/pacemaker/pcmk_sched_clone.c | 12 +++++------- lib/pacemaker/pcmk_sched_group.c | 12 ++++++------ lib/pacemaker/pcmk_sched_native.c | 14 ++++---------- lib/pacemaker/pcmk_sched_promotable.c | 25 ++++++++----------------- lib/pacemaker/pcmk_sched_utils.c | 31 +++++++++++++++++++++++++++++++ 6 files changed, 57 insertions(+), 40 deletions(-) diff --git a/include/pcmki/pcmki_sched_utils.h b/include/pcmki/pcmki_sched_utils.h index b8d7750..c7ae1b8 100644 --- a/include/pcmki/pcmki_sched_utils.h +++ b/include/pcmki/pcmki_sched_utils.h @@ -72,6 +72,9 @@ enum filter_colocation_res { extern enum filter_colocation_res filter_colocation_constraint(pe_resource_t * rsc_lh, pe_resource_t * rsc_rh, pcmk__colocation_t *constraint, gboolean preview); +bool pcmk__colocation_applies(pe_resource_t *rsc, + pcmk__colocation_t *colocation, + bool promoted_only); extern int compare_capacity(const pe_node_t * node1, const pe_node_t * node2); extern void calculate_utilization(GHashTable * current_utilization, diff --git a/lib/pacemaker/pcmk_sched_clone.c b/lib/pacemaker/pcmk_sched_clone.c index 9485a98..5a06151 100644 --- a/lib/pacemaker/pcmk_sched_clone.c +++ b/lib/pacemaker/pcmk_sched_clone.c @@ -658,14 +658,12 @@ pcmk__clone_allocate(pe_resource_t *rsc, pe_node_t *prefer, for (GListPtr gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; - if (constraint->score == 0) { - continue; + if (pcmk__colocation_applies(rsc, constraint, false)) { + rsc->allowed_nodes = constraint->rsc_lh->cmds->merge_weights(constraint->rsc_lh, + rsc->id, rsc->allowed_nodes, constraint->node_attribute, + constraint->score / (float) INFINITY, + pe_weights_rollback|pe_weights_positive); } - rsc->allowed_nodes = - constraint->rsc_lh->cmds->merge_weights(constraint->rsc_lh, rsc->id, rsc->allowed_nodes, - constraint->node_attribute, - (float)constraint->score / INFINITY, - (pe_weights_rollback | pe_weights_positive)); } pe__show_node_weights(!show_scores, rsc, __func__, rsc->allowed_nodes); diff --git a/lib/pacemaker/pcmk_sched_group.c b/lib/pacemaker/pcmk_sched_group.c index f1ce0be..5334f23 100644 --- a/lib/pacemaker/pcmk_sched_group.c +++ b/lib/pacemaker/pcmk_sched_group.c @@ -516,13 +516,13 @@ pcmk__group_merge_weights(pe_resource_t *rsc, const char *rhs, for (; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; - if (constraint->score == 0) { - continue; + if (pcmk__colocation_applies(rsc, constraint, false)) { + nodes = pcmk__native_merge_weights(constraint->rsc_lh, rsc->id, + nodes, + constraint->node_attribute, + constraint->score / (float) INFINITY, + flags); } - nodes = pcmk__native_merge_weights(constraint->rsc_lh, rsc->id, nodes, - constraint->node_attribute, - constraint->score / (float) INFINITY, - flags); } pe__clear_resource_flags(rsc, pe_rsc_merging); diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c index 87d8bfb..c302db6 100644 --- a/lib/pacemaker/pcmk_sched_native.c +++ b/lib/pacemaker/pcmk_sched_native.c @@ -562,17 +562,11 @@ pcmk__native_allocate(pe_resource_t *rsc, pe_node_t *prefer, for (gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; - if (constraint->score == 0) { - continue; + if (pcmk__colocation_applies(rsc, constraint, false)) { + rsc->allowed_nodes = constraint->rsc_lh->cmds->merge_weights(constraint->rsc_lh, + rsc->id, rsc->allowed_nodes, constraint->node_attribute, + constraint->score / (float) INFINITY, pe_weights_rollback); } - pe_rsc_trace(rsc, "Merging score of '%s' constraint (%s with %s)", - constraint->id, constraint->rsc_lh->id, - constraint->rsc_rh->id); - rsc->allowed_nodes = - constraint->rsc_lh->cmds->merge_weights(constraint->rsc_lh, rsc->id, rsc->allowed_nodes, - constraint->node_attribute, - (float)constraint->score / INFINITY, - pe_weights_rollback); } if (rsc->next_role == RSC_ROLE_STOPPED) { diff --git a/lib/pacemaker/pcmk_sched_promotable.c b/lib/pacemaker/pcmk_sched_promotable.c index 9a5474a..a0eeaad 100644 --- a/lib/pacemaker/pcmk_sched_promotable.c +++ b/lib/pacemaker/pcmk_sched_promotable.c @@ -345,23 +345,14 @@ promotion_order(pe_resource_t *rsc, pe_working_set_t *data_set) for (; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; - if (constraint->score == 0) { - continue; - } - - /* (re-)adds location preferences of resource that wish to be - * colocated with the master instance - */ - if (constraint->role_rh == RSC_ROLE_MASTER) { - pe_rsc_trace(rsc, "LHS: %s with %s: %d", constraint->rsc_lh->id, constraint->rsc_rh->id, - constraint->score); - rsc->allowed_nodes = - constraint->rsc_lh->cmds->merge_weights(constraint->rsc_lh, rsc->id, - rsc->allowed_nodes, - constraint->node_attribute, - (float)constraint->score / INFINITY, - (pe_weights_rollback | - pe_weights_positive)); + if (pcmk__colocation_applies(rsc, constraint, true)) { + /* (Re-)add location preferences of resource that wishes to be + * colocated with the promoted instance. + */ + rsc->allowed_nodes = constraint->rsc_lh->cmds->merge_weights(constraint->rsc_lh, + rsc->id, rsc->allowed_nodes, constraint->node_attribute, + constraint->score / (float) INFINITY, + pe_weights_rollback|pe_weights_positive); } } diff --git a/lib/pacemaker/pcmk_sched_utils.c b/lib/pacemaker/pcmk_sched_utils.c index eaaf526..aba417a 100644 --- a/lib/pacemaker/pcmk_sched_utils.c +++ b/lib/pacemaker/pcmk_sched_utils.c @@ -765,3 +765,34 @@ pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op, free(key); return xml_op; } + +/*! + * \internal + * \brief Check whether a colocation constraint should apply + * + * \param[in] rsc Resource of interest (for logging) + * \param[in] colocation Colocation constraint to check + * \param[in] promoted_only If true, constraint applies if right-hand is promoted + */ +bool +pcmk__colocation_applies(pe_resource_t *rsc, pcmk__colocation_t *colocation, + bool promoted_only) +{ + CRM_CHECK((rsc != NULL) && (colocation != NULL), return false); + + if (colocation->score == 0) { + pe_rsc_trace(rsc, "Ignoring colocation constraint %s: 0 score", + colocation->id); + return false; + } + if (promoted_only && (colocation->role_rh != RSC_ROLE_MASTER)) { + pe_rsc_trace(rsc, "Ignoring colocation constraint %s: role", + colocation->id); + return false; + } + pe_rsc_trace(rsc, "Applying colocation constraint %s: %s with %s%s (%d)", + colocation->id, colocation->rsc_lh->id, + (promoted_only? "promoted " : ""), + colocation->rsc_rh->id, colocation->score); + return true; +} -- 1.8.3.1