From e8ae409bdc95ae41a8d4551063ab7c790078139f 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 17b1d55c1f..6bd7b58f6c 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -3013,7 +3013,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(); @@ -3134,7 +3133,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?