From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 235631FF137 for ; Tue, 17 Feb 2026 15:14:11 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 881B32171; Tue, 17 Feb 2026 15:14:54 +0100 (CET) From: Daniel Kral To: pve-devel@lists.proxmox.com Subject: [RFC perl-rs 3/6] pve-rs: resource scheduling: store service stats independently of node Date: Tue, 17 Feb 2026 15:14:02 +0100 Message-ID: <20260217141437.584852-9-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: 1771337676468 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.019 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 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: JJUYLUZJEXY56GP55G5O3S5KBZPIAUTY X-Message-ID-Hash: JJUYLUZJEXY56GP55G5O3S5KBZPIAUTY 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: The static service stats are currently only added to the HashSet in the StaticNodeInfo struct, but for an upcoming patch these stats need to be retrieved independently from the node these are on. Signed-off-by: Daniel Kral --- .../bindings/resource_scheduling_static.rs | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/pve-rs/src/bindings/resource_scheduling_static.rs b/pve-rs/src/bindings/resource_scheduling_static.rs index 4abf742..3764aaa 100644 --- a/pve-rs/src/bindings/resource_scheduling_static.rs +++ b/pve-rs/src/bindings/resource_scheduling_static.rs @@ -24,9 +24,14 @@ pub mod pve_rs_resource_scheduling_static { services: HashMap, } + struct StaticServiceInfo { + stats: StaticServiceUsage, + nodes: HashSet, + } + struct Usage { nodes: HashMap, - service_nodes: HashMap>, + services: HashMap, } /// A scheduler instance contains the resource usage by node. @@ -39,7 +44,7 @@ pub mod pve_rs_resource_scheduling_static { pub fn new(#[raw] class: Value) -> Result { let inner = Usage { nodes: HashMap::new(), - service_nodes: HashMap::new(), + services: HashMap::new(), }; Ok(perlmod::instantiate_magic!( @@ -81,12 +86,12 @@ pub mod pve_rs_resource_scheduling_static { if let Some(node) = usage.nodes.remove(nodename) { for (sid, _) in node.services.iter() { - match usage.service_nodes.get_mut(sid) { - Some(service_nodes) => { - service_nodes.remove(nodename); + match usage.services.get_mut(sid) { + Some(service) => { + service.nodes.remove(nodename); } None => bail!( - "service '{}' not present in service_nodes hashmap while removing node '{}'", + "service '{}' not present in services hashmap while removing node '{}'", sid, nodename ), @@ -138,15 +143,19 @@ pub mod pve_rs_resource_scheduling_static { None => bail!("node '{}' not present in usage hashmap", nodename), } - if let Some(service_nodes) = usage.service_nodes.get_mut(sid) { - if service_nodes.contains(nodename) { + if let Some(service) = usage.services.get_mut(sid) { + if service.nodes.contains(nodename) { bail!("node '{}' already added to service '{}'", nodename, sid); } - service_nodes.insert(nodename.to_string()); + service.nodes.insert(nodename.to_string()); } else { - let service_nodes = HashSet::from([nodename.to_string()]); - usage.service_nodes.insert(sid.to_string(), service_nodes); + let service = StaticServiceInfo { + stats: service_usage, + nodes: HashSet::from([nodename.to_string()]), + }; + + usage.services.insert(sid.to_string(), service); } Ok(()) @@ -157,8 +166,8 @@ pub mod pve_rs_resource_scheduling_static { fn remove_service_usage(#[try_from_ref] this: &Scheduler, sid: &str) -> Result<(), Error> { let mut usage = this.inner.lock().unwrap(); - if let Some(nodes) = usage.service_nodes.remove(sid) { - for nodename in &nodes { + if let Some(service) = usage.services.remove(sid) { + for nodename in &service.nodes { match usage.nodes.get_mut(nodename) { Some(node) => { node.services.remove(sid); -- 2.47.3