From 88960894d76288720e095cf58e41428e71c6c43f Mon Sep 17 00:00:00 2001 From: Alex Chi Z Date: Mon, 13 Jan 2025 13:06:59 -0500 Subject: [PATCH 1/2] fix(pageserver): ensure initial image layers have correct key ranges Signed-off-by: Alex Chi Z --- pageserver/src/tenant/timeline.rs | 36 ++++++++++++++----------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index f7227efeba38..d8735a5a966e 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -3781,35 +3781,31 @@ impl Timeline { return Err(FlushLayerError::Cancelled); } + // Ensure that we have a single call to `create_image_layers` with a combined dense keyspace. + // So that the key ranges don't overlap. + let mut partitions = KeyPartitioning::default(); + partitions.parts.extend(rel_partition.parts); + if !metadata_partition.parts.is_empty() { + assert_eq!( + metadata_partition.parts.len(), + 1, + "currently sparse keyspace should only contain a single metadata keyspace" + ); + partitions + .parts + .extend(metadata_partition.into_dense().parts); + } + let mut layers_to_upload = Vec::new(); layers_to_upload.extend( self.create_image_layers( - &rel_partition, + &partitions, self.initdb_lsn, ImageLayerCreationMode::Initial, ctx, ) .await?, ); - if !metadata_partition.parts.is_empty() { - assert_eq!( - metadata_partition.parts.len(), - 1, - "currently sparse keyspace should only contain a single metadata keyspace" - ); - layers_to_upload.extend( - self.create_image_layers( - // Safety: create_image_layers treat sparse keyspaces differently that it does not scan - // every single key within the keyspace, and therefore, it's safe to force converting it - // into a dense keyspace before calling this function. - &metadata_partition.into_dense(), - self.initdb_lsn, - ImageLayerCreationMode::Initial, - ctx, - ) - .await?, - ); - } (layers_to_upload, None) } else { From 877671ee32b6f81e36ca47a45b15f04075095a5e Mon Sep 17 00:00:00 2001 From: Alex Chi Z Date: Mon, 13 Jan 2025 13:13:45 -0500 Subject: [PATCH 2/2] bring back comments Signed-off-by: Alex Chi Z --- pageserver/src/tenant/timeline.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index d8735a5a966e..741b214a7308 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -3791,6 +3791,9 @@ impl Timeline { 1, "currently sparse keyspace should only contain a single metadata keyspace" ); + // Safety: create_image_layers treat sparse keyspaces differently that it does not scan + // every single key within the keyspace, and therefore, it's safe to force converting it + // into a dense keyspace before calling this function. partitions .parts .extend(metadata_partition.into_dense().parts);