diff --git a/pbs-tools/src/task.rs b/pbs-tools/src/task.rs index e8648a49..1d096575 100644 --- a/pbs-tools/src/task.rs +++ b/pbs-tools/src/task.rs @@ -1,9 +1,20 @@ -use anyhow::Error; +use anyhow::{bail, Error}; -/// `WorkerTask` methods commonly used from contexts otherwise not related to the API server. +/// Worker task abstraction +/// +/// A worker task is a long running task, which usually logs output into a separate file. pub trait WorkerTaskContext { + + /// Test if there was a request to abort the task. + fn abort_requested(&self) -> bool; + /// If the task should be aborted, this should fail with a reasonable error message. - fn check_abort(&self) -> Result<(), Error>; + fn check_abort(&self) -> Result<(), Error> { + if self.abort_requested() { + bail!("abort requested - aborting task"); + } + Ok(()) + } /// Create a log message for this task. fn log(&self, level: log::Level, message: &std::fmt::Arguments); @@ -11,6 +22,10 @@ pub trait WorkerTaskContext { /// Convenience implementation: impl WorkerTaskContext for std::sync::Arc { + fn abort_requested(&self) -> bool { + ::abort_requested(&*self) + } + fn check_abort(&self) -> Result<(), Error> { ::check_abort(&*self) } diff --git a/proxmox-rest-server/src/worker_task.rs b/proxmox-rest-server/src/worker_task.rs index bea43573..7a2bb11c 100644 --- a/proxmox-rest-server/src/worker_task.rs +++ b/proxmox-rest-server/src/worker_task.rs @@ -829,19 +829,6 @@ impl WorkerTask { } } - /// Test if abort was requested. - pub fn abort_requested(&self) -> bool { - self.abort_requested.load(Ordering::SeqCst) - } - - /// Fail if abort was requested. - pub fn check_abort(&self) -> Result<(), Error> { - if self.abort_requested() { - bail!("abort requested - aborting task"); - } - Ok(()) - } - /// Get a future which resolves on task abort pub fn abort_future(&self) -> oneshot::Receiver<()> { let (tx, rx) = oneshot::channel::<()>(); @@ -861,8 +848,9 @@ impl WorkerTask { } impl WorkerTaskContext for WorkerTask { - fn check_abort(&self) -> Result<(), Error> { - self.check_abort() + + fn abort_requested(&self) -> bool { + self.abort_requested.load(Ordering::SeqCst) } fn log(&self, level: log::Level, message: &std::fmt::Arguments) { diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index 9529eca3..c5588ddc 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -22,7 +22,7 @@ use pbs_api_types::{ use pbs_datastore::StoreProgress; use pbs_datastore::backup_info::{BackupDir, BackupInfo}; -use pbs_tools::{task_log, task_warn}; +use pbs_tools::{task_log, task_warn, task::WorkerTaskContext}; use pbs_config::CachedUserInfo; use proxmox_rest_server::WorkerTask; diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 8feed754..a62bb279 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -45,7 +45,7 @@ use pbs_tape::{ TapeRead, BlockReadError, MediaContentHeader, PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0, }; -use pbs_tools::{task_log, task_warn}; +use pbs_tools::{task_log, task_warn, task::WorkerTaskContext}; use proxmox_rest_server::WorkerTask; use crate::{ diff --git a/src/tape/drive/mod.rs b/src/tape/drive/mod.rs index 660255d2..1780fe2d 100644 --- a/src/tape/drive/mod.rs +++ b/src/tape/drive/mod.rs @@ -30,13 +30,12 @@ use proxmox::{ use pbs_api_types::{VirtualTapeDrive, LtoTapeDrive, Fingerprint}; use pbs_config::key_config::KeyConfig; -use pbs_tools::task_log; +use pbs_tools::{task_log, task::WorkerTaskContext}; use pbs_tape::{ TapeWrite, TapeRead, BlockReadError, MediaContentHeader, sg_tape::TapeAlertFlags, }; -use proxmox_rest_server::WorkerTask; use crate::{ server::send_load_media_email, @@ -355,7 +354,7 @@ impl std::fmt::Display for TapeRequestError { /// /// Returns a handle to the opened drive and the media labels. pub fn request_and_load_media( - worker: &WorkerTask, + worker: &dyn WorkerTaskContext, config: &SectionConfigData, drive: &str, label: &MediaLabel,