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:
parent
e0222ce83c
commit
1958d9f483
@ -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() {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user