From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 4C7CF6B3F9 for ; Thu, 18 Feb 2021 15:41:03 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 41DEDF681 for ; Thu, 18 Feb 2021 15:40:33 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 4C141F62C for ; Thu, 18 Feb 2021 15:40:31 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id DECBF44FE3 for ; Thu, 18 Feb 2021 15:40:30 +0100 (CET) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Thu, 18 Feb 2021 15:40:22 +0100 Message-Id: <20210218144030.16778-3-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210218144030.16778-1-d.csapak@proxmox.com> References: <20210218144030.16778-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.216 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [PATCH proxmox-backup 03/11] api2/tape/drive: add run_drive_worker wrapper X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Feb 2021 14:41:03 -0000 a wrapper for locking, starting the worker and writing the state Signed-off-by: Dominik Csapak --- 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( + rpcenv: &dyn RpcEnvironment, + drive: String, + worker_type: &str, + job_id: Option, + f: F, +) -> Result +where + F: Send + + UnwindSafe + + 'static + + FnOnce(Arc, 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