[pbs-devel] [PATCH v6 proxmox-backup 30/65] file restore: factor out getting pxar reader

Dominik Csapak d.csapak at proxmox.com
Tue May 21 15:19:36 CEST 2024


On 5/14/24 12:33, Christian Ebner wrote:
> Factor out the logic to get the pxar reader into a dedicated function
> so it can be reused to get the payload data archive reader instance.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
>   proxmox-file-restore/src/main.rs | 44 ++++++++++++++++++++------------
>   1 file changed, 28 insertions(+), 16 deletions(-)
> 
> diff --git a/proxmox-file-restore/src/main.rs b/proxmox-file-restore/src/main.rs
> index 685ce34d9..8a11cff65 100644
> --- a/proxmox-file-restore/src/main.rs
> +++ b/proxmox-file-restore/src/main.rs
> @@ -34,7 +34,7 @@ use pbs_client::{BackupReader, BackupRepository, RemoteChunkReader};
>   use pbs_datastore::catalog::{ArchiveEntry, CatalogReader, DirEntryAttribute};
>   use pbs_datastore::dynamic_index::{BufferedDynamicReader, LocalDynamicReadAt};
>   use pbs_datastore::index::IndexFile;
> -use pbs_datastore::CATALOG_NAME;
> +use pbs_datastore::{BackupManifest, CATALOG_NAME};
>   use pbs_key_config::decrypt_key;
>   use pbs_tools::crypt_config::CryptConfig;
>   
> @@ -335,6 +335,31 @@ async fn list(
>       Ok(())
>   }
>   
> +async fn get_local_pxar_reader(

nit: this probably shouldn't be named 'get_local_pxar_reader' since none of it is 'local' ?

also this has now the same name as the function used in the datastore api to download
files from pxar (locally)

probably 'get_remote_pxar_reader' ?

> +    archive_name: &str,
> +    client: Arc<BackupReader>,
> +    manifest: &BackupManifest,
> +    crypt_config: Option<Arc<CryptConfig>>,
> +) -> Result<(LocalDynamicReadAt<RemoteChunkReader>, u64), Error> {
> +    let index = client
> +        .download_dynamic_index(&manifest, &archive_name)
> +        .await?;
> +    let most_used = index.find_most_used_chunks(8);
> +
> +    let file_info = manifest.lookup_file_info(&archive_name)?;
> +    let chunk_reader = RemoteChunkReader::new(
> +        client.clone(),
> +        crypt_config,
> +        file_info.chunk_crypt_mode(),
> +        most_used,
> +    );
> +
> +    let reader = BufferedDynamicReader::new(index, chunk_reader);
> +    let archive_size = reader.archive_size();
> +
> +    Ok((LocalDynamicReadAt::new(reader), archive_size))
> +}
> +
>   #[api(
>       input: {
>           properties: {
> @@ -452,21 +477,8 @@ async fn extract(
>   
>       match path {
>           ExtractPath::Pxar(archive_name, path) => {
> -            let file_info = manifest.lookup_file_info(&archive_name)?;
> -            let index = client
> -                .download_dynamic_index(&manifest, &archive_name)
> -                .await?;
> -            let most_used = index.find_most_used_chunks(8);
> -            let chunk_reader = RemoteChunkReader::new(
> -                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 = LocalDynamicReadAt::new(reader);
> +            let (reader, archive_size) =
> +                get_local_pxar_reader(&archive_name, client, &manifest, crypt_config).await?;
>               let decoder = Accessor::new(reader, archive_size, None).await?;
>               extract_to_target(decoder, &path, target, format, zstd).await?;
>           }





More information about the pbs-devel mailing list