diff --git a/pageserver/src/layered_repository/inmemory_layer.rs b/pageserver/src/layered_repository/inmemory_layer.rs index 154954a9dc..4554f58589 100644 --- a/pageserver/src/layered_repository/inmemory_layer.rs +++ b/pageserver/src/layered_repository/inmemory_layer.rs @@ -775,12 +775,7 @@ impl InMemoryLayer { let end_lsn = self.end_lsn.unwrap(); - let mut before_segsizes = OrderedVec::default(); - for (lsn, size) in inner.segsizes.iter() { - if *lsn <= end_lsn { - before_segsizes.append(*lsn, *size); - } - } + let before_segsizes = inner.segsizes.copy_prefix(&Lsn(end_lsn.0 + 1)); let mut before_page_versions = inner.page_versions.ordered_iter(Some(end_lsn)); let mut frozen_layers: Vec> = Vec::new(); diff --git a/zenith_utils/src/ordered_vec.rs b/zenith_utils/src/ordered_vec.rs index 8d3c46afd0..dbef45bd23 100644 --- a/zenith_utils/src/ordered_vec.rs +++ b/zenith_utils/src/ordered_vec.rs @@ -91,6 +91,19 @@ impl OrderedVec { self.0.is_empty() } + pub fn copy_prefix(&self, key: &K) -> 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])) + } + pub fn copy_split(&self, key: &K) -> (Self, Self) where K: Clone,