From 7d6c4c39e95773eaa642b3ca641947ac5771f130 Mon Sep 17 00:00:00 2001 From: Stefan Reiter Date: Wed, 14 Oct 2020 14:16:31 +0200 Subject: [PATCH] backup: use shared flock for base snapshot To allow other reading operations on the base snapshot as well. No semantic changes with this patch alone, as all other locks on snapshots are exclusive. Signed-off-by: Stefan Reiter --- src/api2/backup.rs | 4 ++-- src/tools/fs.rs | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/api2/backup.rs b/src/api2/backup.rs index 8a2a2409..8b2b0e1a 100644 --- a/src/api2/backup.rs +++ b/src/api2/backup.rs @@ -16,7 +16,7 @@ use crate::backup::*; use crate::api2::types::*; use crate::config::acl::PRIV_DATASTORE_BACKUP; use crate::config::cached_user_info::CachedUserInfo; -use crate::tools::fs::lock_dir_noblock; +use crate::tools::fs::lock_dir_noblock_shared; mod environment; use environment::*; @@ -144,7 +144,7 @@ async move { // lock last snapshot to prevent forgetting/pruning it during backup let full_path = datastore.snapshot_path(&last.backup_dir); - Some(lock_dir_noblock(&full_path, "snapshot", "base snapshot is already locked by another operation")?) + Some(lock_dir_noblock_shared(&full_path, "snapshot", "base snapshot is already locked by another operation")?) } else { None }; diff --git a/src/tools/fs.rs b/src/tools/fs.rs index 5aaaecda..72a530d8 100644 --- a/src/tools/fs.rs +++ b/src/tools/fs.rs @@ -265,11 +265,31 @@ impl Default for FSXAttr { } } +/// Attempt to acquire a shared flock on the given path, 'what' and +/// 'would_block_message' are used for error formatting. +pub fn lock_dir_noblock_shared( + path: &std::path::Path, + what: &str, + would_block_msg: &str, +) -> Result { + do_lock_dir_noblock(path, what, would_block_msg, false) +} +/// Attempt to acquire an exclusive flock on the given path, 'what' and +/// 'would_block_message' are used for error formatting. pub fn lock_dir_noblock( path: &std::path::Path, what: &str, would_block_msg: &str, +) -> Result { + do_lock_dir_noblock(path, what, would_block_msg, true) +} + +fn do_lock_dir_noblock( + path: &std::path::Path, + what: &str, + would_block_msg: &str, + exclusive: bool, ) -> Result { let mut handle = Dir::open(path, OFlag::O_RDONLY, Mode::empty()) .map_err(|err| { @@ -278,7 +298,7 @@ pub fn lock_dir_noblock( // acquire in non-blocking mode, no point in waiting here since other // backups could still take a very long time - proxmox::tools::fs::lock_file(&mut handle, true, Some(std::time::Duration::from_nanos(0))) + proxmox::tools::fs::lock_file(&mut handle, exclusive, Some(std::time::Duration::from_nanos(0))) .map_err(|err| { format_err!( "unable to acquire lock on {} directory {:?} - {}", what, path,