tape: bump catalog/snapshot archive magic
the snapshot string format is not backwards compatible since it now has an in-line namespace prefix. it's possible to select which magic to use at the start of the backup, since a tape backup job knows whether it operates on non-root namespaces up-front. the MediaCatalog itself also has a similar incompatible change, but there - updating existing catalogs in-place - not knowing what the catalog will contain in the future when initially creating/opening it makes bumping the magic there harder. since the tape contents are sufficiently guarded by the other two bumps, ignoring the backwards-incomaptible change of the on-disk catalogs seems like an okay tradeoff. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
committed by
Dominik Csapak
parent
07ffb86451
commit
707c48ad46
@ -10,9 +10,9 @@ use proxmox_schema::api;
|
||||
use proxmox_sys::{task_log, task_warn, WorkerTaskContext};
|
||||
|
||||
use pbs_api_types::{
|
||||
Authid, GroupFilter, MediaPoolConfig, Operation, TapeBackupJobConfig, TapeBackupJobSetup,
|
||||
TapeBackupJobStatus, Userid, JOB_ID_SCHEMA, PRIV_DATASTORE_READ, PRIV_TAPE_AUDIT,
|
||||
PRIV_TAPE_WRITE, UPID_SCHEMA,
|
||||
Authid, BackupNamespace, GroupFilter, MediaPoolConfig, Operation, TapeBackupJobConfig,
|
||||
TapeBackupJobSetup, TapeBackupJobStatus, Userid, JOB_ID_SCHEMA, PRIV_DATASTORE_READ,
|
||||
PRIV_TAPE_AUDIT, PRIV_TAPE_WRITE, UPID_SCHEMA,
|
||||
};
|
||||
|
||||
use pbs_config::CachedUserInfo;
|
||||
@ -404,18 +404,15 @@ fn backup_worker(
|
||||
task_log!(worker, "update media online status");
|
||||
let changer_name = update_media_online_status(&setup.drive)?;
|
||||
|
||||
let root_namespace = setup.ns.clone().unwrap_or_default();
|
||||
let ns_magic = !root_namespace.is_root() || setup.recursion_depth != Some(0);
|
||||
|
||||
let pool = MediaPool::with_config(status_path, pool_config, changer_name, false)?;
|
||||
|
||||
let mut pool_writer = PoolWriter::new(pool, &setup.drive, worker, email, force_media_set)?;
|
||||
|
||||
// FIXME: Namespaces! Probably just recurse for now? Not sure about the usage here...
|
||||
let mut pool_writer =
|
||||
PoolWriter::new(pool, &setup.drive, worker, email, force_media_set, ns_magic)?;
|
||||
|
||||
let mut group_list = Vec::new();
|
||||
let root_namespace = if let Some(ns) = &setup.ns {
|
||||
ns.clone()
|
||||
} else {
|
||||
Default::default()
|
||||
};
|
||||
let namespaces =
|
||||
datastore.recursive_iter_backup_ns_ok(root_namespace, setup.recursion_depth)?;
|
||||
for ns in namespaces {
|
||||
|
@ -39,10 +39,11 @@ use crate::{
|
||||
drive::{lock_tape_device, request_and_load_media, set_tape_device_state, TapeDriver},
|
||||
file_formats::{
|
||||
CatalogArchiveHeader, ChunkArchiveDecoder, ChunkArchiveHeader, SnapshotArchiveHeader,
|
||||
PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0, PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_0,
|
||||
PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_1, PROXMOX_BACKUP_MEDIA_LABEL_MAGIC_1_0,
|
||||
PROXMOX_BACKUP_MEDIA_SET_LABEL_MAGIC_1_0, PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_0,
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1,
|
||||
PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0, PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_1,
|
||||
PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_0, PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_1,
|
||||
PROXMOX_BACKUP_MEDIA_LABEL_MAGIC_1_0, PROXMOX_BACKUP_MEDIA_SET_LABEL_MAGIC_1_0,
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_0, PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1,
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_2,
|
||||
},
|
||||
lock_media_set, Inventory, MediaCatalog, MediaId, MediaSet, MediaSetCatalog,
|
||||
TAPE_STATUS_DIR,
|
||||
@ -1096,7 +1097,8 @@ fn restore_snapshots_to_tmpdir(
|
||||
}
|
||||
|
||||
match header.content_magic {
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1 => {
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1
|
||||
| PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_2 => {
|
||||
let header_data = reader.read_exact_allocated(header.size as usize)?;
|
||||
|
||||
let archive_header: SnapshotArchiveHeader = serde_json::from_slice(&header_data)
|
||||
@ -1440,7 +1442,7 @@ fn restore_archive<'a>(
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_0 => {
|
||||
bail!("unexpected snapshot archive version (v1.0)");
|
||||
}
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1 => {
|
||||
PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1 | PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_2 => {
|
||||
let header_data = reader.read_exact_allocated(header.size as usize)?;
|
||||
|
||||
let archive_header: SnapshotArchiveHeader = serde_json::from_slice(&header_data)
|
||||
@ -1591,7 +1593,7 @@ fn restore_archive<'a>(
|
||||
|
||||
reader.skip_data()?; // read all data
|
||||
}
|
||||
PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0 => {
|
||||
PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0 | PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_1 => {
|
||||
let header_data = reader.read_exact_allocated(header.size as usize)?;
|
||||
|
||||
let archive_header: CatalogArchiveHeader = serde_json::from_slice(&header_data)
|
||||
@ -1937,7 +1939,9 @@ pub fn fast_catalog_restore(
|
||||
bail!("missing MediaContentHeader");
|
||||
}
|
||||
|
||||
if header.content_magic == PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0 {
|
||||
if header.content_magic == PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0
|
||||
|| header.content_magic == PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_1
|
||||
{
|
||||
task_log!(worker, "found catalog at pos {}", current_file_number);
|
||||
|
||||
let header_data = reader.read_exact_allocated(header.size as usize)?;
|
||||
|
Reference in New Issue
Block a user