]> git.proxmox.com Git - pve-ha-manager.git/commitdiff
manager: select service node: allow to force best-score selection withot try-next
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 20 Mar 2023 08:43:06 +0000 (09:43 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 20 Mar 2023 10:09:01 +0000 (11:09 +0100)
useful for re-balanacing on start, where we do not want to exclude
the current node like setting the $try_next param does, but also
don't want to favor it like not setting the $try_next param does.

We might want to transform both, `try_next` and `best_scored` into a
single `mode` parameter to reduce complexity and make it more
explicit what we want here.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/PVE/HA/Manager.pm

index 494134edd3f26d4856887479ddb76a8028475dc2..e6c4215133a467a8c40608bd0877642f89e64dc8 100644 (file)
@@ -143,7 +143,7 @@ sub get_node_priority_groups {
 }
 
 sub select_service_node {
-    my ($groups, $online_node_usage, $sid, $service_conf, $current_node, $try_next, $tried_nodes, $maintenance_fallback) = @_;
+    my ($groups, $online_node_usage, $sid, $service_conf, $current_node, $try_next, $tried_nodes, $maintenance_fallback, $best_scored) = @_;
 
     my $group = get_service_group($groups, $online_node_usage, $service_conf);
 
@@ -153,7 +153,7 @@ sub select_service_node {
     return undef if !scalar(@pri_list);
 
     # stay on current node if possible (avoids random migrations)
-    if (!$try_next && $group->{nofailback} && defined($group_members->{$current_node})) {
+    if ((!$try_next && !$best_scored) && $group->{nofailback} && defined($group_members->{$current_node})) {
        return $current_node;
     }
 
@@ -171,7 +171,7 @@ sub select_service_node {
     return $maintenance_fallback
        if defined($maintenance_fallback) && $pri_groups->{$top_pri}->{$maintenance_fallback};
 
-    return $current_node if !$try_next && $pri_groups->{$top_pri}->{$current_node};
+    return $current_node if (!$try_next && !$best_scored) && $pri_groups->{$top_pri}->{$current_node};
 
     my $scores = $online_node_usage->score_nodes_to_start_service($sid, $current_node);
     my @nodes = sort {
@@ -187,7 +187,7 @@ sub select_service_node {
     }
 
     if ($try_next) {
-       if (defined($found) && ($found < (scalar(@nodes) - 1))) {
+       if (!$best_scored && defined($found) && ($found < (scalar(@nodes) - 1))) {
            return $nodes[$found + 1];
        } else {
            return $nodes[0];