[pbs-devel] [PATCH v8 proxmox-backup 27/69] client: mount: make split pxar archives mountable

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Jun 4 10:24:09 CEST 2024


On May 28, 2024 11:42 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 7:
> - no changes
> 
> changes since version 6:
> - use newly introduced has_pxar_filename_extension helper
> - adapt to PxarVariant pxar interface
> - fix clippy warnings
> 
>  proxmox-backup-client/src/mount.rs | 34 +++++++++++++-----------------
>  proxmox-file-restore/src/main.rs   |  1 +
>  2 files changed, 16 insertions(+), 19 deletions(-)
> 
> diff --git a/proxmox-backup-client/src/mount.rs b/proxmox-backup-client/src/mount.rs
> index 4d352b6e4..8b3d8915a 100644
> --- a/proxmox-backup-client/src/mount.rs
> +++ b/proxmox-backup-client/src/mount.rs
> @@ -10,6 +10,7 @@ use futures::future::FutureExt;
>  use futures::select;
>  use futures::stream::{StreamExt, TryStreamExt};
>  use nix::unistd::{fork, ForkResult};
> +use pbs_client::tools::has_pxar_filename_extension;

nit: this should be sorted below..

>  use serde_json::Value;
>  use tokio::signal::unix::{signal, SignalKind};
>  
> @@ -21,17 +22,16 @@ use pbs_api_types::BackupNamespace;
>  use pbs_client::tools::key_source::get_encryption_key_password;
>  use pbs_client::{BackupReader, RemoteChunkReader};
>  use pbs_datastore::cached_chunk_reader::CachedChunkReader;
> -use pbs_datastore::dynamic_index::BufferedDynamicReader;
>  use pbs_datastore::index::IndexFile;
>  use pbs_key_config::load_and_decrypt_key;
>  use pbs_tools::crypt_config::CryptConfig;
>  use pbs_tools::json::required_string_param;
>  
> +use crate::helper;
>  use crate::{
>      complete_group_or_snapshot, complete_img_archive_name, complete_namespace,
>      complete_pxar_archive_name, complete_repository, connect, dir_or_last_from_group,
> -    extract_repository_from_value, optional_ns_param, record_repository, BufferedDynamicReadAt,
> -    REPO_URL_SCHEMA,
> +    extract_repository_from_value, optional_ns_param, record_repository, REPO_URL_SCHEMA,
>  };
>  
>  #[sortable]
> @@ -219,7 +219,7 @@ async fn mount_do(param: Value, pipe: Option<OwnedFd>) -> Result<Value, Error> {
>          }
>      };
>  
> -    let server_archive_name = if archive_name.ends_with(".pxar") {
> +    let server_archive_name = if has_pxar_filename_extension(archive_name, false) {
>          if target.is_none() {
>              bail!("use the 'mount' command to mount pxar archives");
>          }
> @@ -246,7 +246,10 @@ async fn mount_do(param: Value, pipe: Option<OwnedFd>) -> Result<Value, Error> {
>      let (manifest, _) = client.download_manifest().await?;
>      manifest.check_fingerprint(crypt_config.as_ref().map(Arc::as_ref))?;
>  
> -    let file_info = manifest.lookup_file_info(&server_archive_name)?;
> +    let (archive_name, payload_archive_name) =
> +        helper::get_pxar_archive_names(&server_archive_name, &manifest);
> +
> +    let file_info = manifest.lookup_file_info(&archive_name)?;
>  
>      let daemonize = || -> Result<(), Error> {
>          if let Some(pipe) = pipe {
> @@ -283,21 +286,14 @@ async fn mount_do(param: Value, pipe: Option<OwnedFd>) -> Result<Value, Error> {
>          futures::future::select(interrupt_int.recv().boxed(), interrupt_term.recv().boxed());
>  
>      if server_archive_name.ends_with(".didx") {
> -        let index = client
> -            .download_dynamic_index(&manifest, &server_archive_name)
> -            .await?;
> -        let most_used = index.find_most_used_chunks(8);
> -        let chunk_reader = RemoteChunkReader::new(
> +        let decoder = helper::get_pxar_fuse_accessor(
> +            &archive_name,
> +            payload_archive_name.as_deref(),
>              client.clone(),
> -            crypt_config,
> -            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(pxar::PxarVariant::Unified(reader), archive_size).await?;
> +            &manifest,
> +            crypt_config.clone(),
> +        )
> +        .await?;
>  
>          let session =
>              pbs_pxar_fuse::Session::mount(decoder, options, false, Path::new(target.unwrap()))
> diff --git a/proxmox-file-restore/src/main.rs b/proxmox-file-restore/src/main.rs
> index 680281632..61dece97d 100644
> --- a/proxmox-file-restore/src/main.rs
> +++ b/proxmox-file-restore/src/main.rs
> @@ -24,6 +24,7 @@ use pbs_api_types::{file_restore::FileRestoreFormat, BackupDir, BackupNamespace,
>  use pbs_client::pxar::{create_tar, create_zip, extract_sub_dir, extract_sub_dir_seq};
>  use pbs_client::tools::{
>      complete_group_or_snapshot, complete_repository, connect, extract_repository_from_value,
> +    has_pxar_filename_extension,
>      key_source::{
>          crypto_parameters_keep_fd, format_key_source, get_encryption_key_password, KEYFD_SCHEMA,
>          KEYFILE_SCHEMA,
> -- 
> 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