From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 1784E1FF179 for ; Wed, 12 Nov 2025 17:36:01 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 895829C05; Wed, 12 Nov 2025 17:36:43 +0100 (CET) From: Christian Ebner To: pbs-devel@lists.proxmox.com Date: Wed, 12 Nov 2025 17:36:22 +0100 Message-ID: <20251112163624.691139-5-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251112163624.691139-1-c.ebner@proxmox.com> References: <20251112163624.691139-1-c.ebner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1762965374003 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.048 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment 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 v2 4/6] api: admin: factor out locking and maintenance mode clearing 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: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" Provide a helper which allows to either clear the maintenance mode if the worker was aborted, or call the provided callback while holding the datastore config lock. In preparation for reusing the same logic for the s3 refresh. Signed-off-by: Christian Ebner --- changes since version 1: - not present in previous version src/api2/admin/datastore.rs | 50 +++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 7daccf9fd..8d58b5059 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -2584,7 +2584,6 @@ fn do_unmount_device( if datastore.backing_device.is_none() { bail!("can't unmount non-removable datastore"); } - let mount_point = datastore.absolute_path(); let mut old_status = String::new(); let aborted = wait_on_active_operations( @@ -2602,21 +2601,14 @@ fn do_unmount_device( }, )?; - if aborted || worker.is_some_and(|w| w.abort_requested()) { - let _ = expect_maintenance_type(&datastore.name, MaintenanceType::Unmount) - .inspect_err(|e| warn!("maintenance mode was not as expected: {e}")) - .and_then(|(lock, config)| { - unset_maintenance(lock, config) - .inspect_err(|e| warn!("could not reset maintenance mode: {e}")) - }); - bail!("aborted, due to user request"); - } else { - let (lock, config) = expect_maintenance_type(&datastore.name, MaintenanceType::Unmount)?; - crate::tools::disks::unmount_by_mountpoint(Path::new(&mount_point))?; - unset_maintenance(lock, config) - .map_err(|e| format_err!("could not reset maintenance mode: {e}"))?; - } - Ok(()) + let mount_point = datastore.absolute_path(); + clear_or_run_maintenance_locked( + &datastore.name, + worker, + MaintenanceType::Unmount, + aborted, + || crate::tools::disks::unmount_by_mountpoint(Path::new(&mount_point)), + ) } #[api( @@ -2747,6 +2739,32 @@ fn wait_on_active_operations( Ok(false) } +// Either clear the current maintenance mode if the worker was aborted or run the provided callback +// while keeping the datastore config lock, so the mode cannot be altered. Clears the maintenance +// mode after successful callback execution. +fn clear_or_run_maintenance_locked( + store: &str, + worker: Option<&dyn WorkerTaskContext>, + maintenance_expected: MaintenanceType, + aborted: bool, + callback: impl Fn() -> Result<(), Error>, +) -> Result<(), Error> { + if aborted || worker.is_some_and(|w| w.abort_requested()) { + let _ = expect_maintenance_type(store, maintenance_expected) + .inspect_err(|e| warn!("maintenance mode was not as expected: {e}")) + .and_then(|(lock, config)| { + unset_maintenance(lock, config) + .inspect_err(|e| warn!("could not reset maintenance mode: {e}")) + }); + bail!("aborted, due to user request"); + } else { + let (lock, config) = expect_maintenance_type(store, maintenance_expected)?; + callback()?; + unset_maintenance(lock, config) + .map_err(|e| format_err!("could not reset maintenance mode: {e}")) + } +} + #[sortable] const DATASTORE_INFO_SUBDIRS: SubdirMap = &[ ( -- 2.47.3 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel