src/backup/chunk_store.rs: implement cond_touch_chunk()

This will be used by backup sync to test if a chunk already exists.
This commit is contained in:
Dietmar Maurer 2020-01-02 13:26:28 +01:00
parent 1cf5178ac5
commit 2585a8a4e2
2 changed files with 17 additions and 3 deletions

View File

@ -173,6 +173,11 @@ impl ChunkStore {
} }
pub fn touch_chunk(&self, digest: &[u8; 32]) -> Result<(), Error> { pub fn touch_chunk(&self, digest: &[u8; 32]) -> Result<(), Error> {
self.cond_touch_chunk(digest, true)?;
Ok(())
}
pub fn cond_touch_chunk(&self, digest: &[u8; 32], fail_if_not_exist: bool) -> Result<bool, Error> {
let (chunk_path, _digest_str) = self.chunk_path(digest); let (chunk_path, _digest_str) = self.chunk_path(digest);
@ -187,14 +192,19 @@ impl ChunkStore {
use nix::NixPath; use nix::NixPath;
let res = chunk_path.with_nix_path(|cstr| unsafe { let res = chunk_path.with_nix_path(|cstr| unsafe {
libc::utimensat(-1, cstr.as_ptr(), &times[0], libc::AT_SYMLINK_NOFOLLOW) let tmp = libc::utimensat(-1, cstr.as_ptr(), &times[0], libc::AT_SYMLINK_NOFOLLOW);
nix::errno::Errno::result(tmp)
})?; })?;
if let Err(err) = nix::errno::Errno::result(res) { if let Err(err) = res {
if !fail_if_not_exist && err.as_errno() == Some(nix::errno::Errno::ENOENT) {
return Ok(false);
}
bail!("updata atime failed for chunk {:?} - {}", chunk_path, err); bail!("updata atime failed for chunk {:?} - {}", chunk_path, err);
} }
Ok(()) Ok(true)
} }
pub fn read_chunk(&self, digest: &[u8; 32]) -> Result<DataBlob, Error> { pub fn read_chunk(&self, digest: &[u8; 32]) -> Result<DataBlob, Error> {

View File

@ -299,6 +299,10 @@ impl DataStore {
self.chunk_store.chunk_path(digest) self.chunk_store.chunk_path(digest)
} }
pub fn cond_touch_chunk(&self, digest: &[u8; 32], fail_if_not_exist: bool) -> Result<bool, Error> {
self.chunk_store.cond_touch_chunk(digest, fail_if_not_exist)
}
pub fn insert_chunk( pub fn insert_chunk(
&self, &self,
chunk: &DataBlob, chunk: &DataBlob,