[pbs-devel] [PATCH v6 proxmox-backup 22/65] client: restore: read payload from dedicated index

Dominik Csapak d.csapak at proxmox.com
Tue May 21 14:44:48 CEST 2024


this patch (and the next few) introduce a few checks that check the filename
for '.mpxar.didx' or '.mpxar' etc.

wouldn't it be nicer to have a helper that checks that at one point in the code
instead of sprinkling the extension strings around the code?
e.g. a typo at any one of those places is easy to miss but might introduce
bugs or unintended behavior

On 5/14/24 12:33, Christian Ebner wrote:
> Whenever a split pxar archive is encountered, instantiate and attach
> the required dedicated reader instance to the decoder instance on
> restore.
> 
> Piping the output to stdout is not possible for these, as this would
> require a decoder instance which can decode the input stream, while
> maintaining the pxar stream format as output.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
>   proxmox-backup-client/src/main.rs | 39 ++++++++++++++++++++-----------
>   1 file changed, 25 insertions(+), 14 deletions(-)
> 
> diff --git a/proxmox-backup-client/src/main.rs b/proxmox-backup-client/src/main.rs
> index b81719dad..821777d66 100644
> --- a/proxmox-backup-client/src/main.rs
> +++ b/proxmox-backup-client/src/main.rs
> @@ -1216,7 +1216,7 @@ async fn dump_image<W: Write>(
>   fn parse_archive_type(name: &str) -> (String, ArchiveType) {
>       if name.ends_with(".didx") || name.ends_with(".fidx") || name.ends_with(".blob") {
>           (name.into(), archive_type(name).unwrap())
> -    } else if name.ends_with(".pxar") {
> +    } else if name.ends_with(".pxar") || name.ends_with(".mpxar") || name.ends_with(".ppxar") {
>           (format!("{}.didx", name), ArchiveType::DynamicIndex)
>       } else if name.ends_with(".img") {
>           (format!("{}.fidx", name), ArchiveType::FixedIndex)
> @@ -1450,20 +1450,15 @@ async fn restore(
>                   .map_err(|err| format_err!("unable to pipe data - {}", err))?;
>           }
>       } else if archive_type == ArchiveType::DynamicIndex {
> -        let index = client
> -            .download_dynamic_index(&manifest, &archive_name)
> -            .await?;
> +        let (archive_name, payload_archive_name) = helper::get_pxar_archive_names(&archive_name);
>   
> -        let most_used = index.find_most_used_chunks(8);
> -
> -        let chunk_reader = RemoteChunkReader::new(
> +        let mut reader = get_buffered_pxar_reader(
> +            &archive_name,
>               client.clone(),
> -            crypt_config,
> -            file_info.chunk_crypt_mode(),
> -            most_used,
> -        );
> -
> -        let mut reader = BufferedDynamicReader::new(index, chunk_reader);
> +            &manifest,
> +            crypt_config.clone(),
> +        )
> +        .await?;
>   
>           let on_error = if ignore_extract_device_errors {
>               let handler: PxarErrorHandler = Box::new(move |err: Error| {
> @@ -1518,8 +1513,21 @@ async fn restore(
>           }
>   
>           if let Some(target) = target {
> +            let decoder = if let Some(payload_archive_name) = payload_archive_name {
> +                let payload_reader = get_buffered_pxar_reader(
> +                    &payload_archive_name,
> +                    client.clone(),
> +                    &manifest,
> +                    crypt_config.clone(),
> +                )
> +                .await?;
> +                pxar::decoder::Decoder::from_std(reader, Some(payload_reader))?
> +            } else {
> +                pxar::decoder::Decoder::from_std(reader, None)?
> +            };
> +
>               pbs_client::pxar::extract_archive(
> -                pxar::decoder::Decoder::from_std(reader, None)?,
> +                decoder,
>                   Path::new(target),
>                   feature_flags,
>                   |path| {
> @@ -1529,6 +1537,9 @@ async fn restore(
>               )
>               .map_err(|err| format_err!("error extracting archive - {:#}", err))?;
>           } else {
> +            if archive_name.ends_with(".mpxar.didx") || archive_name.ends_with(".ppxar.didx") {
> +                bail!("unable to pipe split archive");
> +            }
>               let mut writer = std::fs::OpenOptions::new()
>                   .write(true)
>                   .open("/dev/stdout")





More information about the pbs-devel mailing list