tape: use SnapshotReader to create snapshot archive

This commit is contained in:
Dietmar Maurer 2020-12-18 12:10:31 +01:00
parent d108b610fd
commit b9ee86efe1
2 changed files with 17 additions and 11 deletions

View File

@ -25,6 +25,7 @@ use crate::{
///
/// This make it easy to iterate over all used chunks and files.
pub struct SnapshotReader {
snapshot: BackupDir,
file_list: Vec<String>,
locked_dir: Dir,
}
@ -59,7 +60,12 @@ impl SnapshotReader {
file_list.push(CLIENT_LOG_BLOB_NAME.to_string());
}
Ok(Self { file_list, locked_dir })
Ok(Self { snapshot, file_list, locked_dir })
}
/// Return the snapshot directory
pub fn snapshot(&self) -> &BackupDir {
&self.snapshot
}
/// Returns the list of files the snapshot refers to.

View File

@ -1,7 +1,6 @@
use std::io::{Read, Write};
use std::pin::Pin;
use std::task::{Context, Poll};
use std::path::{Path, PathBuf};
use proxmox::{
sys::error::SysError,
@ -10,6 +9,7 @@ use proxmox::{
use crate::tape::{
TapeWrite,
SnapshotReader,
file_formats::{
PROXMOX_TAPE_BLOCK_SIZE,
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_0,
@ -27,11 +27,12 @@ use crate::tape::{
/// backup task must rewrite the whole file on the next media).
pub fn tape_write_snapshot_archive<'a>(
writer: &mut (dyn TapeWrite + 'a),
snapshot: &str,
base_path: &Path,
file_list: &[String],
snapshot_reader: &SnapshotReader,
) -> Result<Option<Uuid>, std::io::Error> {
let snapshot = snapshot_reader.snapshot().to_string();
let file_list = snapshot_reader.file_list();
let header_data = snapshot.as_bytes().to_vec();
let header = MediaContentHeader::new(
@ -52,17 +53,16 @@ pub fn tape_write_snapshot_archive<'a>(
let mut encoder = pxar::encoder::sync::Encoder::new(PxarTapeWriter::new(writer), &root_metadata)?;
for filename in file_list.iter() {
let mut path = PathBuf::from(base_path);
path.push(filename);
let mut file = std::fs::File::open(&path)?;
let mut file = snapshot_reader.open_file(filename)
.map_err(|err| proxmox::io_format_err!("open file '{}' failed - {}", filename, err))?;
let metadata = file.metadata()?;
let file_size = metadata.len();
let metadata: pxar::Metadata = metadata.into();
if !metadata.is_regular_file() {
proxmox::io_bail!("path {:?} is not a regular file", path);
proxmox::io_bail!("file '{}' is not a regular file", filename);
}
let mut remaining = file_size;
@ -70,14 +70,14 @@ pub fn tape_write_snapshot_archive<'a>(
while remaining != 0 {
let got = file.read(&mut file_copy_buffer[..])?;
if got as u64 > remaining {
proxmox::io_bail!("file {:?} changed while reading", path);
proxmox::io_bail!("file '{}' changed while reading", filename);
}
out.write_all(&file_copy_buffer[..got])?;
remaining -= got as u64;
}
if remaining > 0 {
proxmox::io_bail!("file {:?} shrunk while reading", path);
proxmox::io_bail!("file '{}' shrunk while reading", filename);
}
}
encoder.finish()?;