pageserver - PageVersions switch to iterator

This commit is contained in:
Patrick Insinger
2021-10-12 21:44:21 -07:00
parent f658263543
commit 5f4f7d9762
2 changed files with 13 additions and 10 deletions

View File

@@ -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 {

View File

@@ -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<R: RangeBounds<Lsn>>(
pub fn iter_block_lsn_range<R: RangeBounds<Lsn>>(
&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<u32> = 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);
}
}
}