[pbs-devel] [PATCH v3 pxar 11/58] encoder/format: finish payload stream with marker

Christian Ebner c.ebner at proxmox.com
Thu Mar 28 13:36:20 CET 2024


Mark the end of the optional payload stream, this makes sure that at
least some bytes are written to the stream (as empty archives are not
allowed by the proxmox backup server) and possible injected chunks
must be consumed.

Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
changes since version 2:
- add missing Display and size_of impl for this header type

 examples/mk-format-hashes.rs | 5 +++++
 src/encoder/mod.rs           | 8 ++++++++
 src/format/mod.rs            | 4 ++++
 3 files changed, 17 insertions(+)

diff --git a/examples/mk-format-hashes.rs b/examples/mk-format-hashes.rs
index 83adb38..de73df0 100644
--- a/examples/mk-format-hashes.rs
+++ b/examples/mk-format-hashes.rs
@@ -56,6 +56,11 @@ const CONSTANTS: &[(&str, &str, &str)] = &[
         "PXAR_GOODBYE_TAIL_MARKER",
         "__PROXMOX_FORMAT_PXAR_GOODBYE_TAIL_MARKER__",
     ),
+    (
+        "The end marker used in the separate payload stream",
+        "PXAR_PAYLOAD_TAIL_MARKER",
+        "__PROXMOX_FORMAT_PXAR_PAYLOAD_TAIL_MARKER__",
+    ),
 ];
 
 fn main() {
diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs
index 6458bc0..24dcbc9 100644
--- a/src/encoder/mod.rs
+++ b/src/encoder/mod.rs
@@ -871,6 +871,14 @@ impl<'a, T: SeqWrite + 'a> EncoderImpl<'a, T> {
         }
 
         if let EncoderOutput::Owned(Some(output)) = &mut self.payload_output {
+            let mut dummy_writer = 0;
+            seq_write_pxar_entry(
+                output,
+                format::PXAR_PAYLOAD_TAIL_MARKER,
+                &[],
+                &mut dummy_writer,
+            )
+            .await?;
             flush(output).await?;
         }
 
diff --git a/src/format/mod.rs b/src/format/mod.rs
index 1fda535..10192e7 100644
--- a/src/format/mod.rs
+++ b/src/format/mod.rs
@@ -106,6 +106,8 @@ pub const PXAR_PAYLOAD_REF: u64 = 0x419d3d6bc4ba977e;
 pub const PXAR_GOODBYE: u64 = 0x2fec4fa642d5731d;
 /// The end marker used in the GOODBYE object
 pub const PXAR_GOODBYE_TAIL_MARKER: u64 = 0xef5eed5b753e1555;
+/// The end marker used in the separate payload stream
+pub const PXAR_PAYLOAD_TAIL_MARKER: u64 = 0x6c72b78b984c81b5;
 
 #[derive(Debug, Endian)]
 #[repr(C)]
@@ -156,6 +158,7 @@ impl Header {
             PXAR_ENTRY => size_of::<Stat>() as u64,
             PXAR_PAYLOAD | PXAR_GOODBYE => u64::MAX - (size_of::<Self>() as u64),
             PXAR_PAYLOAD_REF => size_of::<PayloadRef>() as u64,
+            PXAR_PAYLOAD_TAIL_MARKER => size_of::<Header>() as u64,
             _ => u64::MAX - (size_of::<Self>() as u64),
         }
     }
@@ -197,6 +200,7 @@ impl Display for Header {
             PXAR_ENTRY => "ENTRY",
             PXAR_PAYLOAD => "PAYLOAD",
             PXAR_PAYLOAD_REF => "PAYLOAD_REF",
+            PXAR_PAYLOAD_TAIL_MARKER => "PXAR_PAYLOAD_TAIL_MARKER",
             PXAR_GOODBYE => "GOODBYE",
             _ => "UNKNOWN",
         };
-- 
2.39.2





More information about the pbs-devel mailing list