From bfeaee90cafbec409732ef7db1a62c5586f36a06 Mon Sep 17 00:00:00 2001 From: Bojan Serafimov Date: Wed, 28 Dec 2022 19:22:10 -0500 Subject: [PATCH] implement image_layer_exists (not tested) --- pageserver/src/tenant/layer_map.rs | 37 +++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/pageserver/src/tenant/layer_map.rs b/pageserver/src/tenant/layer_map.rs index c5918672d6..dae9ffdc74 100644 --- a/pageserver/src/tenant/layer_map.rs +++ b/pageserver/src/tenant/layer_map.rs @@ -177,12 +177,37 @@ impl LayerMap { /// /// This is used for garbage collection, to determine if an old layer can /// be deleted. - pub fn image_layer_exists( - &self, - key_range: &Range, - lsn_range: &Range, - ) -> Result { - todo!() + pub fn image_layer_exists(&self, key: &Range, lsn: &Range) -> Result { + if key.is_empty() { + return Ok(true); + } + + let version = match self.index.get_version(lsn.end.0) { + Some(v) => v, + None => return Ok(false), + }; + + let start = key.start.to_i128(); + let end = key.end.to_i128(); + + let layer_covers = |layer: Option>| match layer { + Some(layer) => layer.get_lsn_range().start >= lsn.start, + None => false, + }; + + // Check the start is covered + if !layer_covers(version.query(start).1) { + return Ok(false); + } + + // Check after all changes of coverage + for (_, change_val) in version.image_coverage(start..end) { + if !layer_covers(change_val) { + return Ok(false); + } + } + + return Ok(true); } pub fn iter_historic_layers(&self) -> impl '_ + Iterator> {