all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH proxmox-backup] chunk_store: insert_chunk: write chunk again if sizes don't match
@ 2022-05-09 10:40 Dominik Csapak
  2022-05-09 11:34 ` Fabian Grünbichler
  2022-05-09 11:34 ` Thomas Lamprecht
  0 siblings, 2 replies; 4+ messages in thread
From: Dominik Csapak @ 2022-05-09 10:40 UTC (permalink / raw)
  To: pbs-devel

if the on-disk size of a chunk is not correct, write it again when
inserting and log a warning.

This is currently possible if PBS crashes, but the rename of the chunk
was flushed to disk, when the actual data was not.

Suggested-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 pbs-datastore/src/chunk_store.rs | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/pbs-datastore/src/chunk_store.rs b/pbs-datastore/src/chunk_store.rs
index 8d7df513..93f56e8b 100644
--- a/pbs-datastore/src/chunk_store.rs
+++ b/pbs-datastore/src/chunk_store.rs
@@ -458,17 +458,29 @@ impl ChunkStore {
 
         let lock = self.mutex.lock();
 
+        let raw_data = chunk.raw_data();
+        let encoded_size = raw_data.len() as u64;
+
         if let Ok(metadata) = std::fs::metadata(&chunk_path) {
-            if metadata.is_file() {
-                self.touch_chunk(digest)?;
-                return Ok((true, metadata.len()));
-            } else {
+            if !metadata.is_file() {
                 bail!(
                     "Got unexpected file type on store '{}' for chunk {}",
                     self.name,
                     digest_str
                 );
             }
+            let new_len = metadata.len();
+            if encoded_size == new_len {
+                self.touch_chunk(digest)?;
+                return Ok((true, new_len));
+            } else {
+                log::warn!(
+                    "chunk size mismatch on insert for {}: old {} - new {}",
+                    digest_str,
+                    encoded_size,
+                    new_len
+                );
+            }
         }
 
         let mut tmp_path = chunk_path.clone();
@@ -483,9 +495,6 @@ impl ChunkStore {
             )
         })?;
 
-        let raw_data = chunk.raw_data();
-        let encoded_size = raw_data.len() as u64;
-
         file.write_all(raw_data).map_err(|err| {
             format_err!(
                 "writing temporary chunk on store '{}' failed for {} - {}",
-- 
2.30.2





^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-05-09 11:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-09 10:40 [pbs-devel] [PATCH proxmox-backup] chunk_store: insert_chunk: write chunk again if sizes don't match Dominik Csapak
2022-05-09 11:34 ` Fabian Grünbichler
2022-05-09 11:34 ` Thomas Lamprecht
2022-05-09 11:51   ` Dominik Csapak

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal