tape: improve media status in list_media
This commit is contained in:
parent
b74a1daae9
commit
ab77d660cc
@ -121,11 +121,16 @@ pub async fn list_media(
|
||||
|
||||
let config: MediaPoolConfig = config.lookup("pool", pool_name)?;
|
||||
|
||||
let changer_name = None; // does not matter here
|
||||
let pool = MediaPool::with_config(status_path, &config, changer_name)?;
|
||||
let changer_name = None; // assume standalone drive
|
||||
let mut pool = MediaPool::with_config(status_path, &config, changer_name)?;
|
||||
|
||||
let current_time = proxmox::tools::time::epoch_i64();
|
||||
|
||||
// Call start_write_session, so that we show the same status a
|
||||
// backup job would see.
|
||||
pool.force_media_availability();
|
||||
pool.start_write_session(current_time)?;
|
||||
|
||||
for media in pool.list_media() {
|
||||
let expired = pool.media_is_expired(&media, current_time);
|
||||
|
||||
|
@ -46,6 +46,7 @@ pub struct MediaPool {
|
||||
retention: RetentionPolicy,
|
||||
|
||||
changer_name: Option<String>,
|
||||
force_media_availability: bool,
|
||||
|
||||
encrypt_fingerprint: Option<Fingerprint>,
|
||||
|
||||
@ -87,9 +88,17 @@ impl MediaPool {
|
||||
inventory,
|
||||
current_media_set,
|
||||
encrypt_fingerprint,
|
||||
force_media_availability: false,
|
||||
})
|
||||
}
|
||||
|
||||
/// Pretend all Online(x) and Offline media is available
|
||||
///
|
||||
/// Only media in Vault(y) is considered unavailable.
|
||||
pub fn force_media_availability(&mut self) {
|
||||
self.force_media_availability = true;
|
||||
}
|
||||
|
||||
/// Creates a new instance using the media pool configuration
|
||||
pub fn with_config(
|
||||
state_path: &Path,
|
||||
@ -218,6 +227,9 @@ impl MediaPool {
|
||||
///
|
||||
/// If not, starts a new media set. Also creates a new
|
||||
/// set if media_set_policy implies it.
|
||||
///
|
||||
/// Note: We also call this in list_media to compute correct media
|
||||
/// status, so this must not change persistent/saved state.
|
||||
pub fn start_write_session(&mut self, current_time: i64) -> Result<(), Error> {
|
||||
|
||||
let mut create_new_set = match self.current_set_usable() {
|
||||
@ -284,6 +296,9 @@ impl MediaPool {
|
||||
pub fn location_is_available(&self, location: &MediaLocation) -> bool {
|
||||
match location {
|
||||
MediaLocation::Online(name) => {
|
||||
if self.force_media_availability {
|
||||
true
|
||||
} else {
|
||||
if let Some(ref changer_name) = self.changer_name {
|
||||
name == changer_name
|
||||
} else {
|
||||
@ -291,10 +306,15 @@ impl MediaPool {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
MediaLocation::Offline => {
|
||||
if self.force_media_availability {
|
||||
true
|
||||
} else {
|
||||
// consider available for standalone drives
|
||||
self.changer_name.is_none()
|
||||
}
|
||||
}
|
||||
MediaLocation::Vault(_) => false,
|
||||
}
|
||||
}
|
||||
@ -500,6 +520,7 @@ impl MediaPool {
|
||||
_ => bail!("unable to use media set - wrong media status {:?}", media.status()),
|
||||
}
|
||||
}
|
||||
|
||||
Ok(last_is_writable)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user