use std::path::{Path, PathBuf};
use super::Result;
pub(crate) const NUM_BUCKETS: usize = 256;
pub(crate) const BUCKET_BUF_SIZE: usize = 256 * 1024;
pub(crate) struct ScratchDir {
pub(crate) path: PathBuf,
}
impl ScratchDir {
pub(crate) fn new(parent: &Path, name: &str) -> Result<Self> {
let path = parent.join(format!(".pbfhogg-{name}-{}", std::process::id()));
std::fs::create_dir_all(&path)
.map_err(|e| format!("failed to create scratch directory {}: {e}", path.display()))?;
Ok(Self { path })
}
pub(crate) fn bucket_path(&self, prefix: &str, index: usize) -> PathBuf {
self.path.join(format!("{prefix}-{index:03}"))
}
pub(crate) fn file_path(&self, name: &str) -> PathBuf {
self.path.join(name)
}
}
impl Drop for ScratchDir {
fn drop(&mut self) {
drop(std::fs::remove_dir_all(&self.path));
}
}
#[cfg(feature = "linux-direct-io")]
pub(crate) fn advise_dontneed_file(file: &std::fs::File) {
use std::os::unix::io::AsRawFd;
unsafe { libc::posix_fadvise(file.as_raw_fd(), 0, 0, libc::POSIX_FADV_DONTNEED) };
}