mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-04 20:12:54 +00:00
page version meta
This commit is contained in:
@@ -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<Lsn, u32>,
|
||||
@@ -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,
|
||||
|
||||
@@ -46,6 +46,14 @@ impl<K: Ord + Copy, V> OrderedVec<K, V> {
|
||||
|
||||
&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<K: Ord, V> From<BTreeMap<K, V>> for OrderedVec<K, V> {
|
||||
|
||||
Reference in New Issue
Block a user