From: Daniel Kral <d.kral@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH ha-manager 08/16] introduce separate parse_vmid_or_sid helper subroutine
Date: Mon, 20 Jul 2026 14:36:57 +0200 [thread overview]
Message-ID: <20260720123705.216089-9-d.kral@proxmox.com> (raw)
In-Reply-To: <20260720123705.216089-1-d.kral@proxmox.com>
The separate parse_vmid_or_sid() subroutine helps in stricter checking
that vmid references are only allowed in the API/CLI endpoints, while
the HA stack should always use the proper HA resource id ('type:vmid')
format internally.
This makes the parse_sid() subroutine slightly faster (by about 10%) as
it doesn't unnecessarily need to go through the vmid pattern matching.
The use of qr// was considered but increased the runtime again.
Signed-off-by: Daniel Kral <d.kral@proxmox.com>
---
src/PVE/API2/HA/Resources.pm | 13 +++++++------
src/PVE/CLI/ha_manager.pm | 2 +-
src/PVE/HA/Config.pm | 14 +++++++++++---
3 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/src/PVE/API2/HA/Resources.pm b/src/PVE/API2/HA/Resources.pm
index a1fa8856..7f910818 100644
--- a/src/PVE/API2/HA/Resources.pm
+++ b/src/PVE/API2/HA/Resources.pm
@@ -174,7 +174,7 @@ __PACKAGE__->register_method({
my $cfg = PVE::HA::Config::read_resources_config();
my $exclude_group_property = PVE::HA::Config::have_groups_been_migrated();
- my ($sid) = PVE::HA::Config::parse_sid($param->{sid});
+ my ($sid) = PVE::HA::Config::parse_vmid_or_sid($param->{sid});
return &$api_copy_config($cfg, $sid, $exclude_group_property);
},
@@ -198,7 +198,8 @@ __PACKAGE__->register_method({
PVE::Cluster::check_cfs_quorum();
mkdir("/etc/pve/ha");
- my ($sid, $type, $vmid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid'));
+ my ($sid, $type, $vmid) =
+ PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid'));
if (my $param_type = extract_param($param, 'type')) {
# useless, but do it anyway
@@ -253,7 +254,7 @@ __PACKAGE__->register_method({
my $digest = extract_param($param, 'digest');
my $delete = extract_param($param, 'delete');
- my ($sid, $type) = PVE::HA::Config::parse_sid(extract_param($param, 'sid'));
+ my ($sid, $type) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid'));
if (my $param_type = extract_param($param, 'type')) {
# useless, but do it anyway
@@ -313,7 +314,7 @@ __PACKAGE__->register_method({
code => sub {
my ($param) = @_;
- my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid'));
+ my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid'));
my $purge = extract_param($param, 'purge') // 1;
if (!PVE::HA::Config::service_is_configured($sid)) {
@@ -401,7 +402,7 @@ __PACKAGE__->register_method({
my $result = {};
- my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid'));
+ my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid'));
my $req_node = extract_param($param, 'node');
PVE::HA::Config::service_is_ha_managed($sid);
@@ -503,7 +504,7 @@ __PACKAGE__->register_method({
my $result = {};
- my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid'));
+ my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid'));
my $req_node = extract_param($param, 'node');
PVE::HA::Config::service_is_ha_managed($sid);
diff --git a/src/PVE/CLI/ha_manager.pm b/src/PVE/CLI/ha_manager.pm
index 2bec33cb..013742e0 100644
--- a/src/PVE/CLI/ha_manager.pm
+++ b/src/PVE/CLI/ha_manager.pm
@@ -104,7 +104,7 @@ __PACKAGE__->register_method({
code => sub {
my ($param) = @_;
- my ($sid) = PVE::HA::Config::parse_sid(extract_param($param, 'sid'));
+ my ($sid) = PVE::HA::Config::parse_vmid_or_sid(extract_param($param, 'sid'));
PVE::HA::Config::service_is_ha_managed($sid);
diff --git a/src/PVE/HA/Config.pm b/src/PVE/HA/Config.pm
index 77c9737e..db86de82 100644
--- a/src/PVE/HA/Config.pm
+++ b/src/PVE/HA/Config.pm
@@ -198,6 +198,16 @@ sub update_resources_config {
sub parse_sid {
my ($sid) = @_;
+ if (my ($type, $vmid) = $sid =~ m/^(\S+):(\S+)$/) {
+ return ($sid, $type, $vmid);
+ } else {
+ die "unable to parse service id '$sid'\n";
+ }
+}
+
+sub parse_vmid_or_sid {
+ my ($sid) = @_;
+
if (my ($vmid) = $sid =~ m/^(\d+)$/) {
my $vmlist = PVE::Cluster::get_vmlist();
if (defined($vmlist->{ids}->{$vmid})) {
@@ -208,10 +218,8 @@ sub parse_sid {
} else {
die "unable to detect SID from VMID - VM/CT $1 does not exist\n";
}
- } elsif (my ($type, $vmid) = $sid =~ m/^(\S+):(\S+)$/) {
- return ($sid, $type, $vmid);
} else {
- die "unable to parse service id '$sid'\n";
+ return parse_sid($sid);
}
}
--
2.47.3
next prev 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 ` Daniel Kral [this message]
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 ` [PATCH ha-manager 15/16] lrm: compute valid service uids hash set " Daniel Kral
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-9-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.