Some rule checks depend on the list of cluster nodes, e.g., to check
whether a negative resource affinity rule doesn't specify more HA
resources than cluster nodes.

The HA Manager retranslates rules only in certain conditions to reduce
unnecessary computations, but lacks a check whether cluster nodes have
been added or removed, which is different from what users are reported
through the rules API endpoints and web interface.

Fixes: 6c4c0458 ("rules: add haenv node list to the rules' canonicalization 
stage")
Signed-off-by: Daniel Kral <[email protected]>
Reviewed-by: Michael Köppl <[email protected]>
Tested-by: Michael Köppl <[email protected]>
---
 src/PVE/HA/Manager.pm    |  2 ++
 src/PVE/HA/NodeStatus.pm | 14 ++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/src/PVE/HA/Manager.pm b/src/PVE/HA/Manager.pm
index 83167075..9c0a8e09 100644
--- a/src/PVE/HA/Manager.pm
+++ b/src/PVE/HA/Manager.pm
@@ -664,6 +664,7 @@ sub manage {
     my ($haenv, $ms, $ns, $ss) = ($self->{haenv}, $self->{ms}, $self->{ns}, 
$self->{ss});
 
     my ($node_info) = $haenv->get_node_info();
+    my $has_changed_nodelist = $ns->check_for_changed_nodelist($node_info);
     my ($lrm_results, $lrm_modes) = $self->read_lrm_status();
 
     $ns->update($node_info, $lrm_modes);
@@ -719,6 +720,7 @@ sub manage {
 
     if (
         !$self->{rules}
+        || $has_changed_nodelist
         || $new_rules->{digest} ne $self->{last_rules_digest}
         || $self->{groups}->{digest} ne $self->{last_groups_digest}
         || $services_digest && $services_digest ne 
$self->{last_services_digest}
diff --git a/src/PVE/HA/NodeStatus.pm b/src/PVE/HA/NodeStatus.pm
index 1512ae2b..e5dddf3b 100644
--- a/src/PVE/HA/NodeStatus.pm
+++ b/src/PVE/HA/NodeStatus.pm
@@ -90,6 +90,20 @@ sub list_online_nodes {
     return $res;
 }
 
+sub check_for_changed_nodelist {
+    my ($self, $node_info) = @_;
+
+    for my $node (keys %$node_info) {
+        return 1 if !$self->{status}->{$node};
+    }
+
+    for my $node (keys $self->{status}->%*) {
+        return 1 if !$node_info->{$node};
+    }
+
+    return 0;
+}
+
 my $delete_node = sub {
     my ($self, $node) = @_;
 
-- 
2.47.3



_______________________________________________
pve-devel mailing list
[email protected]
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to