[pbs-devel] [PATCH proxmox-backup v3 5/7] api: datastore: wait for active operations to clear before s3 refresh
Christian Ebner
c.ebner at proxmox.com
Thu Nov 13 15:22:12 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 and keep the datastore
config locked so the maintenance mode cannot be altered.If an abort
was requested while waiting, clear the maintenance mode as well.
By adding this as helper, it can be reuse for datastore recreation as
well.
Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
changes since version 1:
- use dedicated helper which can be reused also for datastore recreation
src/api2/admin/datastore.rs | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index 7bd7c9f72..8fc5efe41 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -2674,7 +2674,6 @@ pub async fn unmount(store: String, rpcenv: &mut dyn RpcEnvironment) -> Result<V
)]
/// Refresh datastore contents from S3 to local cache store.
pub fn s3_refresh(store: String, rpcenv: &mut dyn RpcEnvironment) -> Result<Value, Error> {
- let datastore = DataStore::lookup_datastore(&store, Some(Operation::Lookup))?;
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI;
@@ -2696,17 +2695,21 @@ pub fn s3_refresh(store: String, rpcenv: &mut dyn RpcEnvironment) -> Result<Valu
Some(store.clone()),
auth_id.to_string(),
to_stdout,
- move |_worker| {
- proxmox_async::runtime::block_on(datastore.s3_refresh())?;
-
- let (_lock, config) = expect_maintenance_type(&store, MaintenanceType::S3Refresh)?;
- unset_maintenance(_lock, config).context("failed to clear maintenance mode")
- },
+ move |worker| do_s3_refresh(&store, &worker),
)?;
Ok(json!(upid))
}
+/// Performs an s3 refresh for given datastore. Expects the store to already be in maintenance mode
+/// s3-refresh.
+pub(crate) fn do_s3_refresh(store: &str, worker: &dyn WorkerTaskContext) -> Result<(), Error> {
+ let datastore = DataStore::lookup_datastore(&store, Some(Operation::Lookup))?;
+ run_maintenance_locked(&store, MaintenanceType::S3Refresh, worker, || {
+ proxmox_async::runtime::block_on(datastore.s3_refresh())
+ })
+}
+
/// Wait for no more active operations on the given datastore and run the provided callback in
/// a datastore locked context, protecting against maintenance mode changes.
fn run_maintenance_locked(
--
2.47.3
More information about the pbs-devel
mailing list