From a1ae23b827ad2de80fda216f732ee0e7aef18253 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Wed, 10 May 2023 19:43:50 +0200 Subject: [PATCH] controversial but necessary: keep holding layer map lock inside compact_level0_phase1 Without this, the seocnd read().unwrap() becomes an await point, which makes the future not-Send, but, we require it to be Send because it runs inside task_mgr::spawn, which requires the Fut's to be Send --- pageserver/src/tenant/timeline.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index ba0cd29361..d0d915adb4 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -3167,7 +3167,6 @@ impl Timeline { ) -> Result { let layers = self.layers.read().unwrap(); let mut level0_deltas = layers.get_level0_deltas()?; - drop(layers); // Only compact if enough layers have accumulated. let threshold = self.get_compaction_threshold(); @@ -3288,7 +3287,6 @@ impl Timeline { // Determine N largest holes where N is number of compacted layers. let max_holes = deltas_to_compact.len(); let last_record_lsn = self.get_last_record_lsn(); - let layers = self.layers.read().unwrap(); // Is'n it better to hold original layers lock till here? let min_hole_range = (target_file_size / page_cache::PAGE_SZ as u64) as i128; let min_hole_coverage_size = 3; // TODO: something more flexible?