[pbs-devel] [PATCH v3 proxmox-backup 53/58] client: pxar: opt encode cli exclude patterns as CliParams

Christian Ebner c.ebner at proxmox.com
Thu Mar 28 13:37:02 CET 2024


Instead of encoding the pxar cli exclude patterns as regular file
within the root directory of an archive, store this information
directly after the pxar format version entry in a new pxar cli params
entry.

This behaviour is however currently exclusive to the archives written
with format version 2 in a split metadata and payload case.

This is a breaking change for the encoding of new cli exclude
parameters. Any new exclude parameter will not be added to an already
present .pxar-cliexclude file, and it will not be created if not
present.

Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
changes since version 2:
- not present in previous version

 pbs-client/src/pxar/create.rs             | 25 +++++++++++++++--------
 pbs-client/src/pxar/extract.rs            |  3 ++-
 pbs-client/src/pxar/tools.rs              |  6 ++++++
 src/tape/file_formats/snapshot_archive.rs |  8 ++++++--
 4 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/pbs-client/src/pxar/create.rs b/pbs-client/src/pxar/create.rs
index 461509c39..5f2270fe8 100644
--- a/pbs-client/src/pxar/create.rs
+++ b/pbs-client/src/pxar/create.rs
@@ -343,13 +343,6 @@ where
         set.insert(stat.st_dev);
     }
 
-    let mut encoder = Encoder::new(
-        &mut writers.writer,
-        &metadata,
-        writers.payload_writer.as_mut(),
-    )
-    .await?;
-
     let mut patterns = options.patterns;
 
     if options.skip_lost_and_found {
@@ -359,6 +352,14 @@ where
             MatchType::Exclude,
         )?);
     }
+
+    let cli_params_content = generate_pxar_excludes_cli(&patterns[..]);
+    let cli_params = if options.previous_ref.is_some() {
+        Some(cli_params_content.as_slice())
+    } else {
+        None
+    };
+
     let (previous_payload_index, previous_metadata_accessor) =
         if let Some(refs) = options.previous_ref {
             (
@@ -369,6 +370,14 @@ where
             (None, None)
         };
 
+    let mut encoder = Encoder::new(
+        &mut writers.writer,
+        &metadata,
+        writers.payload_writer.as_mut(),
+        cli_params,
+    )
+    .await?;
+
     let mut archiver = Archiver {
         feature_flags,
         fs_feature_flags,
@@ -454,7 +463,7 @@ impl Archiver {
 
             let mut file_list = self.generate_directory_file_list(&mut dir, is_root)?;
 
-            if is_root && old_patterns_count > 0 {
+            if is_root && old_patterns_count > 0 && previous_metadata_accessor.is_none() {
                 file_list.push(FileListEntry {
                     name: CString::new(".pxarexclude-cli").unwrap(),
                     path: PathBuf::new(),
diff --git a/pbs-client/src/pxar/extract.rs b/pbs-client/src/pxar/extract.rs
index 56f8d7adc..46ff8fc80 100644
--- a/pbs-client/src/pxar/extract.rs
+++ b/pbs-client/src/pxar/extract.rs
@@ -267,7 +267,8 @@ where
         };
 
         let extract_res = match (did_match, entry.kind()) {
-            (_, EntryKind::Version(_)) => Ok(()),
+            (_, EntryKind::Version(_version)) => Ok(()),
+            (_, EntryKind::CliParams(_data)) => Ok(()),
             (_, EntryKind::Directory) => {
                 self.callback(entry.path());
 
diff --git a/pbs-client/src/pxar/tools.rs b/pbs-client/src/pxar/tools.rs
index 4e9bd5b60..478acdc0f 100644
--- a/pbs-client/src/pxar/tools.rs
+++ b/pbs-client/src/pxar/tools.rs
@@ -173,6 +173,12 @@ pub fn format_multi_line_entry(entry: &Entry) -> String {
 
     let (size, link, type_name, payload_offset) = match entry.kind() {
         EntryKind::Version(version) => (format!("{version:?}"), String::new(), "version", None),
+        EntryKind::CliParams(params) => (
+            "0".to_string(),
+            format!(" -> {:?}", params.as_os_str()),
+            "symlink",
+            None,
+        ),
         EntryKind::File {
             size,
             payload_offset,
diff --git a/src/tape/file_formats/snapshot_archive.rs b/src/tape/file_formats/snapshot_archive.rs
index 43d1cf9c3..7e052919b 100644
--- a/src/tape/file_formats/snapshot_archive.rs
+++ b/src/tape/file_formats/snapshot_archive.rs
@@ -58,8 +58,12 @@ pub fn tape_write_snapshot_archive<'a>(
             ));
         }
 
-        let mut encoder =
-            pxar::encoder::sync::Encoder::new(PxarTapeWriter::new(writer), &root_metadata, None)?;
+        let mut encoder = pxar::encoder::sync::Encoder::new(
+            PxarTapeWriter::new(writer),
+            &root_metadata,
+            None,
+            None,
+        )?;
 
         for filename in file_list.iter() {
             let mut file = snapshot_reader.open_file(filename).map_err(|err| {
-- 
2.39.2





More information about the pbs-devel mailing list