]> git.proxmox.com Git - proxmox-backup.git/commitdiff
src/backup/chunk_store.rs: implement cond_touch_chunk()
authorDietmar Maurer <dietmar@proxmox.com>
Thu, 2 Jan 2020 12:26:28 +0000 (13:26 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 2 Jan 2020 12:26:28 +0000 (13:26 +0100)
This will be used by backup sync to test if a chunk already exists.

src/backup/chunk_store.rs
src/backup/datastore.rs

index 0f29b659a66b988738db7e20afa691d7e4490f72..76a2b3bc2c489472ed3d16eec0e2b541470eaac0 100644 (file)
@@ -173,6 +173,11 @@ impl ChunkStore {
     }
 
     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);
 
@@ -187,14 +192,19 @@ impl ChunkStore {
         use nix::NixPath;
 
         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);
         }
 
-        Ok(())
+        Ok(true)
     }
 
     pub fn read_chunk(&self, digest: &[u8; 32]) -> Result<DataBlob, Error> {
index 7e1861ce35edf2f1918d31ca12d4a0c910f56c47..91776ad550c42114ec5450f79b919e20e57681fb 100644 (file)
@@ -299,6 +299,10 @@ impl DataStore {
         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(
         &self,
         chunk: &DataBlob,