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 <s.reiter@proxmox.com>
This commit is contained in:
parent
f153930066
commit
7d6c4c39e9
@ -16,7 +16,7 @@ use crate::backup::*;
|
|||||||
use crate::api2::types::*;
|
use crate::api2::types::*;
|
||||||
use crate::config::acl::PRIV_DATASTORE_BACKUP;
|
use crate::config::acl::PRIV_DATASTORE_BACKUP;
|
||||||
use crate::config::cached_user_info::CachedUserInfo;
|
use crate::config::cached_user_info::CachedUserInfo;
|
||||||
use crate::tools::fs::lock_dir_noblock;
|
use crate::tools::fs::lock_dir_noblock_shared;
|
||||||
|
|
||||||
mod environment;
|
mod environment;
|
||||||
use environment::*;
|
use environment::*;
|
||||||
@ -144,7 +144,7 @@ async move {
|
|||||||
|
|
||||||
// lock last snapshot to prevent forgetting/pruning it during backup
|
// lock last snapshot to prevent forgetting/pruning it during backup
|
||||||
let full_path = datastore.snapshot_path(&last.backup_dir);
|
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 {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
@ -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<DirLockGuard, Error> {
|
||||||
|
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(
|
pub fn lock_dir_noblock(
|
||||||
path: &std::path::Path,
|
path: &std::path::Path,
|
||||||
what: &str,
|
what: &str,
|
||||||
would_block_msg: &str,
|
would_block_msg: &str,
|
||||||
|
) -> Result<DirLockGuard, Error> {
|
||||||
|
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<DirLockGuard, Error> {
|
) -> Result<DirLockGuard, Error> {
|
||||||
let mut handle = Dir::open(path, OFlag::O_RDONLY, Mode::empty())
|
let mut handle = Dir::open(path, OFlag::O_RDONLY, Mode::empty())
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
@ -278,7 +298,7 @@ pub fn lock_dir_noblock(
|
|||||||
|
|
||||||
// acquire in non-blocking mode, no point in waiting here since other
|
// acquire in non-blocking mode, no point in waiting here since other
|
||||||
// backups could still take a very long time
|
// 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| {
|
.map_err(|err| {
|
||||||
format_err!(
|
format_err!(
|
||||||
"unable to acquire lock on {} directory {:?} - {}", what, path,
|
"unable to acquire lock on {} directory {:?} - {}", what, path,
|
||||||
|
Loading…
Reference in New Issue
Block a user