[pdm-devel] [RFC datacenter-manager 8/8] remote task cache: handle PBS tasks correctly

Lukas Wagner l.wagner at proxmox.com
Tue Nov 11 11:50:59 CET 2025


The remote task cache assumed in some cases that all UPIDs were PVE
UPIDs; mostly for simplicity, since PBS remotes were not implemented yet
at the time of implementation of the task cache.

The new remote_type and native_upid functions for the RemoteUpid struct
makes it pretty simple to add support for PBS.

Signed-off-by: Lukas Wagner <l.wagner at proxmox.com>
---
 server/src/remote_tasks/mod.rs        | 21 ++++++++++++++++-----
 server/src/remote_tasks/task_cache.rs | 19 ++++++++++++-------
 2 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/server/src/remote_tasks/mod.rs b/server/src/remote_tasks/mod.rs
index 37e689e0..f39d0b77 100644
--- a/server/src/remote_tasks/mod.rs
+++ b/server/src/remote_tasks/mod.rs
@@ -2,7 +2,7 @@ use std::path::Path;
 
 use anyhow::Error;
 
-use pdm_api_types::{RemoteUpid, TaskFilters, TaskListItem, TaskStateType};
+use pdm_api_types::{NativeUpid, RemoteUpid, TaskFilters, TaskListItem, TaskStateType};
 use pve_api_types::PveUpid;
 
 pub mod task_cache;
@@ -52,10 +52,9 @@ pub async fn get_tasks(
                         return None;
                     }
                 }
-                // TODO: Handle PBS tasks
-                let pve_upid: Result<PveUpid, Error> = task.upid.upid().parse();
-                match pve_upid {
-                    Ok(pve_upid) => Some(TaskListItem {
+
+                match task.upid.native_upid() {
+                    Ok(NativeUpid::PveUpid(pve_upid)) => Some(TaskListItem {
                         upid: task.upid.to_string(),
                         node: pve_upid.node,
                         pid: pve_upid.pid as i64,
@@ -67,6 +66,18 @@ pub async fn get_tasks(
                         endtime: task.endtime,
                         status: task.status,
                     }),
+                    Ok(NativeUpid::PbsUpid(pbs_upid)) => Some(TaskListItem {
+                        upid: task.upid.to_string(),
+                        node: pbs_upid.node,
+                        pid: pbs_upid.pid as i64,
+                        pstart: pbs_upid.pstart,
+                        starttime: pbs_upid.starttime,
+                        worker_type: pbs_upid.worker_type,
+                        worker_id: pbs_upid.worker_id,
+                        user: pbs_upid.auth_id,
+                        endtime: task.endtime,
+                        status: task.status,
+                    }),
                     Err(err) => {
                         log::error!("could not parse UPID: {err:#}");
                         None
diff --git a/server/src/remote_tasks/task_cache.rs b/server/src/remote_tasks/task_cache.rs
index cb3b6687..1eee46a6 100644
--- a/server/src/remote_tasks/task_cache.rs
+++ b/server/src/remote_tasks/task_cache.rs
@@ -15,8 +15,7 @@ use serde::{Deserialize, Serialize};
 
 use proxmox_sys::fs::CreateOptions;
 
-use pdm_api_types::RemoteUpid;
-use pve_api_types::PveUpid;
+use pdm_api_types::{NativeUpid, RemoteUpid};
 
 /// Filename for the file containing running tasks.
 const ACTIVE_FILENAME: &str = "active";
@@ -405,15 +404,21 @@ impl WritableTaskCache {
             // Remove this finished task from our set of active tasks.
             active_tasks.remove(&task.upid);
 
-            // TODO:: Handle PBS tasks correctly.
-            // TODO: This is awkward, maybe overhaul RemoteUpid type to make this easier
-            match task.upid.upid().parse::<PveUpid>() {
-                Ok(upid) => {
+            match task.upid.native_upid() {
+                Ok(NativeUpid::PveUpid(upid)) => {
                     let node = &upid.node;
                     let remote = task.upid.remote();
 
                     if node_success_map.node_successful(remote, node) {
-                        state.update_cutoff_timestamp(task.upid.remote(), node, task.starttime);
+                        state.update_cutoff_timestamp(remote, node, task.starttime);
+                    }
+                }
+                Ok(NativeUpid::PbsUpid(upid)) => {
+                    let node = &upid.node;
+                    let remote = task.upid.remote();
+
+                    if node_success_map.node_successful(remote, node) {
+                        state.update_cutoff_timestamp(remote, node, task.starttime);
                     }
                 }
                 Err(error) => {
-- 
2.47.3





More information about the pdm-devel mailing list