[pbs-devel] [PATCH proxmox-backup v2 6/6] api: datastore: wait for active operations to clear before s3 refresh
Christian Ebner
c.ebner at proxmox.com
Thu Nov 13 10:03:35 CET 2025
On 11/13/25 9:15 AM, Fabian Grünbichler wrote:
> On November 12, 2025 5:36 pm, Christian Ebner wrote:
>> 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.
>>
>> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
>> ---
>> changes since version 1:
>> - use refactored helpers from identical unmount logic
>>
>> src/api2/admin/datastore.rs | 28 +++++++++++++++++++++++-----
>> 1 file changed, 23 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
>> index 91189d7ae..93e085be3 100644
>> --- a/src/api2/admin/datastore.rs
>> +++ b/src/api2/admin/datastore.rs
>> @@ -2716,11 +2716,29 @@ 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| {
>> + let mut old_status = String::new();
>> + let aborted = wait_on_active_operations(
>> + &store,
>> + Some(&worker),
>> + MaintenanceType::S3Refresh,
>> + |reads, writes| {
>> + let status = format!(
>> + "waiting for active operations to finsish: read {reads}, write {writes}",
>> + );
>> + if status != old_status {
>> + info!("{status}");
>> + old_status = status;
>> + }
>> + },
>> + )?;
>> + clear_or_run_maintenance_locked(
>> + &store,
>> + Some(&worker),
>> + MaintenanceType::S3Refresh,
>> + aborted,
>> + || proxmox_async::runtime::block_on(datastore.s3_refresh()),
>> + )
>
> there is one more call to s3_refresh when (re)creating a datastore, that
> seems to me is running completely unprotected..
Oh, yes indeed, that needs to be adapted as well now.
More information about the pbs-devel
mailing list