From 1dd1c9eb5c2e9268af29f743d1f89ee736c9de44 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 13 Apr 2021 12:58:58 +0200 Subject: [PATCH] api2/tape/restore: restore_chunk_archive: only ignore tape related errors 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 --- src/api2/tape/restore.rs | 83 ++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 28757ab4..33176bd7 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()? { + loop { + let (digest, blob) = match decoder.next_chunk() { + Ok(Some((digest, blob))) => (digest, blob), + Ok(None) => break, + Err(err) => { + let reader = decoder.reader(); - worker.check_abort()?; - - if let Some(datastore) = datastore { - let chunk_exists = datastore.cond_touch_chunk(&digest, false)?; - if !chunk_exists { - blob.verify_crc()?; - - 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 stream is marked incomplete + if let Ok(true) = reader.is_incomplete() { + return Ok(Some(chunks)); } + + // 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 the archive is corrupt + return Err(err); + } + }; + + worker.check_abort()?; + + if let Some(datastore) = datastore { + let chunk_exists = datastore.cond_touch_chunk(&digest, false)?; + if !chunk_exists { + blob.verify_crc()?; + + 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 chunk: {}", proxmox::tools::digest_to_hex(&digest)); + task_log!(worker, "Found existing chunk: {}", proxmox::tools::digest_to_hex(&digest)); } - chunks.push(digest); - } - Ok(()) - }); - - match result { - Ok(()) => Ok(Some(chunks)), - Err(err) => { - let reader = decoder.reader(); - - // check if this stream is marked incomplete - if let Ok(true) = reader.is_incomplete() { - return Ok(Some(chunks)); - } - - // 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 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>(