[pbs-devel] [PATCH proxmox-backup 2/3] src/backup/backup_info.rs: remove BackupGroup lock()
Dietmar Maurer
dietmar at proxmox.com
Fri Aug 7 10:18:22 CEST 2020
And use new lock_dir_noblock() instead.
---
src/backup/backup_info.rs | 35 +----------------------------------
src/backup/datastore.rs | 17 ++++++-----------
2 files changed, 7 insertions(+), 45 deletions(-)
diff --git a/src/backup/backup_info.rs b/src/backup/backup_info.rs
index c35928c..df2349b 100644
--- a/src/backup/backup_info.rs
+++ b/src/backup/backup_info.rs
@@ -14,6 +14,7 @@ use lazy_static::lazy_static;
use proxmox::sys::error::SysError;
use super::manifest::MANIFEST_BLOB_NAME;
+use crate::tools::fs::lock_dir_noblock;
macro_rules! BACKUP_ID_RE { () => (r"[A-Za-z0-9][A-Za-z0-9_-]+") }
macro_rules! BACKUP_TYPE_RE { () => (r"(?:host|vm|ct)") }
@@ -141,40 +142,6 @@ impl BackupGroup {
Ok(last)
}
- pub fn lock(&self, base_path: &Path) -> Result<BackupLockGuard, Error> {
- use nix::fcntl::OFlag;
- use nix::sys::stat::Mode;
-
- let mut path = base_path.to_owned();
- path.push(self.group_path());
-
- let mut handle = Dir::open(&path, OFlag::O_RDONLY, Mode::empty())
- .map_err(|err| {
- format_err!(
- "unable to open backup group directory {:?} for locking - {}",
- self.group_path(),
- err,
- )
- })?;
-
- // 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(Duration::from_nanos(0)))
- .map_err(|err| {
- format_err!(
- "unable to acquire lock on backup group {:?} - {}",
- self.group_path(),
- if err.would_block() {
- String::from("another backup is already running")
- } else {
- err.to_string()
- }
- )
- })?;
-
- Ok(handle)
- }
-
pub fn list_groups(base_path: &Path) -> Result<Vec<BackupGroup>, Error> {
let mut list = Vec::new();
diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs
index 395515f..dbd42d6 100644
--- a/src/backup/datastore.rs
+++ b/src/backup/datastore.rs
@@ -11,7 +11,7 @@ use serde_json::Value;
use proxmox::tools::fs::{replace_file, CreateOptions};
-use super::backup_info::{BackupGroup, BackupLockGuard, BackupDir, BackupInfo};
+use super::backup_info::{BackupGroup, BackupDir, BackupInfo};
use super::chunk_store::ChunkStore;
use super::dynamic_index::{DynamicIndexReader, DynamicIndexWriter};
use super::fixed_index::{FixedIndexReader, FixedIndexWriter};
@@ -21,6 +21,7 @@ use super::{DataBlob, ArchiveType, archive_type};
use crate::config::datastore;
use crate::server::WorkerTask;
use crate::tools;
+use crate::tools::fs::{lock_dir_noblock, DirLockGuard};
use crate::api2::types::GarbageCollectionStatus;
lazy_static! {
@@ -199,13 +200,7 @@ impl DataStore {
let full_path = self.group_path(backup_group);
- let _guard = backup_group.lock(&self.base_path()).map_err(|err| {
- format_err!(
- "cannot acquire lock on backup group {}: {}",
- backup_group,
- err
- )
- })?;
+ let _guard = tools::fs::lock_dir_noblock(&full_path, "backup group", "possible running backup")?;
log::info!("removing backup group {:?}", full_path);
std::fs::remove_dir_all(&full_path)
@@ -300,7 +295,7 @@ impl DataStore {
/// current owner (instead of setting the owner).
///
/// This also aquires an exclusive lock on the directory and returns the lock guard.
- pub fn create_locked_backup_group(&self, backup_group: &BackupGroup, userid: &str) -> Result<(String, BackupLockGuard), Error> {
+ pub fn create_locked_backup_group(&self, backup_group: &BackupGroup, userid: &str) -> Result<(String, DirLockGuard), Error> {
// create intermediate path first:
let base_path = self.base_path();
@@ -314,13 +309,13 @@ impl DataStore {
// create the last component now
match std::fs::create_dir(&full_path) {
Ok(_) => {
- let guard = backup_group.lock(&base_path)?;
+ let guard = lock_dir_noblock(&full_path, "backup group", "another backup is already running")?;
self.set_owner(backup_group, userid, false)?;
let owner = self.get_owner(backup_group)?; // just to be sure
Ok((owner, guard))
}
Err(ref err) if err.kind() == io::ErrorKind::AlreadyExists => {
- let guard = backup_group.lock(&base_path)?;
+ let guard = lock_dir_noblock(&full_path, "backup group", "another backup is already running")?;
let owner = self.get_owner(backup_group)?; // just to be sure
Ok((owner, guard))
}
--
2.20.1
More information about the pbs-devel
mailing list