public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Dietmar Maurer <dietmar@proxmox.com>
To: Proxmox Backup Server development discussion
	<pbs-devel@lists.proxmox.com>,
	 Dominik Csapak <d.csapak@proxmox.com>
Subject: [pbs-devel] applied: [PATCH proxmox-backup 1/2] api2/tape/restore: restore_chunk_archive: only ignore tape related errors
Date: Wed, 14 Apr 2021 10:42:17 +0200 (CEST)	[thread overview]
Message-ID: <567501781.2857.1618389737844@webmail.proxmox.com> (raw)

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@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@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@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel




                 reply	other threads:[~2021-04-14  8:42 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=567501781.2857.1618389737844@webmail.proxmox.com \
    --to=dietmar@proxmox.com \
    --cc=d.csapak@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal