public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Daniel Kral <d.kral@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH ha-manager 15/16] lrm: compute valid service uids hash set once per work iteration
Date: Mon, 20 Jul 2026 14:37:04 +0200	[thread overview]
Message-ID: <20260720123705.216089-16-d.kral@proxmox.com> (raw)
In-Reply-To: <20260720123705.216089-1-d.kral@proxmox.com>

The $self->{service_status} property is read-only and updated once per
work iteration. This makes the recomputation on every resource command
completion in resource_command_finished() unnecessary.

In a test startup of 768 HA resources on a single node at the same time
showed a ~2.5 speedup for resource_command_finished().

+---------------------------+---------------+--------------+
|        Subroutine         | Before Change | After Change |
+---------------------------+---------------+--------------+
| check_active_workers      | 11.6ms        | 4.09ms       |
| resource_command_finished | 2.81ms        | 1.09ms       |
+---------------------------+---------------+--------------+

The profiling was done on a physical host with Devel::NYTProf 6.14 [0].

[0] https://metacpan.org/pod/Devel::NYTProf

Signed-off-by: Daniel Kral <d.kral@proxmox.com>
---
 src/PVE/HA/LRM.pm | 21 ++++++++-------------
 1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/src/PVE/HA/LRM.pm b/src/PVE/HA/LRM.pm
index 5f77580c..911672cb 100644
--- a/src/PVE/HA/LRM.pm
+++ b/src/PVE/HA/LRM.pm
@@ -47,6 +47,8 @@ sub new {
         # service_status from manager_status in current work() iteration
         # does contain all HA resources, users must filter for the assigned node
         service_status => {},
+        # UIDs from the service_status in current work() iteration
+        service_status_uids => {},
         # node_status from manager_status in current work() iteration
         # this is currently only used to check whether a fence for the node is requested
         # see $PVE::HA::NodeStatus::valid_node_states for possible values
@@ -220,7 +222,8 @@ C<L<manager_status|PVE::HA::Env::read_manager_status()>> and
 C<L<checked service_config|PVE::HA::Env::read_service_config()>>.
 
 The internal LRM status properties that are updated are C<node_status>,
-C<service_config>, C<service_status>, and C<shutdown_request>.
+C<service_config>, C<service_status>, C<service_status_uids>, and
+C<shutdown_request>.
 
 Returns 1 if the update was successful, otherwise returns undef.
 
@@ -237,7 +240,9 @@ sub update_lrm_status {
         return undef;
     } else {
         $self->{service_config} = $haenv->read_service_config();
-        $self->{service_status} = $ms->{service_status} || {};
+        my $ss = $ms->{service_status} || {};
+        $self->{service_status} = $ss;
+        $self->{service_status_uids} = { map { $ss->{$_}->{uid} => 1 } keys %$ss };
         my $nodename = $haenv->nodename();
         $self->{node_status} = $ms->{node_status}->{$nodename} || 'unknown';
 
@@ -886,19 +891,9 @@ sub resource_command_finished {
         exit_code => $exit_code,
     };
 
-    my $ss = $self->{service_status};
-
-    # compute hash of valid/existing uids
-    my $valid_uids = {};
-    foreach my $sid (keys %$ss) {
-        my $sd = $ss->{$sid};
-        next if !$sd->{uid};
-        $valid_uids->{ $sd->{uid} } = 1;
-    }
-
     my $results = {};
     foreach my $id (keys %{ $self->{results} }) {
-        next if !$valid_uids->{$id};
+        next if !$self->{service_status_uids}->{$id};
         $results->{$id} = $self->{results}->{$id};
     }
     $self->{results} = $results;
-- 
2.47.3





  parent reply	other threads:[~2026-07-20 12:39 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-20 12:36 [PATCH-SERIES ha-manager 00/16] some sid parsing and LRM speedup improvements Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 01/16] make tidy Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 02/16] resources: remove commented ipaddr resource type Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 03/16] tree-wide: use the term vmid instead of name when referring to VMs/CTs Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 04/16] api: resources: remove unused return values at parse_sid callsites Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 05/16] make parse_sid always return an array Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 06/16] config: use early returns in parse_sid Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 07/16] config: make update_single_resource_config_inplace only allow sids Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 08/16] introduce separate parse_vmid_or_sid helper subroutine Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 09/16] drop the unmodified sid return array entry value from parse_sid Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 10/16] lrm: document and initialize LRM instance properties Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 11/16] lrm: rename update_lrm_status to flush_lrm_status Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 12/16] lrm: rename update_service_status to update_lrm_status Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 13/16] lrm: update the service status once per work iteration Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 14/16] lrm: read service config " Daniel Kral
2026-07-20 12:37 ` Daniel Kral [this message]
2026-07-20 12:37 ` [PATCH ha-manager 16/16] lrm: prune non-existent HA resources from results " Daniel Kral

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260720123705.216089-16-d.kral@proxmox.com \
    --to=d.kral@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal