From a3f0111726861aa7a758ead2861a66f052bd38b2 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Mon, 19 Dec 2022 19:43:06 +0100 Subject: [PATCH] LayerMap::search is actually infallible Found this while investigating failure modes of on-demand download. I think it's a nice cleanup. --- pageserver/benches/bench_layer_map.rs | 6 +++--- pageserver/src/tenant/layer_map.rs | 16 ++++++++-------- pageserver/src/tenant/timeline.rs | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pageserver/benches/bench_layer_map.rs b/pageserver/benches/bench_layer_map.rs index 6001377811..a0c38e1e3a 100644 --- a/pageserver/benches/bench_layer_map.rs +++ b/pageserver/benches/bench_layer_map.rs @@ -163,7 +163,7 @@ fn bench_from_captest_env(c: &mut Criterion) { c.bench_function("captest_uniform_queries", |b| { b.iter(|| { for q in queries.clone().into_iter() { - layer_map.search(q.0, q.1).unwrap(); + layer_map.search(q.0, q.1); } }); }); @@ -192,7 +192,7 @@ fn bench_from_real_project(c: &mut Criterion) { c.bench_function("real_map_uniform_queries", |b| { b.iter(|| { for q in queries.clone().into_iter() { - layer_map.search(q.0, q.1).unwrap(); + layer_map.search(q.0, q.1); } }); }); @@ -238,7 +238,7 @@ fn bench_sequential(c: &mut Criterion) { // Run the search queries b.iter(|| { for q in queries.clone().into_iter() { - layer_map.search(q.0, q.1).unwrap(); + layer_map.search(q.0, q.1); } }); }); diff --git a/pageserver/src/tenant/layer_map.rs b/pageserver/src/tenant/layer_map.rs index 19252ecf6e..0202ccfa6a 100644 --- a/pageserver/src/tenant/layer_map.rs +++ b/pageserver/src/tenant/layer_map.rs @@ -261,7 +261,7 @@ where /// contain the version, even if it's missing from the returned /// layer. /// - pub fn search(&self, key: Key, end_lsn: Lsn) -> Result>> { + pub fn search(&self, key: Key, end_lsn: Lsn) -> Option> { // linear search // Find the latest image layer that covers the given key let mut latest_img: Option> = None; @@ -286,10 +286,10 @@ where assert!(img_lsn < end_lsn); if Lsn(img_lsn.0 + 1) == end_lsn { // found exact match - return Ok(Some(SearchResult { + return Some(SearchResult { layer: Arc::clone(l), lsn_floor: img_lsn, - })); + }); } if img_lsn > latest_img_lsn.unwrap_or(Lsn(0)) { latest_img = Some(Arc::clone(l)); @@ -346,19 +346,19 @@ where Lsn(latest_img_lsn.unwrap_or(Lsn(0)).0 + 1), l.get_lsn_range().start, ); - Ok(Some(SearchResult { + Some(SearchResult { lsn_floor, layer: l, - })) + }) } else if let Some(l) = latest_img { trace!("found img layer and no deltas for request on {key} at {end_lsn}"); - Ok(Some(SearchResult { + Some(SearchResult { lsn_floor: latest_img_lsn.unwrap(), layer: l, - })) + }) } else { trace!("no layer found for request on {key} at {end_lsn}"); - Ok(None) + None } } diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index 0697ec4bd6..4a54c91d25 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -1587,7 +1587,7 @@ impl Timeline { } } - if let Some(SearchResult { lsn_floor, layer }) = layers.search(key, cont_lsn)? { + if let Some(SearchResult { lsn_floor, layer }) = layers.search(key, cont_lsn) { //info!("CHECKING for {} at {} on historic layer {}", key, cont_lsn, layer.filename().display()); let lsn_floor = max(cached_lsn + 1, lsn_floor);