mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-09 14:32:57 +00:00
OrderedVec - copy_split for segsizes
This commit is contained in:
@@ -642,18 +642,11 @@ impl InMemoryLayer {
|
||||
|
||||
// Divide all the page versions into old and new
|
||||
// at the 'cutoff_lsn' point.
|
||||
// TODO OrderedVec split method
|
||||
let mut before_segsizes = OrderedVec::default();
|
||||
let mut after_segsizes = OrderedVec::default();
|
||||
let mut after_oldest_lsn: Accum<Lsn> = Accum(None);
|
||||
for (lsn, size) in inner.segsizes.iter() {
|
||||
if *lsn > cutoff_lsn {
|
||||
after_segsizes.append(*lsn, *size);
|
||||
after_oldest_lsn.accum(min, *lsn);
|
||||
} else {
|
||||
before_segsizes.append(*lsn, *size);
|
||||
}
|
||||
}
|
||||
let (before_segsizes, after_segsizes) = inner.segsizes.copy_split(&Lsn(cutoff_lsn.0 + 1));
|
||||
|
||||
// The iterator is in Lsn order, so the first element will have the smallest Lsn
|
||||
let mut after_oldest_lsn: Accum<Lsn> =
|
||||
Accum(after_segsizes.iter().next().map(|(lsn, _size)| *lsn));
|
||||
|
||||
let mut before_page_versions = PageVersions::default();
|
||||
let mut after_page_versions = PageVersions::default();
|
||||
|
||||
@@ -90,6 +90,22 @@ impl<K: Ord + Copy, V> OrderedVec<K, V> {
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.0.is_empty()
|
||||
}
|
||||
|
||||
pub fn copy_split(&self, key: &K) -> (Self, Self)
|
||||
where
|
||||
K: Clone,
|
||||
V: Clone,
|
||||
{
|
||||
let idx = match self.0.binary_search_by_key(key, extract_key) {
|
||||
Ok(idx) => idx,
|
||||
Err(idx) => idx,
|
||||
};
|
||||
|
||||
(
|
||||
OrderedVec(Vec::from(&self.0[..idx])),
|
||||
OrderedVec(Vec::from(&self.0[idx..])),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Ord, V> From<BTreeMap<K, V>> for OrderedVec<K, V> {
|
||||
|
||||
Reference in New Issue
Block a user