tape: use SnapshotReader to create snapshot archive
This commit is contained in:
parent
d108b610fd
commit
b9ee86efe1
|
@ -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.
|
||||
|
|
|
@ -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()?;
|
||||
|
|
Loading…
Reference in New Issue