all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Hannes Laimer <h.laimer@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup] datastore: simplify update-datastore-cache socket command
Date: Tue,  2 Jul 2024 14:29:43 +0200	[thread overview]
Message-ID: <20240702122943.88310-1-h.laimer@proxmox.com> (raw)

... 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
(last) task finishes.

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
 pbs-datastore/src/datastore.rs  | 26 ++++++++++----------------
 src/api2/config/datastore.rs    |  7 +++----
 src/bin/proxmox-backup-proxy.rs |  6 +++---
 3 files changed, 16 insertions(+), 23 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 02887b86..5cc3dfb6 100644
--- a/src/api2/config/datastore.rs
+++ b/src/api2/config/datastore.rs
@@ -398,16 +398,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)?;
     }
 
@@ -422,7 +421,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)
diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs
index 15444685..4c48defc 100644
--- a/src/bin/proxmox-backup-proxy.rs
+++ b/src/bin/proxmox-backup-proxy.rs
@@ -290,11 +290,11 @@ async fn run() -> Result<(), Error> {
         Ok(Value::Null)
     })?;
 
-    // clear cache entry for datastore that is in a specific maintenance mode
+    // clear cache entry for datastore
     command_sock.register_command("update-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



_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


             reply	other threads:[~2024-07-02 12:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-02 12:29 Hannes Laimer [this message]
2024-08-05 13:19 ` Hannes Laimer
2024-08-07  9:41   ` Lukas Wagner
2024-08-07 12:11     ` Hannes Laimer
2024-08-07 12:19       ` Lukas Wagner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240702122943.88310-1-h.laimer@proxmox.com \
    --to=h.laimer@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal