all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup] pbs-datastore: lookup: don't create new ChunkStore on datastore reopen
Date: Thu,  2 Jun 2022 16:27:44 +0200	[thread overview]
Message-ID: <20220602142744.548757-1-d.csapak@proxmox.com> (raw)

When re-opening a datastore, e.g. because the config changed or the
last re-open was >60s ago, the chunkstore was also re-opened. Opening a
ChunkStore creates a new ProcessLocker, so re-opening a datastore had the
unintentional side-effect of potentially discarding the existing
ProcessLocker. Any contained shared locks are lost in turn.

To fix this, reuse an old, existing ChunkStore (and its ProcessLocker)
on the re-opened datastore, since only the datastore config should be
reloaded, and the ChunkStore path is not updatable over our API anyway.
If a user manually edited the path in the config, a daemon restart must
happen for this change to take effect.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 pbs-datastore/src/datastore.rs | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs
index ef21cad0..f4bc45ea 100644
--- a/pbs-datastore/src/datastore.rs
+++ b/pbs-datastore/src/datastore.rs
@@ -145,16 +145,20 @@ impl DataStore {
         let mut map = DATASTORE_MAP.lock().unwrap();
         let entry = map.get(name);
 
-        if let Some(datastore) = &entry {
+        // reuse chunk_store, we only want to reload the datastore config, and the path
+        // is normally not editable and requires a restart of the proxy
+        let chunk_store = if let Some(datastore) = &entry {
             if datastore.last_generation == generation && now < (datastore.last_update + 60) {
                 return Ok(Arc::new(Self {
                     inner: Arc::clone(datastore),
                     operation,
                 }));
             }
-        }
+            Arc::clone(&datastore.chunk_store)
+        } else {
+            Arc::new(ChunkStore::open(name, &config.path)?)
+        };
 
-        let chunk_store = ChunkStore::open(name, &config.path)?;
         let datastore = DataStore::with_store_and_config(chunk_store, config, generation, now)?;
 
         let datastore = Arc::new(datastore);
@@ -198,7 +202,12 @@ impl DataStore {
         let name = config.name.clone();
 
         let chunk_store = ChunkStore::open(&name, &config.path)?;
-        let inner = Arc::new(Self::with_store_and_config(chunk_store, config, 0, 0)?);
+        let inner = Arc::new(Self::with_store_and_config(
+            Arc::new(chunk_store),
+            config,
+            0,
+            0,
+        )?);
 
         if let Some(operation) = operation {
             update_active_operations(&name, operation, 1)?;
@@ -208,7 +217,7 @@ impl DataStore {
     }
 
     fn with_store_and_config(
-        chunk_store: ChunkStore,
+        chunk_store: Arc<ChunkStore>,
         config: DataStoreConfig,
         last_generation: usize,
         last_update: i64,
@@ -235,7 +244,7 @@ impl DataStore {
         let chunk_order = tuning.chunk_order.unwrap_or(ChunkOrder::Inode);
 
         Ok(DataStoreImpl {
-            chunk_store: Arc::new(chunk_store),
+            chunk_store,
             gc_mutex: Mutex::new(()),
             last_gc_status: Mutex::new(gc_status),
             verify_new: config.verify_new.unwrap_or(false),
-- 
2.30.2





             reply	other threads:[~2022-06-02 14:27 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-02 14:27 Dominik Csapak [this message]
2022-06-03  9:25 ` [pbs-devel] applied: " Thomas Lamprecht

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=20220602142744.548757-1-d.csapak@proxmox.com \
    --to=d.csapak@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