]> git.proxmox.com Git - proxmox-backup.git/commitdiff
verify: acquire shared snapshot flock and skip on error
authorStefan Reiter <s.reiter@proxmox.com>
Wed, 14 Oct 2020 12:16:33 +0000 (14:16 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 15 Oct 2020 05:09:34 +0000 (07:09 +0200)
If we can't acquire a lock (either because the snapshot disappeared, it
is about to be forgotten/pruned, or it is currently still running) skip
the snapshot. Hold the lock during verification, so that it cannot be
deleted while we are still verifying.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
src/backup/verify.rs

index f2c38eae4ac7b2b0b5bfe5dcfa6d3a47313474f6..5e1391d904a001ff343140d337486c493800d203 100644 (file)
@@ -23,6 +23,7 @@ use crate::{
     task::TaskState,
     task_log,
     tools::ParallelHandler,
+    tools::fs::lock_dir_noblock_shared,
 };
 
 fn verify_blob(datastore: Arc<DataStore>, backup_dir: &BackupDir, info: &FileInfo) -> Result<(), Error> {
@@ -284,6 +285,21 @@ pub fn verify_backup_dir(
     upid: UPID,
 ) -> Result<bool, Error> {
 
+    let _guard_res = lock_dir_noblock_shared(
+        &datastore.snapshot_path(&backup_dir),
+        "snapshot",
+        "locked by another operation");
+    if let Err(err) = _guard_res {
+        task_log!(
+            worker,
+            "SKIPPED: verify {}:{} - could not acquire snapshot lock: {}",
+            datastore.name(),
+            backup_dir,
+            err,
+        );
+        return Ok(true);
+    }
+
     let mut manifest = match datastore.load_manifest(&backup_dir) {
         Ok((manifest, _)) => manifest,
         Err(err) => {