all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH proxmox-backup] pbs-datastore: lookup: don't create new ChunkStore on datastore reopen
@ 2022-06-02 14:27 Dominik Csapak
  2022-06-03  9:25 ` [pbs-devel] applied: " Thomas Lamprecht
  0 siblings, 1 reply; 2+ messages in thread
From: Dominik Csapak @ 2022-06-02 14:27 UTC (permalink / raw)
  To: pbs-devel

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





^ permalink raw reply	[flat|nested] 2+ messages in thread

* [pbs-devel] applied: [PATCH proxmox-backup] pbs-datastore: lookup: don't create new ChunkStore on datastore reopen
  2022-06-02 14:27 [pbs-devel] [PATCH proxmox-backup] pbs-datastore: lookup: don't create new ChunkStore on datastore reopen Dominik Csapak
@ 2022-06-03  9:25 ` Thomas Lamprecht
  0 siblings, 0 replies; 2+ messages in thread
From: Thomas Lamprecht @ 2022-06-03  9:25 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Dominik Csapak

Am 02/06/2022 um 16:27 schrieb Dominik Csapak:
> 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(-)
> 
>

forgot to reply yesterday: applied and backported, thanks!




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-06-03  9:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-02 14:27 [pbs-devel] [PATCH proxmox-backup] pbs-datastore: lookup: don't create new ChunkStore on datastore reopen Dominik Csapak
2022-06-03  9:25 ` [pbs-devel] applied: " Thomas Lamprecht

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