memcom: rustfmt + (trailing) whitespace cleanups
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
9a06eb1618
commit
835d0e5dd3
|
@ -29,23 +29,22 @@ struct Head {
|
||||||
user_cache_generation: AtomicUsize,
|
user_cache_generation: AtomicUsize,
|
||||||
}
|
}
|
||||||
|
|
||||||
static INSTANCE: OnceCell<Arc<Memcom>> = OnceCell::new();
|
static INSTANCE: OnceCell<Arc<Memcom>> = OnceCell::new();
|
||||||
|
|
||||||
const MEMCOM_FILE_PATH: &str = rundir!("/proxmox-backup-memcom");
|
const MEMCOM_FILE_PATH: &str = rundir!("/proxmox-backup-memcom");
|
||||||
|
|
||||||
impl Memcom {
|
impl Memcom {
|
||||||
|
|
||||||
/// Open the memory based communication channel singleton.
|
/// Open the memory based communication channel singleton.
|
||||||
pub fn new() -> Result<Arc<Self>, Error> {
|
pub fn new() -> Result<Arc<Self>, Error> {
|
||||||
INSTANCE.get_or_try_init(Self::open).map(Arc::clone)
|
INSTANCE.get_or_try_init(Self::open).map(Arc::clone)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Actual work of `new`:
|
// Actual work of `new`:
|
||||||
fn open() -> Result<Arc<Self>, Error> {
|
fn open() -> Result<Arc<Self>, Error> {
|
||||||
let fd = match open_existing() {
|
let fd = match open_existing() {
|
||||||
Ok(fd) => fd,
|
Ok(fd) => fd,
|
||||||
Err(err) if err.not_found() => create_new()?,
|
Err(err) if err.not_found() => create_new()?,
|
||||||
Err(err) => bail!("failed to open {} - {}", MEMCOM_FILE_PATH, err),
|
Err(err) => bail!("failed to open {} - {}", MEMCOM_FILE_PATH, err),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mmap = unsafe {
|
let mmap = unsafe {
|
||||||
|
@ -57,17 +56,17 @@ impl Memcom {
|
||||||
MapFlags::MAP_SHARED | MapFlags::MAP_NORESERVE | MapFlags::MAP_POPULATE,
|
MapFlags::MAP_SHARED | MapFlags::MAP_NORESERVE | MapFlags::MAP_POPULATE,
|
||||||
)?
|
)?
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Arc::new(Self { mmap }))
|
Ok(Arc::new(Self { mmap }))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shortcut to get the mapped `Head` as a `Head`.
|
// Shortcut to get the mapped `Head` as a `Head`.
|
||||||
fn head(&self) -> &Head {
|
fn head(&self) -> &Head {
|
||||||
unsafe { &*(self.mmap.as_ptr() as *const u8 as *const Head) }
|
unsafe { &*(self.mmap.as_ptr() as *const u8 as *const Head) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the user cache generation number.
|
/// Returns the user cache generation number.
|
||||||
pub fn user_cache_generation(&self) -> usize {
|
pub fn user_cache_generation(&self) -> usize {
|
||||||
self.head().user_cache_generation.load(Ordering::Acquire)
|
self.head().user_cache_generation.load(Ordering::Acquire)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,21 +79,26 @@ impl Memcom {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The fast path opens an existing file.
|
/// The fast path opens an existing file.
|
||||||
fn open_existing() -> Result<Fd, nix::Error> {
|
fn open_existing() -> Result<Fd, nix::Error> {
|
||||||
Fd::open(MEMCOM_FILE_PATH, OFlag::O_RDWR | OFlag::O_CLOEXEC, Mode::empty())
|
Fd::open(
|
||||||
|
MEMCOM_FILE_PATH,
|
||||||
|
OFlag::O_RDWR | OFlag::O_CLOEXEC,
|
||||||
|
Mode::empty(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Since we need to initialize the file, we also need a solid slow path where we create the file.
|
/// Since we need to initialize the file, we also need a solid slow path where we create the file.
|
||||||
/// In order to make sure the next user's `open()` vs `mmap()` race against our `truncate()` call,
|
/// In order to make sure the next user's `open()` vs `mmap()` race against our `truncate()` call,
|
||||||
/// we create it in a temporary location and rotate it in place.
|
/// we create it in a temporary location and rotate it in place.
|
||||||
fn create_new() -> Result<Fd, Error> {
|
fn create_new() -> Result<Fd, Error> {
|
||||||
// create a temporary file:
|
// create a temporary file:
|
||||||
let temp_file_name = format!("{}.{}", MEMCOM_FILE_PATH, unsafe { libc::getpid() });
|
let temp_file_name = format!("{}.{}", MEMCOM_FILE_PATH, unsafe { libc::getpid() });
|
||||||
let fd = Fd::open(
|
let fd = Fd::open(
|
||||||
temp_file_name.as_str(),
|
temp_file_name.as_str(),
|
||||||
OFlag::O_CREAT | OFlag::O_EXCL | OFlag::O_RDWR | OFlag::O_CLOEXEC,
|
OFlag::O_CREAT | OFlag::O_EXCL | OFlag::O_RDWR | OFlag::O_CLOEXEC,
|
||||||
Mode::from_bits_truncate(0o660),
|
Mode::from_bits_truncate(0o660),
|
||||||
).map_err(|err| {
|
)
|
||||||
|
.map_err(|err| {
|
||||||
format_err!(
|
format_err!(
|
||||||
"failed to create new in-memory communication file at {} - {}",
|
"failed to create new in-memory communication file at {} - {}",
|
||||||
temp_file_name,
|
temp_file_name,
|
||||||
|
@ -110,11 +114,11 @@ fn create_new() -> Result<Fd, Error> {
|
||||||
// make sure the backup user can access the file:
|
// make sure the backup user can access the file:
|
||||||
if let Ok(backup_user) = crate::backup::backup_user() {
|
if let Ok(backup_user) = crate::backup::backup_user() {
|
||||||
match nix::unistd::fchown(fd.as_raw_fd(), None, Some(backup_user.gid)) {
|
match nix::unistd::fchown(fd.as_raw_fd(), None, Some(backup_user.gid)) {
|
||||||
Ok(()) => (),
|
Ok(()) => (),
|
||||||
Err(err) if err.is_errno(Errno::EPERM) => {
|
Err(err) if err.is_errno(Errno::EPERM) => {
|
||||||
// we're not the daemon (root), so the file is already owned by the backup user
|
// we're not the daemon (root), so the file is already owned by the backup user
|
||||||
}
|
}
|
||||||
Err(err) => bail!(
|
Err(err) => bail!(
|
||||||
"failed to set group to 'backup' for {} - {}",
|
"failed to set group to 'backup' for {} - {}",
|
||||||
temp_file_name,
|
temp_file_name,
|
||||||
err
|
err
|
||||||
|
@ -127,15 +131,15 @@ fn create_new() -> Result<Fd, Error> {
|
||||||
// TODO: nicer `renameat2()` wrapper in `proxmox::sys`?
|
// TODO: nicer `renameat2()` wrapper in `proxmox::sys`?
|
||||||
let c_file_name = CString::new(temp_file_name.as_bytes()).unwrap();
|
let c_file_name = CString::new(temp_file_name.as_bytes()).unwrap();
|
||||||
let new_path = CString::new(MEMCOM_FILE_PATH).unwrap();
|
let new_path = CString::new(MEMCOM_FILE_PATH).unwrap();
|
||||||
let rc = unsafe {
|
let rc = unsafe {
|
||||||
libc::renameat2(
|
libc::renameat2(
|
||||||
-1,
|
-1,
|
||||||
c_file_name.as_ptr(),
|
c_file_name.as_ptr(),
|
||||||
-1,
|
-1,
|
||||||
new_path.as_ptr(),
|
new_path.as_ptr(),
|
||||||
libc::RENAME_NOREPLACE,
|
libc::RENAME_NOREPLACE,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
if rc == 0 {
|
if rc == 0 {
|
||||||
return Ok(fd);
|
return Ok(fd);
|
||||||
}
|
}
|
||||||
|
@ -148,7 +152,7 @@ fn create_new() -> Result<Fd, Error> {
|
||||||
drop(fd);
|
drop(fd);
|
||||||
return open_existing().map_err(Error::from);
|
return open_existing().map_err(Error::from);
|
||||||
}
|
}
|
||||||
|
|
||||||
// for any other errors, just bail out
|
// for any other errors, just bail out
|
||||||
bail!(
|
bail!(
|
||||||
"failed to move file at {} into place at {} - {}",
|
"failed to move file at {} into place at {} - {}",
|
||||||
|
|
Loading…
Reference in New Issue