]> git.proxmox.com Git - proxmox-backup.git/commitdiff
api2/tape/drive: add wrapper for tokio::task::spawn_blocking
authorDominik Csapak <d.csapak@proxmox.com>
Thu, 18 Feb 2021 14:40:24 +0000 (15:40 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Feb 2021 09:13:21 +0000 (10:13 +0100)
similar to the worker wrapper, lock, write status, run code, unset status

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
src/api2/tape/drive.rs

index 7a6461b0fb9453751e06d500b71ed21f5977fb59..b4cd4aa6593be89cc30689fa3c23d0526b37c942 100644 (file)
@@ -101,6 +101,26 @@ where
     })
 }
 
+async fn run_drive_blocking_task<F, R>(drive: String, state: String, f: F) -> Result<R, Error>
+where
+    F: Send + 'static + FnOnce(SectionConfigData) -> Result<R, Error>,
+    R: Send + 'static,
+{
+    // early check/lock before starting worker
+    let (config, _digest) = config::drive::config()?;
+    let lock_guard = lock_tape_device(&config, &drive)?;
+    tokio::task::spawn_blocking(move || {
+        let _lock_guard = lock_guard;
+        set_tape_device_state(&drive, &state)
+            .map_err(|err| format_err!("could not set tape device state: {}", err))?;
+        let result = f(config);
+        set_tape_device_state(&drive, "")
+            .map_err(|err| format_err!("could not unset tape device state: {}", err))?;
+        result
+    })
+    .await?
+}
+
 #[api(
     input: {
         properties: {