[pbs-devel] [PATCH proxmox-backup v6 03/23] datastore: rename and simplify update-datastore-cache socket command

Hannes Laimer h.laimer at proxmox.com
Thu Apr 18 16:29:11 CEST 2024


... by always dropping the cache entry and not allowing it to be
re-added based on the maintenance mode. The check is only needed for
Lookup operations since lookups with those wouldn't fail based on
maintenance mode alone. Already running tasks won't be affected and
since they're the only ones holding a reference to a DataStore, it
and the file handles it holds will be dropped automatically once the
task finishes.

Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
---
 pbs-datastore/src/datastore.rs  | 26 ++++++++++----------------
 src/api2/config/datastore.rs    |  9 ++++-----
 src/bin/proxmox-backup-proxy.rs |  8 ++++----
 3 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs
index f95da761..e1028778 100644
--- a/pbs-datastore/src/datastore.rs
+++ b/pbs-datastore/src/datastore.rs
@@ -190,10 +190,15 @@ impl DataStore {
             )?)
         };
 
+        let is_offline = config
+            .get_maintenance_mode()
+            .map_or(false, |m| m.is_offline());
         let datastore = DataStore::with_store_and_config(chunk_store, config, Some(digest))?;
 
         let datastore = Arc::new(datastore);
-        datastore_cache.insert(name.to_string(), datastore.clone());
+        if !is_offline {
+            datastore_cache.insert(name.to_string(), datastore.clone());
+        }
 
         Ok(Arc::new(Self {
             inner: datastore,
@@ -211,21 +216,10 @@ impl DataStore {
         Ok(())
     }
 
-    /// trigger clearing cache entry based on maintenance mode. Entry will only
-    /// be cleared iff there is no other task running, if there is, the end of the
-    /// last running task will trigger the clearing of the cache entry.
-    pub fn update_datastore_cache(name: &str) -> Result<(), Error> {
-        let (config, _digest) = pbs_config::datastore::config()?;
-        let datastore: DataStoreConfig = config.lookup("datastore", name)?;
-        if datastore
-            .get_maintenance_mode()
-            .map_or(false, |m| m.is_offline())
-        {
-            // the datastore drop handler does the checking if tasks are running and clears the
-            // cache entry, so we just have to trigger it here
-            let _ = DataStore::lookup_datastore(name, Some(Operation::Lookup));
-        }
-
+    /// removes datastore from cache
+    pub fn drop_from_datastore_cache(name: &str) -> Result<(), Error> {
+        let mut datastore_cache = DATASTORE_MAP.lock().unwrap();
+        datastore_cache.remove(name);
         Ok(())
     }
 
diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs
index 87425ff5..af5f5429 100644
--- a/src/api2/config/datastore.rs
+++ b/src/api2/config/datastore.rs
@@ -389,16 +389,15 @@ pub fn update_datastore(
         data.tuning = update.tuning;
     }
 
-    let mut maintenance_mode_changed = false;
+    let mut drop_store_from_cache = false;
     if update.maintenance_mode.is_some() {
-        maintenance_mode_changed = data.maintenance_mode != update.maintenance_mode;
-
         let maintenance_mode = match update.maintenance_mode {
             Some(mode_str) => Some(MaintenanceMode::deserialize(
                 proxmox_schema::de::SchemaDeserializer::new(mode_str, &MaintenanceMode::API_SCHEMA),
             )?),
             None => None,
         };
+        drop_store_from_cache = maintenance_mode.as_ref().map_or(false, |m| m.is_offline());
         data.set_maintenance_mode(maintenance_mode)?;
     }
 
@@ -413,7 +412,7 @@ pub fn update_datastore(
     }
 
     // tell the proxy it might have to clear a cache entry
-    if maintenance_mode_changed {
+    if drop_store_from_cache {
         tokio::spawn(async move {
             if let Ok(proxy_pid) =
                 proxmox_rest_server::read_pid(pbs_buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)
@@ -422,7 +421,7 @@ pub fn update_datastore(
                 let _ = proxmox_rest_server::send_raw_command(
                     sock,
                     &format!(
-                        "{{\"command\":\"update-datastore-cache\",\"args\":\"{}\"}}\n",
+                        "{{\"command\":\"drop-from-datastore-cache\",\"args\":\"{}\"}}\n",
                         &name
                     ),
                 )
diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs
index f79ec2f5..073f85ac 100644
--- a/src/bin/proxmox-backup-proxy.rs
+++ b/src/bin/proxmox-backup-proxy.rs
@@ -289,11 +289,11 @@ async fn run() -> Result<(), Error> {
         Ok(Value::Null)
     })?;
 
-    // clear cache entry for datastore that is in a specific maintenance mode
-    command_sock.register_command("update-datastore-cache".to_string(), |value| {
+    // clear cache entry for datastore
+    command_sock.register_command("drop-from-datastore-cache".to_string(), |value| {
         if let Some(name) = value.and_then(Value::as_str) {
-            if let Err(err) = DataStore::update_datastore_cache(name) {
-                log::error!("could not trigger update datastore cache: {err}");
+            if let Err(err) = DataStore::drop_from_datastore_cache(name) {
+                log::error!("could not drop datastore from cache: {err}");
             }
         }
         Ok(Value::Null)
-- 
2.39.2





More information about the pbs-devel mailing list