From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id D40801FF0BC for ; Thu, 15 Oct 2026 14:51:42 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 5909221618; Thu, 15 Oct 2026 14:51:22 +0200 (CEST) From: Fiona Ebner To: pve-devel@lists.proxmox.com Subject: [PATCH ha-manager v4 05/27] manager: factor out helper to check if requested resource motion is valid Date: Thu, 15 Oct 2026 14:50:39 +0200 Message-ID: <20261015125112.174954-6-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20261015125112.174954-1-f.ebner@proxmox.com> References: <20261015125112.174954-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1792068676416 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.420 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: 73KX7PYU5P4SHCCFV7YIPMQMNQ7RT354 X-Message-ID-Hash: 73KX7PYU5P4SHCCFV7YIPMQMNQ7RT354 X-MailFrom: f.ebner@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Avoids some duplication. No functional change is intended. Suggested-by: Daniel Kral Signed-off-by: Fiona Ebner --- Changes in v4: * Split into its own patch and also use for CRM check. src/PVE/HA/Manager.pm | 55 +++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/PVE/HA/Manager.pm b/src/PVE/HA/Manager.pm index 0aef118..b5da4b7 100644 --- a/src/PVE/HA/Manager.pm +++ b/src/PVE/HA/Manager.pm @@ -666,6 +666,24 @@ sub any_resource_motion_queued_or_running { return 0; } +my sub check_resource_motion_valid { + my ($self, $target, $sd, $logprefix) = @_; + + my ($haenv, $ns) = $self->@{qw(haenv ns)}; + + if (!$ns->node_is_online($target)) { + $haenv->log('err', "$logprefix - node '$target' not online"); + return 0; + } + + if ($target eq $sd->{node}) { + $haenv->log('info', "$logprefix - service already on node '$target'"); + return 0; + } + + return 1; +} + # read new crm commands and save them into crm master status sub update_crm_commands { my ($self) = @_; @@ -680,17 +698,8 @@ sub update_crm_commands { if ($cmd =~ m/^(migrate|relocate)\s+(\S+)\s+(\S+)$/) { my ($task, $sid, $node) = ($1, $2, $3); if (my $sd = $ss->{$sid}) { - if (!$ns->node_is_online($node)) { - $haenv->log('err', "ignore crm command '$cmd' - node '$node' not online"); - } else { - if ($node eq $sd->{node}) { - $haenv->log( - 'info', - "ignore crm command '$cmd' - service already on node '$node'", - ); - } else { - $self->queue_resource_motion($cmd, $task, $sid, $node); - } + if (check_resource_motion_valid($self, $node, $sd, "ignore crm command '$cmd'")) { + $self->queue_resource_motion($cmd, $task, $sid, $node); } } else { $haenv->log('err', "crm command error - no such service: $cmd"); @@ -1308,15 +1317,8 @@ sub next_state_stopped { if ($cmd eq 'migrate' || $cmd eq 'relocate') { my $target = shift @{ $sd->{cmd} }; - if (!$ns->node_is_online($target)) { - $haenv->log('err', - "ignore service '$sid' $cmd request - node '$target' not online"); - } elsif ($sd->{node} eq $target) { - $haenv->log( - 'info', - "ignore service '$sid' $cmd request - service already on node '$target'", - ); - } else { + my $logprefix = "ignore service '$sid' $cmd request"; + if (check_resource_motion_valid($self, $target, $sd, $logprefix)) { &$change_service_state($self, $sid, $cmd, node => $sd->{node}, target => $target); return; } @@ -1432,17 +1434,8 @@ sub next_state_started { if ($cmd eq 'migrate' || $cmd eq 'relocate') { my $target = shift @{ $sd->{cmd} }; - if (!$ns->node_is_online($target)) { - $haenv->log( - 'err', - "ignore service '$sid' $cmd request - node '$target' not online", - ); - } elsif ($sd->{node} eq $target) { - $haenv->log( - 'info', - "ignore service '$sid' $cmd request - service already on node '$target'", - ); - } else { + my $logprefix = "ignore service '$sid' $cmd request"; + if (check_resource_motion_valid($self, $target, $sd, $logprefix)) { $haenv->log('info', "$cmd service '$sid' to node '$target'"); &$change_service_state( $self, $sid, $cmd, -- 2.47.3