[pbs-devel] [PATCH v6 proxmox-backup 22/65] client: restore: read payload from dedicated index
Dominik Csapak
d.csapak at proxmox.com
Tue May 21 14:44:48 CEST 2024
this patch (and the next few) introduce a few checks that check the filename
for '.mpxar.didx' or '.mpxar' etc.
wouldn't it be nicer to have a helper that checks that at one point in the code
instead of sprinkling the extension strings around the code?
e.g. a typo at any one of those places is easy to miss but might introduce
bugs or unintended behavior
On 5/14/24 12:33, Christian Ebner wrote:
> Whenever a split pxar archive is encountered, instantiate and attach
> the required dedicated reader instance to the decoder instance on
> restore.
>
> Piping the output to stdout is not possible for these, as this would
> require a decoder instance which can decode the input stream, while
> maintaining the pxar stream format as output.
>
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
> proxmox-backup-client/src/main.rs | 39 ++++++++++++++++++++-----------
> 1 file changed, 25 insertions(+), 14 deletions(-)
>
> diff --git a/proxmox-backup-client/src/main.rs b/proxmox-backup-client/src/main.rs
> index b81719dad..821777d66 100644
> --- a/proxmox-backup-client/src/main.rs
> +++ b/proxmox-backup-client/src/main.rs
> @@ -1216,7 +1216,7 @@ async fn dump_image<W: Write>(
> fn parse_archive_type(name: &str) -> (String, ArchiveType) {
> if name.ends_with(".didx") || name.ends_with(".fidx") || name.ends_with(".blob") {
> (name.into(), archive_type(name).unwrap())
> - } else if name.ends_with(".pxar") {
> + } else if name.ends_with(".pxar") || name.ends_with(".mpxar") || name.ends_with(".ppxar") {
> (format!("{}.didx", name), ArchiveType::DynamicIndex)
> } else if name.ends_with(".img") {
> (format!("{}.fidx", name), ArchiveType::FixedIndex)
> @@ -1450,20 +1450,15 @@ async fn restore(
> .map_err(|err| format_err!("unable to pipe data - {}", err))?;
> }
> } else if archive_type == ArchiveType::DynamicIndex {
> - let index = client
> - .download_dynamic_index(&manifest, &archive_name)
> - .await?;
> + let (archive_name, payload_archive_name) = helper::get_pxar_archive_names(&archive_name);
>
> - let most_used = index.find_most_used_chunks(8);
> -
> - let chunk_reader = RemoteChunkReader::new(
> + let mut reader = get_buffered_pxar_reader(
> + &archive_name,
> client.clone(),
> - crypt_config,
> - file_info.chunk_crypt_mode(),
> - most_used,
> - );
> -
> - let mut reader = BufferedDynamicReader::new(index, chunk_reader);
> + &manifest,
> + crypt_config.clone(),
> + )
> + .await?;
>
> let on_error = if ignore_extract_device_errors {
> let handler: PxarErrorHandler = Box::new(move |err: Error| {
> @@ -1518,8 +1513,21 @@ async fn restore(
> }
>
> if let Some(target) = target {
> + let decoder = if let Some(payload_archive_name) = payload_archive_name {
> + let payload_reader = get_buffered_pxar_reader(
> + &payload_archive_name,
> + client.clone(),
> + &manifest,
> + crypt_config.clone(),
> + )
> + .await?;
> + pxar::decoder::Decoder::from_std(reader, Some(payload_reader))?
> + } else {
> + pxar::decoder::Decoder::from_std(reader, None)?
> + };
> +
> pbs_client::pxar::extract_archive(
> - pxar::decoder::Decoder::from_std(reader, None)?,
> + decoder,
> Path::new(target),
> feature_flags,
> |path| {
> @@ -1529,6 +1537,9 @@ async fn restore(
> )
> .map_err(|err| format_err!("error extracting archive - {:#}", err))?;
> } else {
> + if archive_name.ends_with(".mpxar.didx") || archive_name.ends_with(".ppxar.didx") {
> + bail!("unable to pipe split archive");
> + }
> let mut writer = std::fs::OpenOptions::new()
> .write(true)
> .open("/dev/stdout")
More information about the pbs-devel
mailing list