[pbs-devel] [PATCH v3 proxmox-backup 11/20] datastore: clear trashed snapshot dir if re-creation requested
Christian Ebner
c.ebner at proxmox.com
Tue May 13 15:52:38 CEST 2025
If a previously trashed snapshot has been requested for re-creation
(e.g. by a sync job in push direction), drop the contents of the
currently trashed snapshot.
The snapshot directory itself is already locked at that point, either
by the old locking mechanism acting on the directory itself or by the
new locking mechanism. Therefore, concurrent operations can be
excluded.
For the call site this acts as if the snapshot directory has been
newly created.
Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
pbs-datastore/src/datastore.rs | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs
index dc4059789..6f99ff572 100644
--- a/pbs-datastore/src/datastore.rs
+++ b/pbs-datastore/src/datastore.rs
@@ -826,8 +826,9 @@ impl DataStore {
) -> Result<(PathBuf, bool, BackupLockGuard), Error> {
let backup_dir = self.backup_dir(ns.clone(), backup_dir.clone())?;
let relative_path = backup_dir.relative_path();
+ let full_path = backup_dir.full_path();
- match std::fs::create_dir(backup_dir.full_path()) {
+ match std::fs::create_dir(&full_path) {
Ok(_) => {
let guard = backup_dir.lock().with_context(|| {
format!("while creating new locked snapshot '{backup_dir:?}'")
@@ -838,6 +839,28 @@ impl DataStore {
let guard = backup_dir
.lock()
.with_context(|| format!("while creating locked snapshot '{backup_dir:?}'"))?;
+
+ if backup_dir.is_trash() {
+ info!("clear trashed backup snapshot {full_path:?}");
+ let dir_entries = std::fs::read_dir(&full_path).context(
+ "failed to read directory contents during cleanup of trashed snapshot",
+ )?;
+ for entry in dir_entries {
+ let entry = entry.context(
+ "failed to read directory entry during clenup of trashed snapshot",
+ )?;
+ // Only expect regular file entries
+ std::fs::remove_file(entry.path()).context(
+ "failed to remove directory entry during clenup of trashed snapshot",
+ )?;
+ }
+
+ // Group already untrashed by `create_locked_backup_group`, no further action
+ // required.
+
+ return Ok((relative_path, true, guard));
+ }
+
Ok((relative_path, false, guard))
}
Err(e) => Err(e.into()),
--
2.39.5
More information about the pbs-devel
mailing list