diff --git a/pageserver/src/layered_repository/inmemory_layer.rs b/pageserver/src/layered_repository/inmemory_layer.rs index 4d7f7169a0..2e0af289ad 100644 --- a/pageserver/src/layered_repository/inmemory_layer.rs +++ b/pageserver/src/layered_repository/inmemory_layer.rs @@ -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 = 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 = + Accum(after_segsizes.iter().next().map(|(lsn, _size)| *lsn)); let mut before_page_versions = PageVersions::default(); let mut after_page_versions = PageVersions::default(); diff --git a/zenith_utils/src/ordered_vec.rs b/zenith_utils/src/ordered_vec.rs index 49b44bedce..8d3c46afd0 100644 --- a/zenith_utils/src/ordered_vec.rs +++ b/zenith_utils/src/ordered_vec.rs @@ -90,6 +90,22 @@ impl OrderedVec { 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 From> for OrderedVec {