From 5f4f7d976252477470f9b9a8d1a99ec67eb9753b Mon Sep 17 00:00:00 2001 From: Patrick Insinger Date: Tue, 12 Oct 2021 21:44:21 -0700 Subject: [PATCH] pageserver - PageVersions switch to iterator --- .../src/layered_repository/inmemory_layer.rs | 3 +-- .../src/layered_repository/page_versions.rs | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/pageserver/src/layered_repository/inmemory_layer.rs b/pageserver/src/layered_repository/inmemory_layer.rs index bd1860fd47..7b486b2652 100644 --- a/pageserver/src/layered_repository/inmemory_layer.rs +++ b/pageserver/src/layered_repository/inmemory_layer.rs @@ -157,8 +157,7 @@ impl Layer for InMemoryLayer { // Scan the page versions backwards, starting from `lsn`. let iter = inner .page_versions - .get_block_lsn_range(blknum, ..=lsn) - .iter() + .iter_block_lsn_range(blknum, ..=lsn) .rev(); for (_entry_lsn, entry) in iter { if let Some(img) = &entry.page_image { diff --git a/pageserver/src/layered_repository/page_versions.rs b/pageserver/src/layered_repository/page_versions.rs index 90321f96cd..2d5ce13a56 100644 --- a/pageserver/src/layered_repository/page_versions.rs +++ b/pageserver/src/layered_repository/page_versions.rs @@ -21,23 +21,25 @@ impl PageVersions { } /// Get all [`PageVersion`]s in a block - pub fn get_block_slice(&self, blknum: u32) -> &[(Lsn, PageVersion)] { + pub fn iter_block(&self, blknum: u32) -> BlockVersionIter<'_> { self.0 .get(&blknum) .map(VecMap::as_slice) .unwrap_or(EMPTY_SLICE) + .iter() } /// Get a range of [`PageVersions`] in a block - pub fn get_block_lsn_range>( + pub fn iter_block_lsn_range>( &self, blknum: u32, range: R, - ) -> &[(Lsn, PageVersion)] { + ) -> BlockVersionIter<'_> { self.0 .get(&blknum) .map(|vec_map| vec_map.slice_range(range)) .unwrap_or(EMPTY_SLICE) + .iter() } /// Iterate through [`PageVersion`]s in (block, lsn) order. @@ -46,21 +48,23 @@ impl PageVersions { let mut ordered_blocks: Vec = self.0.keys().cloned().collect(); ordered_blocks.sort_unstable(); - let slice = ordered_blocks + let iter = ordered_blocks .first() - .map(|&blknum| self.get_block_slice(blknum)) - .unwrap_or(EMPTY_SLICE); + .map(|&blknum| self.iter_block(blknum)) + .unwrap_or_else(|| EMPTY_SLICE.iter()); OrderedPageVersionIter { page_versions: self, ordered_blocks, cur_block_idx: 0, cutoff_lsn, - cur_slice_iter: slice.iter(), + cur_slice_iter: iter, } } } +pub type BlockVersionIter<'a> = std::slice::Iter<'a, (Lsn, PageVersion)>; + pub struct OrderedPageVersionIter<'a> { page_versions: &'a PageVersions, @@ -97,7 +101,7 @@ impl<'a> Iterator for OrderedPageVersionIter<'a> { let next_block_idx = self.cur_block_idx + 1; let blknum: u32 = *self.ordered_blocks.get(next_block_idx)?; self.cur_block_idx = next_block_idx; - self.cur_slice_iter = self.page_versions.get_block_slice(blknum).iter(); + self.cur_slice_iter = self.page_versions.iter_block(blknum); } } }