From 6e5d574de9ad3a131cc0c51f2c5300e2cf4e7db3 Mon Sep 17 00:00:00 2001 From: Klaus Wenninger Date: Tue, 7 Oct 2025 05:07:04 +0200 Subject: [PATCH 1/2] Test: scheduler: promoted state with promoted state with attribute Add testcase. Previous fix attribute based colocation didn't adhere the attribute with promoted state with promoted state. --- cts/cts-scheduler.in | 1 + ...motable-colocation-with-node-attribute.dot | 28 +++ ...motable-colocation-with-node-attribute.exp | 175 ++++++++++++++++++ ...able-colocation-with-node-attribute.scores | 81 ++++++++ ...ble-colocation-with-node-attribute.summary | 45 +++++ ...motable-colocation-with-node-attribute.xml | 155 ++++++++++++++++ 6 files changed, 485 insertions(+) create mode 100644 cts/scheduler/dot/promotable-colocation-with-node-attribute.dot create mode 100644 cts/scheduler/exp/promotable-colocation-with-node-attribute.exp create mode 100644 cts/scheduler/scores/promotable-colocation-with-node-attribute.scores create mode 100644 cts/scheduler/summary/promotable-colocation-with-node-attribute.summary create mode 100644 cts/scheduler/xml/promotable-colocation-with-node-attribute.xml diff --git a/cts/cts-scheduler.in b/cts/cts-scheduler.in index f5d4ed5..be8af87 100644 --- a/cts/cts-scheduler.in +++ b/cts/cts-scheduler.in @@ -633,6 +633,7 @@ TESTS = [ SchedulerTest("no_quorum_demote", "Promotable demotion and primitive stop with no-quorum-policy=\"demote\""), SchedulerTest("no-promote-on-unrunnable-guest", "Don't select bundle instance for promotion when container can't run"), SchedulerTest("leftover-pending-monitor", "Prevent a leftover pending monitor from causing unexpected stop of other instances"), + SchedulerTest("promotable-colocation-with-node-attribute", "Promote dependent clone on nodes belonging to a site that has a primary clone promoted"), ]), SchedulerTestGroup([ SchedulerTest("history-1", "Correctly parse stateful-1 resource state"), diff --git a/cts/scheduler/dot/promotable-colocation-with-node-attribute.dot b/cts/scheduler/dot/promotable-colocation-with-node-attribute.dot new file mode 100644 index 0000000..89d066f --- /dev/null +++ b/cts/scheduler/dot/promotable-colocation-with-node-attribute.dot @@ -0,0 +1,28 @@ + digraph "g" { +"dependent-clone_demote_0" -> "dependent-clone_demoted_0" [ style = bold] +"dependent-clone_demote_0" -> "dependent-rsc_demote_0 node3" [ style = bold] +"dependent-clone_demote_0" [ style=bold color="green" fontcolor="orange"] +"dependent-clone_demoted_0" -> "dependent-clone_promote_0" [ style = bold] +"dependent-clone_demoted_0" [ style=bold color="green" fontcolor="orange"] +"dependent-clone_promote_0" -> "dependent-rsc_promote_0 node1" [ style = bold] +"dependent-clone_promote_0" -> "dependent-rsc_promote_0 node2" [ style = bold] +"dependent-clone_promote_0" [ style=bold color="green" fontcolor="orange"] +"dependent-clone_promoted_0" [ style=bold color="green" fontcolor="orange"] +"dependent-rsc_demote_0 node3" -> "dependent-clone_demoted_0" [ style = bold] +"dependent-rsc_demote_0 node3" -> "dependent-rsc_monitor_11000 node3" [ style = bold] +"dependent-rsc_demote_0 node3" [ style=bold color="green" fontcolor="black"] +"dependent-rsc_monitor_10000 node1" [ style=bold color="green" fontcolor="black"] +"dependent-rsc_monitor_10000 node2" [ style=bold color="green" fontcolor="black"] +"dependent-rsc_monitor_11000 node3" [ style=bold color="green" fontcolor="black"] +"dependent-rsc_monitor_11000 node4" [ style=bold color="green" fontcolor="black"] +"dependent-rsc_promote_0 node1" -> "dependent-clone_promoted_0" [ style = bold] +"dependent-rsc_promote_0 node1" -> "dependent-rsc_monitor_10000 node1" [ style = bold] +"dependent-rsc_promote_0 node1" [ style=bold color="green" fontcolor="black"] +"dependent-rsc_promote_0 node2" -> "dependent-clone_promoted_0" [ style = bold] +"dependent-rsc_promote_0 node2" -> "dependent-rsc_monitor_10000 node2" [ style = bold] +"dependent-rsc_promote_0 node2" [ style=bold color="green" fontcolor="black"] +"primary-rsc_monitor_10000 node1" [ style=bold color="green" fontcolor="black"] +"primary-rsc_monitor_11000 node2" [ style=bold color="green" fontcolor="black"] +"primary-rsc_monitor_11000 node3" [ style=bold color="green" fontcolor="black"] +"primary-rsc_monitor_11000 node4" [ style=bold color="green" fontcolor="black"] +} diff --git a/cts/scheduler/exp/promotable-colocation-with-node-attribute.exp b/cts/scheduler/exp/promotable-colocation-with-node-attribute.exp new file mode 100644 index 0000000..76371f1 --- /dev/null +++ b/cts/scheduler/exp/promotable-colocation-with-node-attribute.exp @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cts/scheduler/scores/promotable-colocation-with-node-attribute.scores b/cts/scheduler/scores/promotable-colocation-with-node-attribute.scores new file mode 100644 index 0000000..023ee77 --- /dev/null +++ b/cts/scheduler/scores/promotable-colocation-with-node-attribute.scores @@ -0,0 +1,81 @@ + +dependent-rsc:0 promotion score on node1: INFINITY +dependent-rsc:1 promotion score on node2: INFINITY +dependent-rsc:2 promotion score on node3: -INFINITY +dependent-rsc:3 promotion score on node4: -INFINITY +pcmk__clone_assign: dependent-clone allocation score on node1: 0 +pcmk__clone_assign: dependent-clone allocation score on node2: 0 +pcmk__clone_assign: dependent-clone allocation score on node3: 0 +pcmk__clone_assign: dependent-clone allocation score on node4: 0 +pcmk__clone_assign: dependent-rsc:0 allocation score on node1: 6 +pcmk__clone_assign: dependent-rsc:0 allocation score on node2: 0 +pcmk__clone_assign: dependent-rsc:0 allocation score on node3: 0 +pcmk__clone_assign: dependent-rsc:0 allocation score on node4: 0 +pcmk__clone_assign: dependent-rsc:1 allocation score on node1: 0 +pcmk__clone_assign: dependent-rsc:1 allocation score on node2: 6 +pcmk__clone_assign: dependent-rsc:1 allocation score on node3: 0 +pcmk__clone_assign: dependent-rsc:1 allocation score on node4: 0 +pcmk__clone_assign: dependent-rsc:2 allocation score on node1: 0 +pcmk__clone_assign: dependent-rsc:2 allocation score on node2: 0 +pcmk__clone_assign: dependent-rsc:2 allocation score on node3: 11 +pcmk__clone_assign: dependent-rsc:2 allocation score on node4: 0 +pcmk__clone_assign: dependent-rsc:3 allocation score on node1: 0 +pcmk__clone_assign: dependent-rsc:3 allocation score on node2: 0 +pcmk__clone_assign: dependent-rsc:3 allocation score on node3: 0 +pcmk__clone_assign: dependent-rsc:3 allocation score on node4: 6 +pcmk__clone_assign: primary-clone allocation score on node1: 0 +pcmk__clone_assign: primary-clone allocation score on node2: 0 +pcmk__clone_assign: primary-clone allocation score on node3: 0 +pcmk__clone_assign: primary-clone allocation score on node4: 0 +pcmk__clone_assign: primary-rsc:0 allocation score on node1: 11 +pcmk__clone_assign: primary-rsc:0 allocation score on node2: 0 +pcmk__clone_assign: primary-rsc:0 allocation score on node3: 0 +pcmk__clone_assign: primary-rsc:0 allocation score on node4: 0 +pcmk__clone_assign: primary-rsc:1 allocation score on node1: 0 +pcmk__clone_assign: primary-rsc:1 allocation score on node2: 6 +pcmk__clone_assign: primary-rsc:1 allocation score on node3: 0 +pcmk__clone_assign: primary-rsc:1 allocation score on node4: 0 +pcmk__clone_assign: primary-rsc:2 allocation score on node1: 0 +pcmk__clone_assign: primary-rsc:2 allocation score on node2: 0 +pcmk__clone_assign: primary-rsc:2 allocation score on node3: 6 +pcmk__clone_assign: primary-rsc:2 allocation score on node4: 0 +pcmk__clone_assign: primary-rsc:3 allocation score on node1: 0 +pcmk__clone_assign: primary-rsc:3 allocation score on node2: 0 +pcmk__clone_assign: primary-rsc:3 allocation score on node3: 0 +pcmk__clone_assign: primary-rsc:3 allocation score on node4: 6 +pcmk__primitive_assign: dependent-rsc:0 allocation score on node1: 6 +pcmk__primitive_assign: dependent-rsc:0 allocation score on node2: 0 +pcmk__primitive_assign: dependent-rsc:0 allocation score on node3: -INFINITY +pcmk__primitive_assign: dependent-rsc:0 allocation score on node4: 0 +pcmk__primitive_assign: dependent-rsc:1 allocation score on node1: -INFINITY +pcmk__primitive_assign: dependent-rsc:1 allocation score on node2: 6 +pcmk__primitive_assign: dependent-rsc:1 allocation score on node3: -INFINITY +pcmk__primitive_assign: dependent-rsc:1 allocation score on node4: 0 +pcmk__primitive_assign: dependent-rsc:2 allocation score on node1: 0 +pcmk__primitive_assign: dependent-rsc:2 allocation score on node2: 0 +pcmk__primitive_assign: dependent-rsc:2 allocation score on node3: 11 +pcmk__primitive_assign: dependent-rsc:2 allocation score on node4: 0 +pcmk__primitive_assign: dependent-rsc:3 allocation score on node1: -INFINITY +pcmk__primitive_assign: dependent-rsc:3 allocation score on node2: -INFINITY +pcmk__primitive_assign: dependent-rsc:3 allocation score on node3: -INFINITY +pcmk__primitive_assign: dependent-rsc:3 allocation score on node4: 6 +pcmk__primitive_assign: primary-rsc:0 allocation score on node1: 11 +pcmk__primitive_assign: primary-rsc:0 allocation score on node2: 0 +pcmk__primitive_assign: primary-rsc:0 allocation score on node3: 0 +pcmk__primitive_assign: primary-rsc:0 allocation score on node4: 0 +pcmk__primitive_assign: primary-rsc:1 allocation score on node1: -INFINITY +pcmk__primitive_assign: primary-rsc:1 allocation score on node2: 6 +pcmk__primitive_assign: primary-rsc:1 allocation score on node3: 0 +pcmk__primitive_assign: primary-rsc:1 allocation score on node4: 0 +pcmk__primitive_assign: primary-rsc:2 allocation score on node1: -INFINITY +pcmk__primitive_assign: primary-rsc:2 allocation score on node2: -INFINITY +pcmk__primitive_assign: primary-rsc:2 allocation score on node3: 6 +pcmk__primitive_assign: primary-rsc:2 allocation score on node4: 0 +pcmk__primitive_assign: primary-rsc:3 allocation score on node1: -INFINITY +pcmk__primitive_assign: primary-rsc:3 allocation score on node2: -INFINITY +pcmk__primitive_assign: primary-rsc:3 allocation score on node3: -INFINITY +pcmk__primitive_assign: primary-rsc:3 allocation score on node4: 6 +primary-rsc:0 promotion score on node1: 10 +primary-rsc:1 promotion score on node2: 5 +primary-rsc:2 promotion score on node3: 5 +primary-rsc:3 promotion score on node4: 5 diff --git a/cts/scheduler/summary/promotable-colocation-with-node-attribute.summary b/cts/scheduler/summary/promotable-colocation-with-node-attribute.summary new file mode 100644 index 0000000..30e81c8 --- /dev/null +++ b/cts/scheduler/summary/promotable-colocation-with-node-attribute.summary @@ -0,0 +1,45 @@ +Current cluster status: + * Node List: + * Online: [ node1 node2 node3 node4 ] + + * Full List of Resources: + * Clone Set: primary-clone [primary-rsc] (promotable): + * Promoted: [ node1 ] + * Unpromoted: [ node2 node3 node4 ] + * Clone Set: dependent-clone [dependent-rsc] (promotable): + * Promoted: [ node3 ] + * Unpromoted: [ node1 node2 node4 ] + +Transition Summary: + * Promote dependent-rsc:0 ( Unpromoted -> Promoted node1 ) + * Promote dependent-rsc:1 ( Unpromoted -> Promoted node2 ) + * Demote dependent-rsc:2 ( Promoted -> Unpromoted node3 ) + +Executing Cluster Transition: + * Resource action: primary-rsc monitor=10000 on node1 + * Resource action: primary-rsc monitor=11000 on node2 + * Resource action: primary-rsc monitor=11000 on node3 + * Resource action: primary-rsc monitor=11000 on node4 + * Resource action: dependent-rsc monitor=11000 on node4 + * Pseudo action: dependent-clone_demote_0 + * Resource action: dependent-rsc demote on node3 + * Pseudo action: dependent-clone_demoted_0 + * Pseudo action: dependent-clone_promote_0 + * Resource action: dependent-rsc promote on node1 + * Resource action: dependent-rsc promote on node2 + * Resource action: dependent-rsc monitor=11000 on node3 + * Pseudo action: dependent-clone_promoted_0 + * Resource action: dependent-rsc monitor=10000 on node1 + * Resource action: dependent-rsc monitor=10000 on node2 + +Revised Cluster Status: + * Node List: + * Online: [ node1 node2 node3 node4 ] + + * Full List of Resources: + * Clone Set: primary-clone [primary-rsc] (promotable): + * Promoted: [ node1 ] + * Unpromoted: [ node2 node3 node4 ] + * Clone Set: dependent-clone [dependent-rsc] (promotable): + * Promoted: [ node1 node2 ] + * Unpromoted: [ node3 node4 ] diff --git a/cts/scheduler/xml/promotable-colocation-with-node-attribute.xml b/cts/scheduler/xml/promotable-colocation-with-node-attribute.xml new file mode 100644 index 0000000..5b4ab10 --- /dev/null +++ b/cts/scheduler/xml/promotable-colocation-with-node-attribute.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.47.1 From 31d5785ffc68acb54af76bc55f732117f77ef4b9 Mon Sep 17 00:00:00 2001 From: Klaus Wenninger Date: Tue, 7 Oct 2025 05:11:44 +0200 Subject: [PATCH 2/2] Fix: scheduler: promoted state with promoted state with attribute Previously attribute based colocation didn't adhere the attribute with promoted state with promoted state. --- lib/pacemaker/libpacemaker_private.h | 5 +- lib/pacemaker/pcmk_sched_bundle.c | 2 +- lib/pacemaker/pcmk_sched_clone.c | 2 +- lib/pacemaker/pcmk_sched_instances.c | 76 ++++++++++++++++++--------- lib/pacemaker/pcmk_sched_probes.c | 2 +- lib/pacemaker/pcmk_sched_promotable.c | 3 +- 6 files changed, 60 insertions(+), 30 deletions(-) diff --git a/lib/pacemaker/libpacemaker_private.h b/lib/pacemaker/libpacemaker_private.h index 58435a6..fadfc8b 100644 --- a/lib/pacemaker/libpacemaker_private.h +++ b/lib/pacemaker/libpacemaker_private.h @@ -941,13 +941,14 @@ void pcmk__create_instance_actions(pcmk_resource_t *rsc, GList *instances); G_GNUC_INTERNAL bool pcmk__instance_matches(const pcmk_resource_t *instance, const pcmk_node_t *node, enum rsc_role_e role, - bool current); + bool current, const char *node_attribute); 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); + bool current, + const char *node_attribute); G_GNUC_INTERNAL uint32_t pcmk__instance_update_ordered_actions(pcmk_action_t *first, diff --git a/lib/pacemaker/pcmk_sched_bundle.c b/lib/pacemaker/pcmk_sched_bundle.c index 14e7be5..2d7e879 100644 --- a/lib/pacemaker/pcmk_sched_bundle.c +++ b/lib/pacemaker/pcmk_sched_bundle.c @@ -383,7 +383,7 @@ match_replica_container(const pcmk__bundle_replica_t *replica, void *user_data) struct match_data *match_data = user_data; if (pcmk__instance_matches(replica->container, match_data->node, - pcmk_role_unknown, false)) { + pcmk_role_unknown, false, NULL)) { match_data->container = replica->container; return false; // Match found, don't bother searching further replicas } diff --git a/lib/pacemaker/pcmk_sched_clone.c b/lib/pacemaker/pcmk_sched_clone.c index 4f86621..99fa8b2 100644 --- a/lib/pacemaker/pcmk_sched_clone.c +++ b/lib/pacemaker/pcmk_sched_clone.c @@ -301,7 +301,7 @@ pcmk__clone_apply_coloc_score(pcmk_resource_t *dependent, primary_instance = pcmk__find_compatible_instance(dependent, primary, pcmk_role_unknown, - false); + false, NULL); if (primary_instance != NULL) { pcmk__rsc_debug(primary, "Interleaving %s with %s", dependent->id, primary_instance->id); diff --git a/lib/pacemaker/pcmk_sched_instances.c b/lib/pacemaker/pcmk_sched_instances.c index f2bc1a4..5344234 100644 --- a/lib/pacemaker/pcmk_sched_instances.c +++ b/lib/pacemaker/pcmk_sched_instances.c @@ -1073,18 +1073,22 @@ free_instance_list(const pcmk_resource_t *rsc, GList *list) * \internal * \brief Check whether an instance is compatible with a role and node * - * \param[in] instance Clone instance or bundle replica container - * \param[in] node Instance must match this node - * \param[in] role If not pcmk_role_unknown, instance must match this role - * \param[in] current If true, compare instance's original node and role, - * otherwise compare assigned next node and role + * \param[in] instance Clone instance or bundle replica container + * \param[in] node Instance must match this node + * \param[in] role If not pcmk_role_unknown, instance must match this role + * \param[in] current If true, compare instance's original node and role, + * otherwise compare assigned next node and role + * \param[in] node_attribute If not NULL, instance's node must have the same value + * for this attribute as \p node (instead of requiring + * the exact same node) * * \return true if \p instance is compatible with \p node and \p role, * otherwise false */ bool pcmk__instance_matches(const pcmk_resource_t *instance, const pcmk_node_t *node, - enum rsc_role_e role, bool current) + enum rsc_role_e role, bool current, + const char *node_attribute) { pcmk_node_t *instance_node = NULL; @@ -1117,7 +1121,25 @@ pcmk__instance_matches(const pcmk_resource_t *instance, const pcmk_node_t *node, return false; } - if (!pcmk__same_node(instance_node, node)) { + if (node_attribute != NULL) { + // Compare by node attribute value instead of node identity + const char *instance_value = pcmk__colocation_node_attr(instance_node, + node_attribute, + instance); + const char *target_value = pcmk__colocation_node_attr(node, + node_attribute, + instance); + + if (!pcmk__str_eq(instance_value, target_value, pcmk__str_casei)) { + pcmk__rsc_trace(instance, + "%s is not a compatible instance " + "(instance has %s=%s, target node has %s=%s)", + instance->id, node_attribute, + pcmk__s(instance_value, ""), + node_attribute, pcmk__s(target_value, "")); + return false; + } + } else if (!pcmk__same_node(instance_node, node)) { pcmk__rsc_trace(instance, "%s is not a compatible instance " "(assigned to %s not %s)", @@ -1136,12 +1158,14 @@ pcmk__instance_matches(const pcmk_resource_t *instance, const pcmk_node_t *node, * \internal * \brief Find an instance that matches a given resource by node and role * - * \param[in] match_rsc Resource that instance must match (for logging only) - * \param[in] rsc Clone or bundle resource to check for matching instance - * \param[in] node Instance must match this node - * \param[in] role If not pcmk_role_unknown, instance must match this role - * \param[in] current If true, compare instance's original node and role, - * otherwise compare assigned next node and role + * \param[in] match_rsc Resource that instance must match (for logging only) + * \param[in] rsc Clone or bundle resource to check for matching instance + * \param[in] node Instance must match this node + * \param[in] role If not pcmk_role_unknown, instance must match this role + * \param[in] current If true, compare instance's original node and role, + * otherwise compare assigned next node and role + * \param[in] node_attribute If not NULL, match instances by this node attribute + * instead of by node identity * * \return \p rsc instance matching \p node and \p role if any, otherwise NULL */ @@ -1149,7 +1173,7 @@ static pcmk_resource_t * find_compatible_instance_on_node(const pcmk_resource_t *match_rsc, const pcmk_resource_t *rsc, const pcmk_node_t *node, enum rsc_role_e role, - bool current) + bool current, const char *node_attribute) { GList *instances = NULL; @@ -1157,7 +1181,8 @@ find_compatible_instance_on_node(const pcmk_resource_t *match_rsc, for (GList *iter = instances; iter != NULL; iter = iter->next) { pcmk_resource_t *instance = (pcmk_resource_t *) iter->data; - if (pcmk__instance_matches(instance, node, role, current)) { + if (pcmk__instance_matches(instance, node, role, current, + node_attribute)) { pcmk__rsc_trace(match_rsc, "Found %s %s instance %s compatible with %s on %s", display_role(role), rsc->id, instance->id, @@ -1179,11 +1204,13 @@ find_compatible_instance_on_node(const pcmk_resource_t *match_rsc, * \internal * \brief Find a clone instance or bundle container compatible with a resource * - * \param[in] match_rsc Resource that instance must match - * \param[in] rsc Clone or bundle resource to check for matching instance - * \param[in] role If not pcmk_role_unknown, instance must match this role - * \param[in] current If true, compare instance's original node and role, - * otherwise compare assigned next node and role + * \param[in] match_rsc Resource that instance must match + * \param[in] rsc Clone or bundle resource to check for matching instance + * \param[in] role If not pcmk_role_unknown, instance must match this role + * \param[in] current If true, compare instance's original node and role, + * otherwise compare assigned next node and role + * \param[in] node_attribute If not NULL, match instances by this node attribute + * instead of by node identity * * \return Compatible (by \p role and \p match_rsc location) instance of \p rsc * if any, otherwise NULL @@ -1191,7 +1218,7 @@ find_compatible_instance_on_node(const pcmk_resource_t *match_rsc, 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) + bool current, const char *node_attribute) { pcmk_resource_t *instance = NULL; GList *nodes = NULL; @@ -1207,7 +1234,7 @@ pcmk__find_compatible_instance(const pcmk_resource_t *match_rsc, node = match_rsc->priv->fns->location(match_rsc, NULL, target); if (node != NULL) { return find_compatible_instance_on_node(match_rsc, rsc, node, role, - current); + current, node_attribute); } // Otherwise check for an instance matching any of match_rsc's allowed nodes @@ -1216,7 +1243,8 @@ pcmk__find_compatible_instance(const pcmk_resource_t *match_rsc, iter = iter->next) { instance = find_compatible_instance_on_node(match_rsc, rsc, (pcmk_node_t *) iter->data, - role, current); + role, current, + node_attribute); } if (instance == NULL) { @@ -1423,7 +1451,7 @@ update_interleaved_actions(pcmk_action_t *first, pcmk_action_t *then, first_instance = pcmk__find_compatible_instance(then_instance, first->rsc, pcmk_role_unknown, - current); + current, NULL); if (first_instance == NULL) { // No instance can be interleaved if (unassign_if_mandatory(first, then, then_instance, type, diff --git a/lib/pacemaker/pcmk_sched_probes.c b/lib/pacemaker/pcmk_sched_probes.c index bda90ce..a7d2364 100644 --- a/lib/pacemaker/pcmk_sched_probes.c +++ b/lib/pacemaker/pcmk_sched_probes.c @@ -614,7 +614,7 @@ add_restart_orderings_for_probe(pcmk_action_t *probe, pcmk_action_t *after) compatible_rsc = pcmk__find_compatible_instance(probe->rsc, after->rsc, pcmk_role_unknown, - false); + false, NULL); } } diff --git a/lib/pacemaker/pcmk_sched_promotable.c b/lib/pacemaker/pcmk_sched_promotable.c index cdf276f..0da0d8b 100644 --- a/lib/pacemaker/pcmk_sched_promotable.c +++ b/lib/pacemaker/pcmk_sched_promotable.c @@ -1333,7 +1333,8 @@ pcmk__update_promotable_dependent_priority(const pcmk_resource_t *primary, // Look for a primary instance where dependent will be primary_instance = pcmk__find_compatible_instance(dependent, primary, colocation->primary_role, - false); + false, + colocation->node_attribute); if (primary_instance != NULL) { // Add primary instance's priority to dependent's -- 2.47.1