[pbs-devel] [RFC v2 proxmox-backup 18/36] client: mount: make split pxar archives mountable

Fabian Grünbichler f.gruenbichler at proxmox.com
Mon Mar 11 15:58:24 CET 2024


On March 5, 2024 10:26 am, Christian Ebner wrote:
> Cover the cases where the pxar archive was uploaded as split payload
> data and metadata streams. Instantiate the required reader and
> decoder instances to access the metadata and payload data archives.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
> changes since version 1:
> - no changes
> 
>  proxmox-backup-client/src/mount.rs | 56 ++++++++++++++++++++++--------
>  1 file changed, 41 insertions(+), 15 deletions(-)
> 
> diff --git a/proxmox-backup-client/src/mount.rs b/proxmox-backup-client/src/mount.rs
> index 4a2f8335..c955a7da 100644
> --- a/proxmox-backup-client/src/mount.rs
> +++ b/proxmox-backup-client/src/mount.rs
> @@ -219,19 +219,22 @@ async fn mount_do(param: Value, pipe: Option<OwnedFd>) -> Result<Value, Error> {
>          }
>      };
>  
> -    let server_archive_name = if archive_name.ends_with(".pxar") {
> -        if target.is_none() {
> -            bail!("use the 'mount' command to mount pxar archives");
> -        }
> -        format!("{}.didx", archive_name)
> -    } else if archive_name.ends_with(".img") {
> -        if target.is_some() {
> -            bail!("use the 'map' command to map drive images");
> -        }
> -        format!("{}.fidx", archive_name)
> -    } else {
> -        bail!("Can only mount/map pxar archives and drive images.");
> -    };
> +    let server_archive_name =
> +        if archive_name.ends_with(".pxar") || archive_name.ends_with(".pxar.meta") {
> +            if target.is_none() {
> +                bail!("use the 'mount' command to mount pxar archives");
> +            }
> +            format!("{}.didx", archive_name)
> +        } else if archive_name.ends_with(".img") {
> +            if target.is_some() {
> +                bail!("use the 'map' command to map drive images");
> +            }
> +            format!("{}.fidx", archive_name)
> +        } else if archive_name.ends_with(".pxar.pld") {
> +            bail!("Use corresponding pxar.meta archive to mount.");

couldn't this just be mapped for convenience' sake?

> +        } else {
> +            bail!("Can only mount/map pxar archives and drive images.");
> +        };
>  
>      let client = BackupReader::start(
>          &client,
> @@ -289,14 +292,37 @@ async fn mount_do(param: Value, pipe: Option<OwnedFd>) -> Result<Value, Error> {
>          let most_used = index.find_most_used_chunks(8);
>          let chunk_reader = RemoteChunkReader::new(
>              client.clone(),
> -            crypt_config,
> +            crypt_config.clone(),
>              file_info.chunk_crypt_mode(),
>              most_used,
>          );
>          let reader = BufferedDynamicReader::new(index, chunk_reader);
> +
>          let archive_size = reader.archive_size();
>          let reader: pbs_pxar_fuse::Reader = Arc::new(BufferedDynamicReadAt::new(reader));
> -        let decoder = pbs_pxar_fuse::Accessor::new(reader, archive_size).await?;
> +
> +        let mut decoder = pbs_pxar_fuse::Accessor::new(reader, archive_size).await?;
> +
> +        if let Some(archive_base_name) = server_archive_name.strip_suffix(".pxar.meta.didx") {
> +            let payload_archive_name = format!("{archive_base_name}.pxar.pld.didx");
> +            let payload_index = client
> +                .download_dynamic_index(&manifest, &payload_archive_name)
> +                .await?;
> +
> +            let payload_most_used = payload_index.find_most_used_chunks(8);
> +            let payload_chunk_reader = RemoteChunkReader::new(
> +                client.clone(),
> +                crypt_config,
> +                file_info.chunk_crypt_mode(),
> +                payload_most_used,
> +            );
> +
> +            let payload_reader = BufferedDynamicReader::new(payload_index, payload_chunk_reader);
> +            let payload_reader: pbs_pxar_fuse::Reader =
> +                Arc::new(BufferedDynamicReadAt::new(payload_reader));
> +
> +            decoder = decoder.redirect_payload_input(payload_reader);
> +        }

this code now exists twice, and will be introduced a third time for the
catalog shell (somewhat factored out there). I think we'd just want a
get_decoder helper somewhere that takes care of all of that?

>  
>          let session =
>              pbs_pxar_fuse::Session::mount(decoder, options, false, Path::new(target.unwrap()))
> -- 
> 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