From 44feda0061b27fe4a879150209263045c2d22bb6 Mon Sep 17 00:00:00 2001 From: Bojan Serafimov Date: Mon, 27 Jun 2022 15:32:05 -0400 Subject: [PATCH] Lock in sorted order --- pageserver/src/layered_repository.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pageserver/src/layered_repository.rs b/pageserver/src/layered_repository.rs index fdd03ecf8b..72c619d3ff 100644 --- a/pageserver/src/layered_repository.rs +++ b/pageserver/src/layered_repository.rs @@ -337,12 +337,16 @@ impl Repository for LayeredRepository { // compactions. We don't want to block everything else while the // compaction runs. let timelines = self.timelines.lock().unwrap(); - let timelines_to_compact = timelines + let mut timelines_to_compact = timelines .iter() .map(|(timelineid, timeline)| (*timelineid, timeline.clone())) .collect::>(); drop(timelines); + // Sort to prevent deadlock + timelines_to_compact.sort_by(|a, b| a.0.cmp(&b.0)); + + // Compact all timelines in order for (timelineid, timeline) in &timelines_to_compact { let _entered = info_span!("compact", timeline = %timelineid, tenant = %self.tenant_id).entered();