[pbs-devel] [PATCH proxmox-backup 2/2] api: datastore: wait for active operations to clear before s3 refresh
Christian Ebner
c.ebner at proxmox.com
Tue Nov 4 14:19:34 CET 2025
Currently, the s3 refresh does not take into consideration already
ongoing active operations, only blocking new ones.
This will however lead to inconsistencies if there are ongoing read
or write operations. Therefore, actively wait for ongoing operatioins
to complete before running the actual refresh.
If an abort was requested while waiting, clear the maintenance mode as
well.
Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
src/api2/admin/datastore.rs | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index 00110119f..a43aad610 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -2756,7 +2756,26 @@ pub fn s3_refresh(store: String, rpcenv: &mut dyn RpcEnvironment) -> Result<Valu
Some(store.clone()),
auth_id.to_string(),
to_stdout,
- move |_worker| {
+ move |worker| {
+ let mut active_operations = task_tracking::get_active_operations(&store)?;
+ let mut old_status = String::new();
+ while active_operations.read + active_operations.write > 0 {
+ if worker.abort_requested() {
+ maintenance_mode(&store, None).context("failed to clear maintenance mode")?;
+ bail!("aborted by user");
+ }
+ let status = format!(
+ "cannot refresh contents, {} active read and {} active write operations",
+ active_operations.read, active_operations.write
+ );
+ 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(&store)?;
+ }
+
proxmox_async::runtime::block_on(datastore.s3_refresh())?;
maintenance_mode(&store, None).context("failed to clear maintenance mode")
--
2.47.3
More information about the pbs-devel
mailing list