Skip to content

Commit

Permalink
More improvements to support caching filesystems.
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewchambers committed Jan 25, 2023
1 parent 0544e0a commit 91c3a6a
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 32 deletions.
14 changes: 4 additions & 10 deletions src/fstx2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -361,16 +361,13 @@ impl<'a> ReadTxn<'a> {
self.fs.open(p, vfs::OpenFlags::RDONLY)
}

pub fn metadata(&self, p: &str) -> Result<vfs::Metadata, std::io::Error> {
self.fs.metadata(p)
}

pub fn read_dir(&self, p: &str) -> Result<Vec<vfs::DirEntry>, std::io::Error> {
self.fs.read_dir(p)
}

pub fn file_exists(&self, p: &str) -> Result<bool, std::io::Error> {
match self.fs.metadata(p) {
// Using open plays better with fuse caching.
match self.fs.open(p, vfs::OpenFlags::RDONLY) {
Ok(_) => Ok(true),
Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(false),
Err(err) => Err(err),
Expand Down Expand Up @@ -564,12 +561,9 @@ impl<'a> WriteTxn<'a> {
self.fs.open(p, vfs::OpenFlags::RDONLY)
}

pub fn metadata(&self, p: &str) -> Result<vfs::Metadata, std::io::Error> {
self.fs.metadata(p)
}

pub fn file_exists(&self, p: &str) -> Result<bool, std::io::Error> {
match self.fs.metadata(p) {
// Using open plays better with fuse caching.
match self.fs.open(p, vfs::OpenFlags::RDONLY) {
Ok(_) => Ok(true),
Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(false),
Err(err) => Err(err),
Expand Down
23 changes: 7 additions & 16 deletions src/repository.rs
Original file line number Diff line number Diff line change
Expand Up @@ -489,14 +489,10 @@ impl Repo {

for item in items.drain(..) {
let path = format!("items/{:x}", item);
match txn.metadata(&path) {
Ok(_) => {
let removed = path.clone() + ".removed";
txn.add_rename(&path, &removed)?;
removed_items.push(item)
}
Err(err) if err.kind() == std::io::ErrorKind::NotFound => (),
Err(err) => return Err(err.into()),
if txn.file_exists(&path)? {
let removed = path.clone() + ".removed";
txn.add_rename(&path, &removed)?;
removed_items.push(item)
};
}

Expand Down Expand Up @@ -880,14 +876,9 @@ impl Repo {
let op = serde_bare::from_reader(&mut log_file)?;
if let oplog::LogOp::AddItem((id, md)) = op {
let p = format!("items/{:x}", id);
match txn.metadata(&p) {
Ok(_) => {
compacted_log.write_all(&serde_bare::to_vec(
&oplog::LogOp::AddItem((id, md)),
)?)?;
}
Err(err) if err.kind() == std::io::ErrorKind::NotFound => (),
Err(err) => return Err(err.into()),
if txn.file_exists(&p)? {
compacted_log
.write_all(&serde_bare::to_vec(&oplog::LogOp::AddItem((id, md)))?)?;
}
}
}
Expand Down
9 changes: 3 additions & 6 deletions src/vfs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -302,12 +302,9 @@ impl OsDir {
}

pub fn metadata(&self, p: &str) -> Result<Metadata, std::io::Error> {
let stat = nix::sys::stat::fstatat(
self.f.as_raw_fd(),
Path::new(p),
nix::fcntl::AtFlags::empty(),
)?;
Ok(stat.into())
// Using open for querying metadata forces a refresh of the stat
// info on fuse filesystems with caching enabled.
self.open(p, OpenFlags::RDONLY)?.metadata()
}

pub fn rename(&self, from: &str, to: &str) -> Result<(), std::io::Error> {
Expand Down

0 comments on commit 91c3a6a

Please sign in to comment.