]> git.proxmox.com Git - proxmox-backup.git/blobdiff - src/api2/tape/restore.rs
bump version to 1.1.0-1
[proxmox-backup.git] / src / api2 / tape / restore.rs
index 78aac73c6a6fc619bcb5d0358873d05177e4cfdd..28757ab413cd09eb4948d04a9e7bbe1f69a61b45 100644 (file)
@@ -70,6 +70,7 @@ use crate::{
     tape::{
         TAPE_STATUS_DIR,
         TapeRead,
+        BlockReadError,
         MediaId,
         MediaSet,
         MediaCatalog,
@@ -418,12 +419,19 @@ pub fn restore_media(
 
     loop {
         let current_file_number = drive.current_file_number()?;
-        let reader = match drive.read_next_file()? {
-            None => {
+        let reader = match drive.read_next_file() {
+            Err(BlockReadError::EndOfFile) => {
+                task_log!(worker, "skip unexpected filemark at pos {}", current_file_number);
+                continue;
+            }
+            Err(BlockReadError::EndOfStream) => {
                 task_log!(worker, "detected EOT after {} files", current_file_number);
                 break;
             }
-            Some(reader) => reader,
+            Err(BlockReadError::Error(err)) => {
+                return Err(err.into());
+            }
+            Ok(reader) => reader,
         };
 
         restore_archive(worker, reader, current_file_number, target, &mut catalog, verbose)?;
@@ -517,7 +525,7 @@ fn restore_archive<'a>(
                 }
             }
 
-            reader.skip_to_end()?; // read all data
+            reader.skip_data()?; // read all data
             if let Ok(false) = reader.is_incomplete() {
                 catalog.register_snapshot(Uuid::from(header.uuid), current_file_number, &datastore_name, &snapshot)?;
                 catalog.commit_if_large()?;
@@ -558,7 +566,7 @@ fn restore_archive<'a>(
                 task_log!(worker, "skipping...");
             }
 
-            reader.skip_to_end()?; // read all data
+            reader.skip_data()?; // read all data
         }
         PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0 => {
             let header_data = reader.read_exact_allocated(header.size as usize)?;
@@ -568,7 +576,7 @@ fn restore_archive<'a>(
 
             task_log!(worker, "File {}: skip catalog '{}'", current_file_number, archive_header.uuid);
 
-            reader.skip_to_end()?; // read all data
+            reader.skip_data()?; // read all data
         }
          _ =>  bail!("unknown content magic {:?}", header.content_magic),
     }
@@ -811,12 +819,19 @@ pub fn fast_catalog_restore(
         let current_file_number = drive.current_file_number()?;
 
         { // limit reader scope
-            let mut reader = match drive.read_next_file()? {
-                None => {
+            let mut reader = match drive.read_next_file() {
+                Err(BlockReadError::EndOfFile) => {
+                    task_log!(worker, "skip unexpected filemark at pos {}", current_file_number);
+                    continue;
+                }
+                Err(BlockReadError::EndOfStream) => {
                     task_log!(worker, "detected EOT after {} files", current_file_number);
                     break;
                 }
-                Some(reader) => reader,
+                Err(BlockReadError::Error(err)) => {
+                    return Err(err.into());
+                }
+                Ok(reader) => reader,
             };
 
             let header: MediaContentHeader = unsafe { reader.read_le_value()? };
@@ -834,7 +849,7 @@ pub fn fast_catalog_restore(
 
                 if &archive_header.media_set_uuid != media_set.uuid() {
                     task_log!(worker, "skipping unrelated catalog at pos {}", current_file_number);
-                    reader.skip_to_end()?; // read all data
+                    reader.skip_data()?; // read all data
                     continue;
                 }
 
@@ -853,7 +868,7 @@ pub fn fast_catalog_restore(
 
                 if !wanted {
                     task_log!(worker, "skip catalog because media '{}' not inventarized", catalog_uuid);
-                    reader.skip_to_end()?; // read all data
+                    reader.skip_data()?; // read all data
                     continue;
                 }
 
@@ -863,7 +878,7 @@ pub fn fast_catalog_restore(
                     // only restore if catalog does not exist
                     if MediaCatalog::exists(status_path, catalog_uuid) {
                         task_log!(worker, "catalog for media '{}' already exists", catalog_uuid);
-                        reader.skip_to_end()?; // read all data
+                        reader.skip_data()?; // read all data
                         continue;
                     }
                 }