diff --git a/pageserver/benches/bench_layer_map.rs b/pageserver/benches/bench_layer_map.rs index b8fe06785e..a327507f6d 100644 --- a/pageserver/benches/bench_layer_map.rs +++ b/pageserver/benches/bench_layer_map.rs @@ -1,7 +1,7 @@ use anyhow::Result; use num_traits::ToPrimitive; use pageserver::repository::{Key, Value}; -use pageserver::tenant::bst_layer_map::PersistentLayerMap; +use pageserver::tenant::bst_layer_map::RetroactiveLayerMap; use pageserver::tenant::filename::{DeltaFileName, ImageFileName}; use pageserver::tenant::layer_map::LayerMap; use pageserver::tenant::storage_layer::Layer; @@ -254,12 +254,8 @@ fn bench_from_real_project(c: &mut Criterion) { // Init bst layer map with the same layers let now = Instant::now(); - let mut bstlm = PersistentLayerMap::new(); - let mut sorted_layers: Vec<_> = layer_map.iter_historic_layers().collect(); - sorted_layers.sort_by(|a, b| a.get_lsn_range().start.cmp(&b.get_lsn_range().start)); - - // TODO implement out of order inserts - for layer in sorted_layers { + let mut bstlm = RetroactiveLayerMap::new(); + for layer in layer_map.iter_historic_layers() { let kr = layer.get_key_range(); let lr = layer.get_lsn_range(); @@ -269,6 +265,7 @@ fn bench_from_real_project(c: &mut Criterion) { format!("Layer {}", lr.start.0), ); } + bstlm.rebuild(); println!("Finished bst init in {:?}", now.elapsed()); // Choose uniformly distributed queries @@ -317,11 +314,8 @@ fn bench_sequential(c: &mut Criterion) { // Init bst layer map with the same layers let now = Instant::now(); - let mut bstlm = PersistentLayerMap::new(); - let mut sorted_layers: Vec<_> = layer_map.iter_historic_layers().collect(); - sorted_layers.sort_by(|a, b| a.get_lsn_range().start.cmp(&b.get_lsn_range().start)); - // TODO implement out of order inserts - for layer in sorted_layers { + let mut bstlm = RetroactiveLayerMap::new(); + for layer in layer_map.iter_historic_layers() { let kr = layer.get_key_range(); let lr = layer.get_lsn_range(); diff --git a/pageserver/src/tenant/bst_layer_map.rs b/pageserver/src/tenant/bst_layer_map.rs index 7c9eaff337..0a9f8cd75f 100644 --- a/pageserver/src/tenant/bst_layer_map.rs +++ b/pageserver/src/tenant/bst_layer_map.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use std::sync::Arc; use std::ops::Range; +use std::sync::Arc; // TODO the `im` crate has 20x more downloads and also has // persistent/immutable BTree. See if it's better. @@ -100,7 +100,8 @@ impl PersistentLayerMap { to_remove.push(key.end); } for k in to_update { - self.head.insert_mut(k.clone(), Some((lsn.end.clone(), value.clone()))); + self.head + .insert_mut(k.clone(), Some((lsn.end.clone(), value.clone()))); } for k in to_remove { self.head.remove_mut(&k); @@ -114,7 +115,13 @@ impl PersistentLayerMap { // TODO check for off-by-one errors let version = self.historic.range(0..=lsn).rev().next()?.1; - version.range(0..=key).rev().next()?.1.as_ref().map(|(_, v)| v.clone()) + version + .range(0..=key) + .rev() + .next()? + .1 + .as_ref() + .map(|(_, v)| v.clone()) } pub fn trim(self: &mut Self, begin: &u64) { @@ -295,10 +302,10 @@ impl RetroactiveLayerMap { // Rebuild self.map.trim(&rebuild_since); - for (lsn, layers) in self.layers.range(rebuild_since..) { - for (key, lsn, value) in layers { + for (_start_lsn, layers) in self.layers.range(rebuild_since..) { + for (key, end_lsn, value) in layers { let wrapped = Arc::new(vec![value.clone()]); - self.map.insert(key.clone(), lsn.clone(), wrapped); + self.map.insert(key.clone(), end_lsn.clone(), wrapped); } } }