[pbs-devel] applied: [PATCH proxmox-backup 1/2] api2/tape/restore: restore_chunk_archive: only ignore tape related errors

Dietmar Maurer dietmar at proxmox.com
Wed Apr 14 10:42:17 CEST 2021


I don't think this fixes any bugs, but the code is cleaner and more obvious, so
I applied it anyways...

> On 04/13/2021 12:58 PM Dominik Csapak <d.csapak at proxmox.com> wrote:
> 
>  
> when we get an error from the tape, we possibly want to ignore it,
> i.e. when the file was incomplete, but we still want to error
> out if the error came from e.g, the datastore, so we have to move
> the error checking code to the 'next_chunk' call
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>  src/api2/tape/restore.rs | 77 ++++++++++++++++++++--------------------
>  1 file changed, 38 insertions(+), 39 deletions(-)
> 
> diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs
> index afce3449..9f79f06f 100644
> --- a/src/api2/tape/restore.rs
> +++ b/src/api2/tape/restore.rs
> @@ -597,54 +597,53 @@ fn restore_chunk_archive<'a>(
>  
>      let mut decoder = ChunkArchiveDecoder::new(reader);
>  
> -    let result: Result<_, Error> = proxmox::try_block!({
> -        while let Some((digest, blob)) = decoder.next_chunk()? {
> -
> -            worker.check_abort()?;
> -
> -            if let Some(datastore) = datastore {
> -                let chunk_exists = datastore.cond_touch_chunk(&digest, false)?;
> -                if !chunk_exists {
> -                    blob.verify_crc()?;
> +    loop {
> +        let (digest, blob) = match decoder.next_chunk() {
> +            Ok(Some((digest, blob))) => (digest, blob),
> +            Ok(None) => break,
> +            Err(err) => {
> +                let reader = decoder.reader();
> +
> +                // check if this stream is marked incomplete
> +                if let Ok(true) = reader.is_incomplete() {
> +                    return Ok(Some(chunks));
> +                }
>  
> -                    if blob.crypt_mode()? == CryptMode::None {
> -                        blob.decode(None, Some(&digest))?; // verify digest
> -                    }
> -                    if verbose {
> -                        task_log!(worker, "Insert chunk: {}", proxmox::tools::digest_to_hex(&digest));
> -                    }
> -                    datastore.insert_chunk(&blob, &digest)?;
> -                } else if verbose {
> -                    task_log!(worker, "Found existing chunk: {}", proxmox::tools::digest_to_hex(&digest));
> +                // check if this is an aborted stream without end marker
> +                if let Ok(false) = reader.has_end_marker() {
> +                    worker.log("missing stream end marker".to_string());
> +                    return Ok(None);
>                  }
> -            } else if verbose {
> -                task_log!(worker, "Found chunk: {}", proxmox::tools::digest_to_hex(&digest));
> +
> +                // else the archive is corrupt
> +                return Err(err);
>              }
> -            chunks.push(digest);
> -        }
> -        Ok(())
> -    });
> +        };
>  
> -    match result {
> -        Ok(()) => Ok(Some(chunks)),
> -        Err(err) => {
> -            let reader = decoder.reader();
> +        worker.check_abort()?;
>  
> -            // check if this stream is marked incomplete
> -            if let Ok(true) = reader.is_incomplete() {
> -                return Ok(Some(chunks));
> -            }
> +        if let Some(datastore) = datastore {
> +            let chunk_exists = datastore.cond_touch_chunk(&digest, false)?;
> +            if !chunk_exists {
> +                blob.verify_crc()?;
>  
> -            // check if this is an aborted stream without end marker
> -            if let Ok(false) = reader.has_end_marker() {
> -                worker.log("missing stream end marker".to_string());
> -                return Ok(None);
> +                if blob.crypt_mode()? == CryptMode::None {
> +                    blob.decode(None, Some(&digest))?; // verify digest
> +                }
> +                if verbose {
> +                    task_log!(worker, "Insert chunk: {}", proxmox::tools::digest_to_hex(&digest));
> +                }
> +                datastore.insert_chunk(&blob, &digest)?;
> +            } else if verbose {
> +                task_log!(worker, "Found existing chunk: {}", proxmox::tools::digest_to_hex(&digest));
>              }
> -
> -            // else the archive is corrupt
> -            Err(err)
> +        } else if verbose {
> +            task_log!(worker, "Found chunk: {}", proxmox::tools::digest_to_hex(&digest));
>          }
> +        chunks.push(digest);
>      }
> +
> +    Ok(Some(chunks))
>  }
>  
>  fn restore_snapshot_archive<'a>(
> -- 
> 2.20.1
> 
> 
> 
> _______________________________________________
> 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