From fd1f8413f7f79a309b044f68ecd9ead8f3eaf6da Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Mon, 25 Nov 2024 17:21:50 +0100 Subject: [PATCH] maintenance: add 'Unmount' maintenance type Signed-off-by: Dietmar Maurer Signed-off-by: Hannes Laimer --- pbs-api-types/src/datastore.rs | 3 +++ pbs-api-types/src/maintenance.rs | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 8827604c..9bcec719 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -401,6 +401,9 @@ impl DataStoreConfig { match current_type { Some(MaintenanceType::ReadOnly) => { /* always OK */ } Some(MaintenanceType::Offline) => { /* always OK */ } + Some(MaintenanceType::Unmount) => { + bail!("datastore is being unmounted"); + } Some(MaintenanceType::Delete) => { match new_type { Some(MaintenanceType::Delete) => { /* allow to delete a deleted storage */ } diff --git a/pbs-api-types/src/maintenance.rs b/pbs-api-types/src/maintenance.rs index a7b8b078..3c9aa819 100644 --- a/pbs-api-types/src/maintenance.rs +++ b/pbs-api-types/src/maintenance.rs @@ -38,7 +38,6 @@ pub enum Operation { /// Maintenance type. pub enum MaintenanceType { // TODO: - // - Add "unmounting" once we got pluggable datastores // - Add "GarbageCollection" or "DeleteOnly" as type and track GC (or all deletes) as separate // operation, so that one can enable a mode where nothing new can be added but stuff can be // cleaned @@ -48,6 +47,8 @@ pub enum MaintenanceType { Offline, /// The datastore is being deleted. Delete, + /// The (removable) datastore is being unmounted. + Unmount, } serde_plain::derive_display_from_serialize!(MaintenanceType); serde_plain::derive_fromstr_from_deserialize!(MaintenanceType); @@ -79,7 +80,9 @@ pub struct MaintenanceMode { impl MaintenanceMode { /// Used for deciding whether the datastore is cleared from the internal cache pub fn clear_from_cache(&self) -> bool { - self.ty == MaintenanceType::Offline || self.ty == MaintenanceType::Delete + self.ty == MaintenanceType::Offline + || self.ty == MaintenanceType::Delete + || self.ty == MaintenanceType::Unmount } pub fn check(&self, operation: Option) -> Result<(), Error> { @@ -93,6 +96,8 @@ impl MaintenanceMode { if let Some(Operation::Lookup) = operation { return Ok(()); + } else if self.ty == MaintenanceType::Unmount { + bail!("datastore is being unmounted"); } else if self.ty == MaintenanceType::Offline { bail!("offline maintenance mode: {}", message); } else if self.ty == MaintenanceType::ReadOnly {