[pbs-devel] [PATCH v3 proxmox-backup 26/58] client: mount: make split pxar archives mountable

Christian Ebner c.ebner at proxmox.com
Thu Apr 4 15:29:50 CEST 2024


On 4/4/24 11:43, Fabian Grünbichler wrote:
> On March 28, 2024 1:36 pm, 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 2:
>> - use mpxar and ppxar file extensions
>> - use helpers for archive names and fuse reader
>>
>>   proxmox-backup-client/src/mount.rs | 54 ++++++++++++++++++++----------
>>   1 file changed, 37 insertions(+), 17 deletions(-)
>>
>> diff --git a/proxmox-backup-client/src/mount.rs b/proxmox-backup-client/src/mount.rs
>> index 4a2f83357..7bcd581be 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,6 +248,16 @@ 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 base_name = server_archive_name
>> +        .strip_suffix(".mpxar.didx")
>> +        .or_else(|| server_archive_name.strip_suffix(".ppxar.didx"));
>> +
>> +    let server_archive_name = if let Some(base) = base_name {
>> +        format!("{base}.mpxar.didx")
>> +    } else {
>> +        server_archive_name.to_owned()
>> +    };
>> +
> 
> should this be switched to the get_pxar_archive_names helper?

Yes, indeed! Moved the helper invocation up here and removed the latter 
(now unneeded) one.

> 
>>       let file_info = manifest.lookup_file_info(&server_archive_name)?;
>>   
>>       let daemonize = || -> Result<(), Error> {
>> @@ -283,20 +295,28 @@ 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 (archive_name, payload_archive_name) =
>> +            helper::get_pxar_archive_names(&server_archive_name);
> 
> and then we can skip this one here ;)
> 
>> +        let (reader, archive_size) = helper::get_pxar_fuse_reader(
>> +            &archive_name,
>>               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).await?;
>> +            &manifest,
>> +            crypt_config.clone(),
>> +        )
>> +        .await?;
>> +
>> +        let decoder = if let Some(payload_archive_name) = payload_archive_name {
>> +            let (payload_reader, _) = helper::get_pxar_fuse_reader(
>> +                &payload_archive_name,
>> +                client.clone(),
>> +                &manifest,
>> +                crypt_config.clone(),
>> +            )
>> +            .await?;
>> +            pbs_pxar_fuse::Accessor::new(reader, archive_size, Some(payload_reader)).await?
>> +        } else {
>> +            pbs_pxar_fuse::Accessor::new(reader, archive_size, None).await?
>> +        };
>>   
>>           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
>>
>>
>>
> 
> 
> _______________________________________________
> 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