From 73fac2c33629a67ab60a06f6cdac79615b64899c Mon Sep 17 00:00:00 2001 From: Alex Chi Z Date: Mon, 12 May 2025 14:29:47 +0800 Subject: [PATCH] retry repartition Signed-off-by: Alex Chi Z --- pageserver/src/tenant/timeline.rs | 1 + pageserver/src/tenant/timeline/compaction.rs | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index d7f5958128..59b7c2b1af 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -165,6 +165,7 @@ pub enum LastImageLayerCreationStatus { /// attempt. last_key: Key, }, + NeedRepartition, Complete, #[default] Initial, diff --git a/pageserver/src/tenant/timeline/compaction.rs b/pageserver/src/tenant/timeline/compaction.rs index a19c83aa5f..63d6d4fdb9 100644 --- a/pageserver/src/tenant/timeline/compaction.rs +++ b/pageserver/src/tenant/timeline/compaction.rs @@ -1278,13 +1278,19 @@ impl Timeline { } let gc_cutoff = *self.applied_gc_cutoff_lsn.read(); + let mut flags = options.flags; + if let LastImageLayerCreationStatus::NeedRepartition = + self.last_image_layer_creation_status.load().as_ref() + { + flags.insert(CompactFlags::ForceRepartition); + } // 2. Repartition and create image layers if necessary match self .repartition( self.get_last_record_lsn(), self.get_compaction_target_size(), - options.flags, + flags, ctx, ) .await @@ -1351,6 +1357,9 @@ impl Timeline { "could not create image layers due to {}; this is not critical because the requested image LSN is below the GC curoff", err ); + self.last_image_layer_creation_status + .store(Arc::new(LastImageLayerCreationStatus::NeedRepartition)); + // Fall through to shard ancestor compaction } else { return Err(err.into());