all lists on 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal