[pbs-devel] [RFC proxmox-backup 25/39] datastore: prune groups/snapshots from S3 object store backend

Christian Ebner c.ebner at proxmox.com
Mon May 19 13:46:26 CEST 2025


When pruning a backup group or a backup snapshot for a datastore with
S3 object store backend, remove the associated objects by removing
them based on the prefix.

Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
 pbs-datastore/src/datastore.rs | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs
index 42d27d249..4fc6fe9a5 100644
--- a/pbs-datastore/src/datastore.rs
+++ b/pbs-datastore/src/datastore.rs
@@ -29,6 +29,7 @@ use pbs_api_types::{
     S3ClientSecretsConfig, UPID,
 };
 use pbs_config::BackupLockGuard;
+use pbs_s3_client::S3_CONTENT_PREFIX;
 
 use crate::backup_info::{BackupDir, BackupGroup, BackupInfo, OLD_LOCKING};
 use crate::chunk_store::ChunkStore;
@@ -716,6 +717,20 @@ impl DataStore {
     ) -> Result<BackupGroupDeleteStats, Error> {
         let backup_group = self.backup_group(ns.clone(), backup_group.clone());
 
+        // TODO: Handle protected snapshots and consistency
+        if let DatastoreBackend::S3(s3_client) = self.backend()? {
+            let path = backup_group.relative_group_path();
+            let group_prefix = path
+                .to_str()
+                .ok_or_else(|| format_err!("invalid group path prefix"))?;
+            let prefix = format!("{S3_CONTENT_PREFIX}/{group_prefix}");
+            let delete_object_result =
+                proxmox_async::runtime::block_on(s3_client.delete_objects_by_prefix(&prefix))?;
+            if delete_object_result.error.is_some() {
+                bail!("deleting objects failed");
+            }
+        }
+
         backup_group.destroy()
     }
 
@@ -728,6 +743,19 @@ impl DataStore {
     ) -> Result<(), Error> {
         let backup_dir = self.backup_dir(ns.clone(), backup_dir.clone())?;
 
+        if let DatastoreBackend::S3(s3_client) = self.backend()? {
+            let path = backup_dir.relative_path();
+            let snapshot_prefix = path
+                .to_str()
+                .ok_or_else(|| format_err!("invalid snapshot path prefix"))?;
+            let prefix = format!("{S3_CONTENT_PREFIX}/{snapshot_prefix}");
+            let delete_object_result =
+                proxmox_async::runtime::block_on(s3_client.delete_objects_by_prefix(&prefix))?;
+            if delete_object_result.error.is_some() {
+                bail!("deleting objects failed");
+            }
+        }
+
         backup_dir.destroy(force)
     }
 
-- 
2.39.5





More information about the pbs-devel mailing list