[pbs-devel] [PATCH proxmox-backup v2 2/2] api2/tape/restore: use file offset to compensate for some tape drives
Dominik Csapak
d.csapak at proxmox.com
Mon Jun 21 10:18:22 CEST 2021
by calculating the offset after moving to a file and add the offset
to the drive
assuming the offset is static (e.g. always 1), we only have to do
that for the first file, all others should be correct then
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes from v1:
* rename to locate_offset
src/api2/tape/restore.rs | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs
index 14e20ee4..fcaa4428 100644
--- a/src/api2/tape/restore.rs
+++ b/src/api2/tape/restore.rs
@@ -685,6 +685,32 @@ fn get_media_set_catalog(
Ok(catalog)
}
+fn compensate_locate_offset(
+ worker: &WorkerTask,
+ target_file: u64,
+ real_file: u64,
+ drive: &mut Box<dyn TapeDriver>,
+) -> Result<(), Error> {
+ task_log!(worker, "landed on wrong file, adding offset and try again");
+ let offset: i64 =
+ i64::try_from((target_file as i128) - (real_file as i128)).map_err(|err| {
+ format_err!(
+ "offset between {} and {} invalid: {}",
+ target_file,
+ real_file,
+ err
+ )
+ })?;
+ drive.set_locate_offset(offset);
+ drive.move_to_file(target_file)?;
+ let current_file = drive.current_file_number()?;
+ if current_file != target_file {
+ bail!("Compensating locate_file with offset did not work, aborting...");
+ }
+
+ Ok(())
+}
+
fn restore_snapshots_to_tmpdir(
worker: Arc<WorkerTask>,
path: &PathBuf,
@@ -727,6 +753,10 @@ fn restore_snapshots_to_tmpdir(
drive.move_to_file(*file_num)?;
let current_file_number = drive.current_file_number()?;
task_log!(worker, "now at file {}", current_file_number);
+ if current_file_number != *file_num {
+ compensate_locate_offset(&worker, *file_num, current_file_number, &mut drive)?;
+ task_log!(worker, "now at file {}", current_file_number);
+ }
}
let mut reader = drive.read_next_file()?;
@@ -806,6 +836,10 @@ fn restore_file_chunk_map(
drive.move_to_file(*nr)?;
let current_file_number = drive.current_file_number()?;
task_log!(worker, "now at file {}", current_file_number);
+ if current_file_number != *nr {
+ compensate_locate_offset(&worker, *nr, current_file_number, drive)?;
+ task_log!(worker, "now at file {}", current_file_number);
+ }
}
let mut reader = drive.read_next_file()?;
let header: MediaContentHeader = unsafe { reader.read_le_value()? };
--
2.20.1
More information about the pbs-devel
mailing list