[pbs-devel] [PATCH proxmox-backup 2/2] api: datastore: wait for active operations to clear before s3 refresh

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Nov 11 11:13:14 CET 2025


this one looks mostly okay, but as we actually want the exact same
semantics as with unmounting, we could refactor the whole helper there
to do all of the logic?

e.g., have a `wait_until_operations_done_and_ensure_maintenance_mode`
helper that calls a callback (that does the actual unmounting/refreshing)

On November 4, 2025 2:19 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.
> 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
> 
> 
> 
> _______________________________________________
> pbs-devel mailing list
> pbs-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
> 
> 
> 




More information about the pbs-devel mailing list