From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 6D7B61FF17E for ; Thu, 13 Nov 2025 09:15:34 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 3AFE71465D; Thu, 13 Nov 2025 09:16:29 +0100 (CET) Date: Thu, 13 Nov 2025 09:15:52 +0100 From: Fabian =?iso-8859-1?q?Gr=FCnbichler?= To: Proxmox Backup Server development discussion References: <20251112163624.691139-1-c.ebner@proxmox.com> <20251112163624.691139-4-c.ebner@proxmox.com> In-Reply-To: <20251112163624.691139-4-c.ebner@proxmox.com> MIME-Version: 1.0 User-Agent: astroid/0.17.0 (https://github.com/astroidmail/astroid) Message-Id: <1763021421.pshnohnxvt.astroid@yuna.none> X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1763021729801 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.047 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: Re: [pbs-devel] [PATCH proxmox-backup v2 3/6] api: admin: factor out busy waiting on active operations 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" On November 12, 2025 5:36 pm, Christian Ebner wrote: > Move the logic to wait on no more active operations on a given > datastore into a dedicated helper function, to be reused > by s3-refresh. > > Signed-off-by: Christian Ebner > --- > changes since version 1: > - not present in previous version > > src/api2/admin/datastore.rs | 54 ++++++++++++++++++++++++++----------- > 1 file changed, 38 insertions(+), 16 deletions(-) > > diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs > index 6e66b5cf0..7daccf9fd 100644 > --- a/src/api2/admin/datastore.rs > +++ b/src/api2/admin/datastore.rs > @@ -2586,29 +2586,21 @@ fn do_unmount_device( > } > let mount_point = datastore.absolute_path(); > > - let mut active_operations = task_tracking::get_active_operations(&datastore.name)?; > let mut old_status = String::new(); > - let mut aborted = false; > - while active_operations.read + active_operations.write > 0 { > - if let Some(worker) = worker { > - if worker.abort_requested() > - || expect_maintenance_type(&datastore.name, MaintenanceType::Unmount).is_err() > - { > - aborted = true; > - break; > - } > + let aborted = wait_on_active_operations( > + &datastore.name, > + worker, > + MaintenanceType::Unmount, > + |reads, writes| { > let status = format!( > - "cannot unmount yet, still {} read and {} write operations active", > - active_operations.read, active_operations.write > + "cannot unmount yet, still {reads} read and {writes} write operations active", > ); > if status != old_status { > info!("{status}"); > old_status = status; > } > - } > - std::thread::sleep(std::time::Duration::from_secs(1)); > - active_operations = task_tracking::get_active_operations(&datastore.name)?; > - } > + }, > + )?; > > if aborted || worker.is_some_and(|w| w.abort_requested()) { > let _ = expect_maintenance_type(&datastore.name, MaintenanceType::Unmount) > @@ -2725,6 +2717,36 @@ pub async fn s3_refresh(store: String, rpcenv: &mut dyn RpcEnvironment) -> Resul > Ok(json!(upid)) > } > > +/// Wait for no more active operations on the given datastore. > +/// If a worker task context is provided, the given callback will be executed for each busy wait > +/// iteration. > +/// > +/// Returns with Ok(true) if the worker was aborted or the expected maintenance mode was not set, > +/// Ok(false) if no more operations are active. > +fn wait_on_active_operations( > + store: &str, > + worker: Option<&dyn WorkerTaskContext>, this can drop the Option, all callers actually run in a worker context.. > + maintenance_expected: MaintenanceType, > + mut status_msg_callback: impl FnMut(i64, i64), > +) -> Result { > + let mut active_operations = task_tracking::get_active_operations(&store)?; > + > + while active_operations.read + active_operations.write > 0 { > + if let Some(worker) = worker { > + if worker.abort_requested() > + || expect_maintenance_type(&store, maintenance_expected).is_err() > + { > + return Ok(true); > + } > + status_msg_callback(active_operations.read, active_operations.write); > + } > + std::thread::sleep(std::time::Duration::from_secs(1)); > + active_operations = task_tracking::get_active_operations(&store)?; > + } > + > + Ok(false) > +} > + > #[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 > > > _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel