diff --git a/pageserver/src/tenant/layer_map/historic_layer_coverage.rs b/pageserver/src/tenant/layer_map/historic_layer_coverage.rs index 15c748f651..576f436131 100644 --- a/pageserver/src/tenant/layer_map/historic_layer_coverage.rs +++ b/pageserver/src/tenant/layer_map/historic_layer_coverage.rs @@ -533,7 +533,6 @@ impl BufferedHistoricLayerCoverage { num_inserted += 1; if was_noop { - println!("Redundant layer {:?}", layer_key); self.redundant_layers.insert(layer_key.clone(), layer.clone()); } } @@ -556,6 +555,15 @@ impl BufferedHistoricLayerCoverage { self.layers.values().cloned() } + /// Returns whether the layer with the given key was already inserted as redundant + pub fn is_redundant(&self, key: &LayerKey) -> bool { + if !self.buffer.is_empty() { + panic!("rebuild pls") + } + + return self.redundant_layers.contains_key(key) + } + /// Return a reference to a queryable map, assuming all updates /// have already been processed using self.rebuild() pub fn get(&self) -> anyhow::Result<&HistoricLayerCoverage> { @@ -695,6 +703,34 @@ fn test_retroactive_simple() { } } +#[test] +fn test_redundant_layers() { + let mut map = BufferedHistoricLayerCoverage::new(); + + let key1 = LayerKey { + key: 3..5, + lsn: 3..5, + is_image: false, + }; + let key2 = LayerKey { + key: 0..10, + lsn: 0..10, + is_image: false, + }; + + // Append some images in increasing LSN order + map.insert(key1.clone(), "Delta 1".to_string()); + map.insert(key2.clone(), "Delta 2".to_string()); + + // Rebuild so we can start querying + map.rebuild(); + + // Check that key1 is redundant + assert_eq!(map.is_redundant(&key1), true); + assert_eq!(map.is_redundant(&key2), false); +} + + #[test] fn test_retroactive_replacement() { let mut map = BufferedHistoricLayerCoverage::new();