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

Fabian Grünbichler f.gruenbichler at proxmox.com
Fri Apr 5 11:49:25 CEST 2024


Quoting Christian Ebner (2024-03-28 13:37:02)
> 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,

this seems wrong ;)

> +        ),
>          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
> 
> 
> 
> _______________________________________________
> pbs-devel mailing list
> pbs-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
> 
>




More information about the pbs-devel mailing list