From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 901A91FF13C for ; Thu, 30 Apr 2026 17:06:40 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6FE5DE1AC; Thu, 30 Apr 2026 17:06:40 +0200 (CEST) From: Robert Obkircher To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox-backup 02/10] datastore: open datastores with Reclaim instead of Write operation Date: Thu, 30 Apr 2026 17:05:43 +0200 Message-ID: <20260430150607.330413-6-r.obkircher@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260430150607.330413-1-r.obkircher@proxmox.com> References: <20260430150607.330413-1-r.obkircher@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1777561495004 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.061 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 Message-ID-Hash: 23PRS3YCPYJ2VQSF2Q4GZUMOJITBD4DZ X-Message-ID-Hash: 23PRS3YCPYJ2VQSF2Q4GZUMOJITBD4DZ X-MailFrom: r.obkircher@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Backup Server development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: These operations do not significantly increase storage requirements, so they should be allowed even when the file system is almost full. For now, this only includes the most important ones for reclaiming space but others, such as set_backup_owner and group/namespace moves, could be reasonably supported as well. Signed-off-by: Robert Obkircher --- src/api2/admin/datastore.rs | 12 ++++++------ src/api2/admin/namespace.rs | 2 +- src/bin/proxmox-backup-proxy.rs | 2 +- src/server/prune_job.rs | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index a814c076c..60069c472 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -253,7 +253,7 @@ pub async fn delete_group( &auth_id, PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_PRUNE, - Operation::Write, + Operation::Reclaim, &group, )?; @@ -463,7 +463,7 @@ pub async fn delete_snapshot( &auth_id, PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_PRUNE, - Operation::Write, + Operation::Reclaim, &backup_dir.group, )?; @@ -1002,7 +1002,7 @@ pub fn prune( &auth_id, PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_PRUNE, - Operation::Write, + Operation::Reclaim, &group, )?; @@ -1174,7 +1174,7 @@ pub fn prune_datastore( true, )?; - let datastore = DataStore::lookup_datastore(lookup_with(&store, Operation::Write))?; + let datastore = DataStore::lookup_datastore(lookup_with(&store, Operation::Reclaim))?; let ns = prune_options.ns.clone().unwrap_or_default(); let worker_id = format!("{store}:{ns}"); @@ -1212,7 +1212,7 @@ pub fn start_garbage_collection( _info: &ApiMethod, rpcenv: &mut dyn RpcEnvironment, ) -> Result { - let datastore = DataStore::lookup_datastore(lookup_with(&store, Operation::Write))?; + let datastore = DataStore::lookup_datastore(lookup_with(&store, Operation::Reclaim))?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let job = Job::new("garbage_collection", &store) @@ -2306,7 +2306,7 @@ pub async fn set_protection( &auth_id, PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_BACKUP, - Operation::Write, + Operation::Reclaim, &backup_dir.group, )?; diff --git a/src/api2/admin/namespace.rs b/src/api2/admin/namespace.rs index 56f420025..b29bcb68a 100644 --- a/src/api2/admin/namespace.rs +++ b/src/api2/admin/namespace.rs @@ -168,7 +168,7 @@ pub fn delete_namespace( check_ns_modification_privs(&store, &ns, &auth_id)?; - let lookup = crate::tools::lookup_with(&store, Operation::Write); + let lookup = crate::tools::lookup_with(&store, Operation::Reclaim); let datastore = DataStore::lookup_datastore(lookup)?; let (removed_all, stats) = datastore.remove_namespace_recursive(&ns, delete_groups)?; diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index b18550420..2d9f55d37 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -592,7 +592,7 @@ async fn schedule_datastore_garbage_collection() { Err(_) => continue, // could not get lock }; - let lookup = lookup_with(&store, Operation::Write); + let lookup = lookup_with(&store, Operation::Reclaim); let datastore = match DataStore::lookup_datastore(lookup) { Ok(datastore) => datastore, Err(err) => { diff --git a/src/server/prune_job.rs b/src/server/prune_job.rs index ca5c67541..95ebb4965 100644 --- a/src/server/prune_job.rs +++ b/src/server/prune_job.rs @@ -133,7 +133,7 @@ pub fn do_prune_job( auth_id: &Authid, schedule: Option, ) -> Result { - let lookup = crate::tools::lookup_with(&store, Operation::Write); + let lookup = crate::tools::lookup_with(&store, Operation::Reclaim); let datastore = DataStore::lookup_datastore(lookup)?; let worker_type = job.jobtype().to_string(); -- 2.47.3