From 1137b58b4d476370c36af93f5da46f9ae2562303 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Mon, 26 Dec 2022 18:21:41 +0200 Subject: [PATCH] Fix LayerMap::search to not return delta layer preceeding image layer (#3197) While @bojanserafimov is still working on best replacement of R-Tree in layer_map.rs there is obvious pitfall in the current `search` method implementation: is returns delta layer even if there is image layer if greater LSN. I think that it should be fixed. --- pageserver/src/tenant/layer_map.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pageserver/src/tenant/layer_map.rs b/pageserver/src/tenant/layer_map.rs index f5182926e4..4ff2d4b0d8 100644 --- a/pageserver/src/tenant/layer_map.rs +++ b/pageserver/src/tenant/layer_map.rs @@ -326,14 +326,16 @@ where latest_delta.replace(Arc::clone(l)); break; } - // this layer's end LSN is smaller than the requested point. If there's - // nothing newer, this is what we need to return. Remember this. - if let Some(old_candidate) = &latest_delta { - if l.get_lsn_range().end > old_candidate.get_lsn_range().end { + if l.get_lsn_range().end > latest_img_lsn.unwrap_or(Lsn(0)) { + // this layer's end LSN is smaller than the requested point. If there's + // nothing newer, this is what we need to return. Remember this. + if let Some(old_candidate) = &latest_delta { + if l.get_lsn_range().end > old_candidate.get_lsn_range().end { + latest_delta.replace(Arc::clone(l)); + } + } else { latest_delta.replace(Arc::clone(l)); } - } else { - latest_delta.replace(Arc::clone(l)); } } if let Some(l) = latest_delta {