From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id E634A1FF137 for ; Tue, 17 Feb 2026 15:20:27 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8FC8F56C4; Tue, 17 Feb 2026 15:21:19 +0100 (CET) From: Daniel Kral To: pve-devel@lists.proxmox.com Subject: [RFC ha-manager 08/21] move static service stats repository to PVE::HA::Usage::Static Date: Tue, 17 Feb 2026 15:14:15 +0100 Message-ID: <20260217141437.584852-22-d.kral@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260217141437.584852-1-d.kral@proxmox.com> References: <20260217141437.584852-1-d.kral@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1771337677495 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.018 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. 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: SOHPA72653EWDZN7ZRCRIR6ONGB7VBLG X-Message-ID-Hash: SOHPA72653EWDZN7ZRCRIR6ONGB7VBLG X-MailFrom: d.kral@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: Since the static service stats are already processed by their individual plugin's implementation of get_static_stats_from_config(...), the static service stats repository can be used by the static load scheduler directly. Signed-off-by: Daniel Kral --- src/PVE/HA/Env.pm | 8 +------ src/PVE/HA/Env/PVE2.pm | 42 +++++++++++------------------------ src/PVE/HA/Manager.pm | 1 - src/PVE/HA/Resources.pm | 6 ----- src/PVE/HA/Resources/PVECT.pm | 6 ----- src/PVE/HA/Resources/PVEVM.pm | 6 ----- src/PVE/HA/Sim/Env.pm | 8 +------ src/PVE/HA/Sim/Hardware.pm | 13 +---------- src/PVE/HA/Sim/Resources.pm | 8 ------- src/PVE/HA/Usage/Static.pm | 23 +++++-------------- 10 files changed, 22 insertions(+), 99 deletions(-) diff --git a/src/PVE/HA/Env.pm b/src/PVE/HA/Env.pm index 64cf3ea5..6843cb30 100644 --- a/src/PVE/HA/Env.pm +++ b/src/PVE/HA/Env.pm @@ -301,15 +301,9 @@ sub get_datacenter_settings { } sub get_static_service_stats { - my ($self, $id) = @_; - - return $self->{plug}->get_static_service_stats($id); -} - -sub update_static_service_stats { my ($self) = @_; - return $self->{plug}->update_static_service_stats(); + return $self->{plug}->get_static_service_stats(); } sub get_static_node_stats { diff --git a/src/PVE/HA/Env/PVE2.pm b/src/PVE/HA/Env/PVE2.pm index 1a9dc4ea..87b1435a 100644 --- a/src/PVE/HA/Env/PVE2.pm +++ b/src/PVE/HA/Env/PVE2.pm @@ -49,8 +49,6 @@ sub new { $self->{nodename} = $nodename; - $self->{static_service_stats} = undef; - return $self; } @@ -505,40 +503,26 @@ sub get_datacenter_settings { } sub get_static_service_stats { - my ($self, $id) = @_; - - # undef if update_static_service_stats(...) failed before - return undef if !defined($self->{static_service_stats}); - - return $self->{static_service_stats}->{$id}; -} - -sub update_static_service_stats { my ($self) = @_; my $properties = ['cores', 'cpulimit', 'memory', 'sockets', 'vcpus']; - my $service_stats = eval { - my $stats = {}; - my $confs = PVE::Cluster::get_guest_config_properties($properties); + my $stats = {}; + my $confs = PVE::Cluster::get_guest_config_properties($properties); - my $vmlist = PVE::Cluster::get_vmlist(); - my $idlist = $vmlist->{ids} // {}; - for my $id (keys %$idlist) { - my $type = eval { PVE::HA::Tools::get_ha_resource_type($idlist->{$id}->{type}) }; - next if $@; # silently ignore unknown pve types + my $vmlist = PVE::Cluster::get_vmlist(); + my $idlist = $vmlist->{ids} // {}; + for my $id (keys %$idlist) { + my $type = eval { PVE::HA::Tools::get_ha_resource_type($idlist->{$id}->{type}) }; + next if $@; # silently ignore unknown pve types - my $sid = "$type:$id"; - my $conf = $confs->{$id} // {}; - my $plugin = PVE::HA::Resources->lookup($type); + my $sid = "$type:$id"; + my $conf = $confs->{$id} // {}; + my $plugin = PVE::HA::Resources->lookup($type); - $stats->{$sid} = $plugin->get_static_stats_from_config($conf); - } + $stats->{$sid} = $plugin->get_static_stats_from_config($conf); + } - return $stats; - }; - $self->log('warning', "unable to update static service stats cache - $@") if $@; - - $self->{static_service_stats} = $service_stats; + return $stats; } sub get_static_node_stats { diff --git a/src/PVE/HA/Manager.pm b/src/PVE/HA/Manager.pm index 2e31296f..57fd0017 100644 --- a/src/PVE/HA/Manager.pm +++ b/src/PVE/HA/Manager.pm @@ -253,7 +253,6 @@ sub recompute_online_node_usage { $online_node_usage = eval { my $scheduler = PVE::HA::Usage::Static->new($haenv); $scheduler->add_node($_) for $online_nodes->@*; - $haenv->update_static_service_stats(); return $scheduler; }; } else { diff --git a/src/PVE/HA/Resources.pm b/src/PVE/HA/Resources.pm index ea7655e5..aa26d019 100644 --- a/src/PVE/HA/Resources.pm +++ b/src/PVE/HA/Resources.pm @@ -182,12 +182,6 @@ sub get_static_stats_from_config { die "implement in subclass"; } -sub get_static_stats { - my ($class, $haenv, $sid) = @_; - - die "implement in subclass"; -} - # package PVE::HA::Resources::IPAddr; # use strict; diff --git a/src/PVE/HA/Resources/PVECT.pm b/src/PVE/HA/Resources/PVECT.pm index bda33717..79bb7c83 100644 --- a/src/PVE/HA/Resources/PVECT.pm +++ b/src/PVE/HA/Resources/PVECT.pm @@ -168,10 +168,4 @@ sub get_static_stats_from_config { }; } -sub get_static_stats { - my ($class, $haenv, $sid) = @_; - - return $haenv->get_static_service_stats($sid); -} - 1; diff --git a/src/PVE/HA/Resources/PVEVM.pm b/src/PVE/HA/Resources/PVEVM.pm index 786c5130..5a0ac348 100644 --- a/src/PVE/HA/Resources/PVEVM.pm +++ b/src/PVE/HA/Resources/PVEVM.pm @@ -189,10 +189,4 @@ sub get_static_stats_from_config { }; } -sub get_static_stats { - my ($class, $haenv, $sid) = @_; - - return $haenv->get_static_service_stats($sid); -} - 1; diff --git a/src/PVE/HA/Sim/Env.pm b/src/PVE/HA/Sim/Env.pm index 32b5224c..0e3b02e5 100644 --- a/src/PVE/HA/Sim/Env.pm +++ b/src/PVE/HA/Sim/Env.pm @@ -489,15 +489,9 @@ sub get_datacenter_settings { } sub get_static_service_stats { - my ($self, $id) = @_; - - return $self->{hardware}->get_static_service_stats($id); -} - -sub update_static_service_stats { my ($self) = @_; - return $self->{hardware}->update_static_service_stats(); + return $self->{hardware}->get_static_service_stats(); } sub get_static_node_stats { diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm index 702500c2..a7e28c8a 100644 --- a/src/PVE/HA/Sim/Hardware.pm +++ b/src/PVE/HA/Sim/Hardware.pm @@ -525,8 +525,6 @@ sub new { $self->{service_config} = $self->read_service_config(); - $self->{static_service_stats} = undef; - return $self; } @@ -1063,22 +1061,13 @@ sub watchdog_update { } sub get_static_service_stats { - my ($self, $id) = @_; - - # undef if update_static_service_stats(...) failed before - return undef if !defined($self->{static_service_stats}); - - return $self->{static_service_stats}->{$id}; -} - -sub update_static_service_stats { my ($self) = @_; my $filename = "$self->{statusdir}/static_service_stats"; my $stats = eval { PVE::HA::Tools::read_json_from_file($filename) }; $self->log('warning', "unable to update static service stats cache - $@") if $@; - $self->{static_service_stats} = $stats; + return $stats; } sub get_static_node_stats { diff --git a/src/PVE/HA/Sim/Resources.pm b/src/PVE/HA/Sim/Resources.pm index f91d3ea2..09a042b6 100644 --- a/src/PVE/HA/Sim/Resources.pm +++ b/src/PVE/HA/Sim/Resources.pm @@ -137,12 +137,4 @@ sub remove_locks { return undef; } -sub get_static_stats { - my ($class, $haenv, $sid) = @_; - - my $hardware = $haenv->hardware(); - - return $hardware->get_static_service_stats($sid); -} - 1; diff --git a/src/PVE/HA/Usage/Static.pm b/src/PVE/HA/Usage/Static.pm index acc3533c..48622d62 100644 --- a/src/PVE/HA/Usage/Static.pm +++ b/src/PVE/HA/Usage/Static.pm @@ -14,12 +14,15 @@ sub new { my $node_stats = eval { $haenv->get_static_node_stats() }; die "did not get static node usage information - $@" if $@; + my $service_stats = eval { $haenv->get_static_service_stats() }; + die "did not get static service usage information - $@" if $@; + my $scheduler = eval { PVE::RS::ResourceScheduling::Static->new(); }; die "unable to initialize static scheduling - $@" if $@; return bless { 'node-stats' => $node_stats, - 'service-stats' => {}, + 'service-stats' => $service_stats, haenv => $haenv, scheduler => $scheduler, 'node-services' => {}, # Services on each node. Fallback if scoring calculation fails. @@ -63,20 +66,8 @@ sub contains_node { my sub get_service_usage { my ($self, $sid) = @_; - return $self->{'service-stats'}->{$sid} if $self->{'service-stats'}->{$sid}; - - my (undef, $type, undef) = $self->{haenv}->parse_sid($sid); - my $plugin = PVE::HA::Resources->lookup($type); - - my $stats = eval { $plugin->get_static_stats($self->{haenv}, $sid) }; - die "did not get static service usage information for '$sid'\n" if !$stats; - - my $service_stats = { - maxcpu => $stats->{maxcpu} + 0.0, # containers allow non-integer cpulimit - maxmem => int($stats->{maxmem}), - }; - - $self->{'service-stats'}->{$sid} = $service_stats; + my $service_stats = $self->{'service-stats'}->{$sid} + or die "did not get static service usage information for '$sid'\n"; return $service_stats; } @@ -101,8 +92,6 @@ sub remove_service_usage { eval { $self->{scheduler}->remove_service_usage($sid) }; $self->{haenv}->log('warning', "unable to remove service '$sid' usage - $@") if $@; - - delete $self->{'service-stats'}->{$sid}; # Invalidate old service stats } sub score_nodes_to_start_service { -- 2.47.3