[pbs-devel] [PATCH v6 proxmox-backup 25/65] client: mount: make split pxar archives mountable
Dominik Csapak
d.csapak at proxmox.com
Tue May 21 14:54:07 CEST 2024
clippy warning inline:
On 5/14/24 12:33, 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>
> ---
> proxmox-backup-client/src/mount.rs | 34 ++++++++++++++----------------
> 1 file changed, 16 insertions(+), 18 deletions(-)
>
> diff --git a/proxmox-backup-client/src/mount.rs b/proxmox-backup-client/src/mount.rs
> index 67fd23468..dd9532fbe 100644
> --- a/proxmox-backup-client/src/mount.rs
> +++ b/proxmox-backup-client/src/mount.rs
> @@ -21,17 +21,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 +218,10 @@ 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 archive_name.ends_with(".pxar")
> + || archive_name.ends_with(".mpxar")
> + || archive_name.ends_with(".ppxar")
> + {
> if target.is_none() {
> bail!("use the 'mount' command to mount pxar archives");
> }
> @@ -246,7 +248,9 @@ 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);
> +
> + let file_info = manifest.lookup_file_info(&archive_name)?;
>
> let daemonize = || -> Result<(), Error> {
> if let Some(pipe) = pipe {
> @@ -283,20 +287,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_ref().map(|x| x.as_str()),
here you can use
payload_archive_name.as_deref() instead of .as_ref().map(...)
> 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(reader, archive_size, None).await?;
> + &manifest,
> + crypt_config.clone(),
> + )
> + .await?;
>
> let session =
> pbs_pxar_fuse::Session::mount(decoder, options, false, Path::new(target.unwrap()))
More information about the pbs-devel
mailing list