From 647b7a70a8f243231b5c649d30d94dbc45730305 Mon Sep 17 00:00:00 2001 From: Alex Chi Z Date: Thu, 29 Jun 2023 14:31:00 -0400 Subject: [PATCH] fix Signed-off-by: Alex Chi Z --- pageserver/src/tenant/timeline.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index 9d65b950c2..61498055c0 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -2617,13 +2617,36 @@ impl Timeline { if !layer.layer_desc().is_delta && matches!(result, ValueReconstructResult::Continue) { + let old_layer = layer.clone(); // if is incremental image layer and not found, try again with delta layer if let Some(SearchResult { lsn_floor, layer }) = next { - println!("TRIGGERED: image + delta same layer"); + traversal_path.push(( + result, + cont_lsn, + Box::new({ + let layer = Arc::clone(&old_layer); + move || layer.traversal_id() + }), + )); + // HACK: no remote storage for now, safely get and downcast let layer = timeline.lcache.get_from_desc(&layer); + + // Get all the data needed to reconstruct the page version from this layer. + // But if we have an older cached page image, no need to go past that. + let lsn_floor = max(cached_lsn + 1, lsn_floor); + result = match layer.get_value_reconstruct_data( + key, + lsn_floor..cont_lsn, + reconstruct_state, + ctx, + ) { + Ok(result) => result, + Err(e) => return Err(PageReconstructError::from(e)), + }; + cont_lsn = lsn_floor; - *read_count += 1; + *read_count += 2; traversal_path.push(( result, cont_lsn,