diff --git a/pageserver/src/layered_repository/delta_layer.rs b/pageserver/src/layered_repository/delta_layer.rs index 7a763b52de..b4be07d3ab 100644 --- a/pageserver/src/layered_repository/delta_layer.rs +++ b/pageserver/src/layered_repository/delta_layer.rs @@ -251,6 +251,8 @@ impl Layer for DeltaLayer { /// Does this segment exist at given LSN? fn get_seg_exists(&self, lsn: Lsn) -> Result { + assert!(lsn >= self.start_lsn); + // Is the requested LSN after the rel was dropped? if self.dropped && lsn >= self.end_lsn { return Ok(false); diff --git a/pageserver/src/layered_repository/image_layer.rs b/pageserver/src/layered_repository/image_layer.rs index 7110a48b30..1dce0559fb 100644 --- a/pageserver/src/layered_repository/image_layer.rs +++ b/pageserver/src/layered_repository/image_layer.rs @@ -157,7 +157,9 @@ impl Layer for ImageLayer { } /// Get size of the segment - fn get_seg_size(&self, _lsn: Lsn) -> Result { + fn get_seg_size(&self, lsn: Lsn) -> Result { + assert!(lsn >= self.lsn); + let inner = self.load()?; match inner.image_type { ImageType::Blocky { num_blocks } => Ok(num_blocks), @@ -166,7 +168,8 @@ impl Layer for ImageLayer { } /// Does this segment exist at given LSN? - fn get_seg_exists(&self, _lsn: Lsn) -> Result { + fn get_seg_exists(&self, lsn: Lsn) -> Result { + assert!(lsn >= self.lsn); Ok(true) } diff --git a/pageserver/src/layered_repository/inmemory_layer.rs b/pageserver/src/layered_repository/inmemory_layer.rs index a32a0927ba..35c6506feb 100644 --- a/pageserver/src/layered_repository/inmemory_layer.rs +++ b/pageserver/src/layered_repository/inmemory_layer.rs @@ -198,6 +198,8 @@ impl Layer for InMemoryLayer { /// Does this segment exist at given LSN? fn get_seg_exists(&self, lsn: Lsn) -> Result { + assert!(lsn >= self.start_lsn); + let inner = self.inner.lock().unwrap(); // Is the requested LSN after the segment was dropped? diff --git a/pageserver/src/layered_repository/layer_map.rs b/pageserver/src/layered_repository/layer_map.rs index ea91c6be01..da27fa3ca9 100644 --- a/pageserver/src/layered_repository/layer_map.rs +++ b/pageserver/src/layered_repository/layer_map.rs @@ -227,15 +227,17 @@ impl LayerMap { { // Add only if it exists at the requested LSN. if let Some(open) = &segentry.open { - if open.get_end_lsn() > lsn { + if open.get_end_lsn() > lsn && open.get_start_lsn() <= lsn { rels.insert(reltag); } - } else if let Some((_k, _v)) = segentry + } else if let Some((l_start_lsn, layer)) = segentry .historic .range((Included(Lsn(0)), Included(lsn))) .next_back() { - rels.insert(reltag); + if !layer.is_dropped() && l_start_lsn <= &lsn { + rels.insert(reltag); + } } } } @@ -253,15 +255,17 @@ impl LayerMap { } else { // Add only if it exists at the requested LSN. if let Some(open) = &segentry.open { - if open.get_end_lsn() > lsn { + if open.get_end_lsn() > lsn && open.get_start_lsn() <= lsn { rels.insert(seg.rel); } - } else if let Some((_k, _v)) = segentry + } else if let Some((l_start_lsn, layer)) = segentry .historic .range((Included(Lsn(0)), Included(lsn))) .next_back() { - rels.insert(seg.rel); + if !layer.is_dropped() && l_start_lsn <= &lsn { + rels.insert(seg.rel); + } } } }