fix #5229: tape: remove max sequence number limit

The idea was to limit the number of tapes in a media set, but this was
not enforced when adding a medium to a media set, only on read/parsing
the inventory. With that, it is possible to create media sets greater
than the limit which in turn blocks access to most functions via
api/cli/gui due to the check.

Instead of enforcing an arbitrary limit, simply warn on creation when
the media-set is very large (20).

To restore the whole media set, the time taken would still be at least 38
hours for LTO-4 and 250 hours for LTO-9.

We already have a section in the docs where we tell about the
disadvantages of large media sets.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2024-02-12 13:27:34 +01:00 committed by Dietmar Maurer
parent e0222ce83c
commit 1958d9f483
2 changed files with 12 additions and 10 deletions

View File

@ -13,8 +13,6 @@ pub struct MediaSet {
}
impl MediaSet {
pub const MEDIA_SET_MAX_SEQ_NR: u64 = 100;
#[allow(clippy::new_without_default)]
pub fn new() -> Self {
let uuid = Uuid::generate();
@ -41,14 +39,6 @@ impl MediaSet {
}
pub fn insert_media(&mut self, uuid: Uuid, seq_nr: u64) -> Result<(), Error> {
if seq_nr > Self::MEDIA_SET_MAX_SEQ_NR {
bail!(
"media set sequence number to large in media set {} ({} > {})",
self.uuid.to_string(),
seq_nr,
Self::MEDIA_SET_MAX_SEQ_NR
);
}
let seq_nr = seq_nr as usize;
if self.media_list.len() > seq_nr {
if self.media_list[seq_nr].is_some() {

View File

@ -32,6 +32,10 @@ use super::file_formats::{
PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0, PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_1,
};
// Warn when the sequence number reaches this limit, as large
// media sets are error prone and take a very long time to restore from.
const MEDIA_SET_SEQ_NR_WARN_LIMIT: u64 = 20;
struct PoolWriterState {
drive: Box<dyn TapeDriver>,
// Media Uuid from loaded media
@ -272,6 +276,14 @@ impl PoolWriter {
let media_set = media.media_set_label().unwrap();
if is_new_media && media_set.seq_nr >= MEDIA_SET_SEQ_NR_WARN_LIMIT {
task_warn!(
worker,
"large media-set detected ({}), consider using a different allocation policy",
media_set.seq_nr
);
}
drive.assert_encryption_mode(media_set.encryption_key_fingerprint.is_some())?;
self.status = Some(PoolWriterState {