[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