diff --git a/pageserver/src/layered_repository/layer_map.rs b/pageserver/src/layered_repository/layer_map.rs index 2957a55d03..ea91c6be01 100644 --- a/pageserver/src/layered_repository/layer_map.rs +++ b/pageserver/src/layered_repository/layer_map.rs @@ -271,15 +271,16 @@ impl LayerMap { /// Is there a newer image layer for given segment? /// /// This is used for garbage collection, to determine if an old layer can - /// be deleted. We ignore in-memory layers because they are not durable - /// on disk, and delta layers because they depend on an older layer. + /// be deleted. pub fn newer_image_layer_exists(&self, seg: SegmentTag, lsn: Lsn) -> bool { if let Some(segentry) = self.segs.get(&seg) { + // We only check on-disk layers, because + // in-memory layers are not durable for (newer_lsn, layer) in segentry .historic .range((Included(lsn), Included(Lsn(u64::MAX)))) { - // Ignore delta layers. + // Ignore layers that depend on an older layer. if layer.is_incremental() { continue; } diff --git a/pageserver/src/layered_repository/storage_layer.rs b/pageserver/src/layered_repository/storage_layer.rs index cfae4c81c1..2cb4850c10 100644 --- a/pageserver/src/layered_repository/storage_layer.rs +++ b/pageserver/src/layered_repository/storage_layer.rs @@ -105,12 +105,24 @@ pub enum PageReconstructResult { /// in-memory and on-disk layers. /// pub trait Layer: Send + Sync { - // These functions identify the relish segment and the LSN range - // that this Layer holds. + /// Identify the timeline this relish belongs to fn get_timeline_id(&self) -> ZTimelineId; + + /// Identify the relish segment fn get_seg_tag(&self) -> SegmentTag; + + /// Inclusive start bound of the LSN range that this layer hold fn get_start_lsn(&self) -> Lsn; + + /// 'end_lsn' meaning depends on the layer kind: + /// - in-memory layer is either unbounded (end_lsn = MAX_LSN) or dropped (end_lsn = drop_lsn) + /// - image layer represents snapshot at one LSN, so end_lsn = lsn + /// - delta layer has end_lsn + /// + /// TODO Is end_lsn always exclusive for all layer kinds? fn get_end_lsn(&self) -> Lsn; + + /// Is the segment represented by this layer dropped by PostgreSQL? fn is_dropped(&self) -> bool; /// Filename used to store this layer on disk. (Even in-memory layers