From 9dd1393f0e10b18aec10121b18eb01431e36420a Mon Sep 17 00:00:00 2001 From: Patrick Insinger Date: Tue, 28 Sep 2021 20:26:45 -0700 Subject: [PATCH] page version meta --- .../src/layered_repository/delta_layer.rs | 21 +++++++++---------- zenith_utils/src/ordered_vec.rs | 8 +++++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/pageserver/src/layered_repository/delta_layer.rs b/pageserver/src/layered_repository/delta_layer.rs index 4edad28995..80299b36fa 100644 --- a/pageserver/src/layered_repository/delta_layer.rs +++ b/pageserver/src/layered_repository/delta_layer.rs @@ -145,7 +145,7 @@ pub struct DeltaLayerInner { /// All versions of all pages in the file are are kept here. /// Indexed by block number and LSN. - page_version_metas: BTreeMap<(u32, Lsn), BlobRange>, + page_version_metas: OrderedVec<(u32, Lsn), BlobRange>, /// `relsizes` tracks the size of the relation at different points in time. relsizes: OrderedVec, @@ -221,7 +221,8 @@ impl Layer for DeltaLayer { let maxkey = (blknum, lsn); let mut iter = inner .page_version_metas - .range((Included(&minkey), Included(&maxkey))); + .range((Included(&minkey), Included(&maxkey))) + .iter(); while let Some(((_blknum, _entry_lsn), blob_range)) = iter.next_back() { let pv = PageVersion::des(&read_blob(&page_version_reader, blob_range)?)?; @@ -300,7 +301,7 @@ impl Layer for DeltaLayer { /// fn unload(&self) -> Result<()> { let mut inner = self.inner.lock().unwrap(); - inner.page_version_metas = BTreeMap::new(); + inner.page_version_metas = OrderedVec::default(); inner.relsizes = OrderedVec::default(); inner.loaded = false; Ok(()) @@ -404,7 +405,7 @@ impl DeltaLayer { dropped, inner: Mutex::new(DeltaLayerInner { loaded: true, - page_version_metas: BTreeMap::new(), + page_version_metas: OrderedVec::default(), // TODO create with a size estimate relsizes: OrderedVec::from(relsizes), }), predecessor, @@ -428,16 +429,14 @@ impl DeltaLayer { let buf = PageVersion::ser(page_version)?; let blob_range = page_version_writer.write_blob(&buf)?; - let old = inner.page_version_metas.insert(*key, blob_range); - - assert!(old.is_none()); + inner.page_version_metas.append(*key, blob_range); } let book = page_version_writer.close()?; // Write out page versions let mut chapter = book.new_chapter(PAGE_VERSION_METAS_CHAPTER); - let buf = BTreeMap::ser(&inner.page_version_metas)?; + let buf = OrderedVec::ser(&inner.page_version_metas)?; chapter.write_all(&buf)?; let book = chapter.close()?; @@ -530,7 +529,7 @@ impl DeltaLayer { } let chapter = book.read_chapter(PAGE_VERSION_METAS_CHAPTER)?; - let page_version_metas = BTreeMap::des(&chapter)?; + let page_version_metas = OrderedVec::des(&chapter)?; let chapter = book.read_chapter(REL_SIZES_CHAPTER)?; let relsizes = OrderedVec::des(&chapter)?; @@ -564,7 +563,7 @@ impl DeltaLayer { dropped: filename.dropped, inner: Mutex::new(DeltaLayerInner { loaded: false, - page_version_metas: BTreeMap::new(), + page_version_metas: OrderedVec::default(), relsizes: OrderedVec::default(), }), predecessor, @@ -588,7 +587,7 @@ impl DeltaLayer { dropped: summary.dropped, inner: Mutex::new(DeltaLayerInner { loaded: false, - page_version_metas: BTreeMap::new(), + page_version_metas: OrderedVec::default(), relsizes: OrderedVec::default(), }), predecessor: None, diff --git a/zenith_utils/src/ordered_vec.rs b/zenith_utils/src/ordered_vec.rs index ccede9ce05..f35c4f6ca8 100644 --- a/zenith_utils/src/ordered_vec.rs +++ b/zenith_utils/src/ordered_vec.rs @@ -46,6 +46,14 @@ impl OrderedVec { &self.0[start_idx..end_idx] } + + pub fn append(&mut self, key: K, value: V) { + if let Some((last_key, _last_value)) = self.0.last() { + debug_assert!(last_key < &key); + } + + self.0.push((key, value)); + } } impl From> for OrderedVec {