From 09c33fd0a4a91cacad7f4a3bc277c288d7cb63e4 Mon Sep 17 00:00:00 2001 From: Alex Chi Z Date: Fri, 21 Jul 2023 15:23:28 -0400 Subject: [PATCH] fix lock order, take snapshot after taking lock Signed-off-by: Alex Chi Z --- pageserver/src/tenant/timeline/layer_manager.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pageserver/src/tenant/timeline/layer_manager.rs b/pageserver/src/tenant/timeline/layer_manager.rs index 375455ca01..6999678bae 100644 --- a/pageserver/src/tenant/timeline/layer_manager.rs +++ b/pageserver/src/tenant/timeline/layer_manager.rs @@ -68,23 +68,31 @@ impl LayerManager { } } + /// Take the snapshot of the layer map and return a read guard. The read guard will prevent + /// the layer map from being modified. pub async fn read(&self) -> LayerManagerReadGuard { + // take the lock before taking snapshot + let pseudo_lock = self.pseudo_lock.clone().read_owned().await; LayerManagerReadGuard { snapshot: LayerSnapshot { layer_map: self.layer_map.load_full(), layer_fmgr: Arc::clone(&self.layer_fmgr), }, - pseudo_lock: self.pseudo_lock.clone().read_owned().await, + pseudo_lock, } } + /// Take the snapshot of the layer map and return a write guard. The read guard will prevent + /// the layer map from being read. pub async fn write(self: &Arc) -> LayerManagerWriteGuard { + // take the lock before taking snapshot + let pseudo_lock = self.pseudo_lock.clone().write_owned().await; LayerManagerWriteGuard { snapshot: LayerSnapshot { layer_map: self.layer_map.load_full(), layer_fmgr: Arc::clone(&self.layer_fmgr), }, - pseudo_lock: self.pseudo_lock.clone().write_owned().await, + pseudo_lock, layer_manager: self.clone(), } }