[pbs-devel] [PATCH proxmox-backup 03/11] api2/tape/drive: add run_drive_worker wrapper
Dominik Csapak
d.csapak at proxmox.com
Thu Feb 18 15:40:22 CET 2021
a wrapper for locking, starting the worker and writing the state
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
src/api2/tape/drive.rs | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs
index 8de8d39d..f4977612 100644
--- a/src/api2/tape/drive.rs
+++ b/src/api2/tape/drive.rs
@@ -1,7 +1,8 @@
+use std::panic::UnwindSafe;
use std::path::Path;
use std::sync::Arc;
-use anyhow::{bail, Error};
+use anyhow::{bail, format_err, Error};
use serde_json::Value;
use proxmox::{
@@ -62,11 +63,44 @@ use crate::{
required_media_changer,
open_drive,
lock_tape_device,
+ set_tape_device_state,
},
changer::update_changer_online_status,
},
};
+fn run_drive_worker<F>(
+ rpcenv: &dyn RpcEnvironment,
+ drive: String,
+ worker_type: &str,
+ job_id: Option<String>,
+ f: F,
+) -> Result<String, Error>
+where
+ F: Send
+ + UnwindSafe
+ + 'static
+ + FnOnce(Arc<WorkerTask>, SectionConfigData) -> Result<(), Error>,
+{
+ // early check/lock before starting worker
+ let (config, _digest) = config::drive::config()?;
+ let lock_guard = lock_tape_device(&config, &drive)?;
+
+ let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
+ let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI;
+
+ WorkerTask::new_thread(worker_type, job_id, auth_id, to_stdout, move |worker| {
+ let _lock_guard = lock_guard;
+ set_tape_device_state(&drive, &worker.upid().to_string())
+ .map_err(|err| format_err!("could not set tape device state: {}", err))?;
+
+ let result = f(worker, config);
+ set_tape_device_state(&drive, "")
+ .map_err(|err| format_err!("could not unset tape device state: {}", err))?;
+ result
+ })
+}
+
#[api(
input: {
properties: {
--
2.20.1
More information about the pbs-devel
mailing list