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 <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2021-04-13 12:58:58 +02:00 committed by Dietmar Maurer
parent 6dde015f8c
commit 1dd1c9eb5c

View File

@ -597,54 +597,53 @@ fn restore_chunk_archive<'a>(
let mut decoder = ChunkArchiveDecoder::new(reader); let mut decoder = ChunkArchiveDecoder::new(reader);
let result: Result<_, Error> = proxmox::try_block!({ loop {
while let Some((digest, blob)) = decoder.next_chunk()? { 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()?; // check if this stream is marked incomplete
if let Ok(true) = reader.is_incomplete() {
if let Some(datastore) = datastore { return Ok(Some(chunks));
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 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 { } 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); } else if verbose {
} task_log!(worker, "Found chunk: {}", proxmox::tools::digest_to_hex(&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)
} }
chunks.push(digest);
} }
Ok(Some(chunks))
} }
fn restore_snapshot_archive<'a>( fn restore_snapshot_archive<'a>(