From 2dcbdd9e4720d2dfbe906d0470490a229ad76913 Mon Sep 17 00:00:00 2001 From: Bojan Serafimov Date: Fri, 2 Dec 2022 14:52:55 -0500 Subject: [PATCH] Use i128 --- pageserver/benches/bench_layer_map.rs | 39 ++++---------------------- pageserver/src/tenant/bst_layer_map.rs | 8 +++--- 2 files changed, 9 insertions(+), 38 deletions(-) diff --git a/pageserver/benches/bench_layer_map.rs b/pageserver/benches/bench_layer_map.rs index 21273f8dd9..6853a41f87 100644 --- a/pageserver/benches/bench_layer_map.rs +++ b/pageserver/benches/bench_layer_map.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use num_traits::ToPrimitive; use pageserver::repository::{Key, Value}; use pageserver::tenant::bst_layer_map::BSTLM; use pageserver::tenant::filename::{DeltaFileName, ImageFileName}; @@ -261,7 +262,6 @@ fn bench_from_real_project(c: &mut Criterion) { // Benchmark using synthetic data. Arrange image layers on stacked diagonal lines. fn bench_sequential(c: &mut Criterion) { let mut layer_map = LayerMap::default(); - let mut stlm = STLM::new(); let mut bstlm = BSTLM::new(); // Init layer map. Create 100_000 layers arranged in 1000 diagonal lines. @@ -272,9 +272,6 @@ fn bench_sequential(c: &mut Criterion) { // because then it runs multiple times during warmup. let now = Instant::now(); for i in 0..100_000 { - // TODO try inserting a super-wide layer in between every 10 to reflect - // what often happens with L1 layers that include non-rel changes. - // Maybe do that as a separate test. let i32 = (i as u32) % 100; let zero = Key::from_hex("000000000000000000000000000000000000").unwrap(); let layer = DummyImage { @@ -287,31 +284,12 @@ fn bench_sequential(c: &mut Criterion) { let now = Instant::now(); for i in 0..100_000 { - // TODO try inserting a super-wide layer in between every 10 to reflect - // what often happens with L1 layers that include non-rel changes. - // Maybe do that as a separate test. let i32 = (i as u32) % 100; let zero = Key::from_hex("000000000000000000000000000000000000").unwrap(); - let layer = DummyImage { - key_range: zero.add(10 * i32)..zero.add(10 * i32 + 1), - lsn: Lsn(i), - }; - stlm.insert(10 * i32, 10 * i32 + 1, i as u32, format!("Layer {}", i)); - } - println!("Finished persistent segment tree init in {:?}", now.elapsed()); + let begin = zero.add(10 * i32).to_i128(); + let end = zero.add(10 * i32 + 1).to_i128(); - let now = Instant::now(); - for i in 0..100_000 { - // TODO try inserting a super-wide layer in between every 10 to reflect - // what often happens with L1 layers that include non-rel changes. - // Maybe do that as a separate test. - let i32 = (i as u32) % 100; - let zero = Key::from_hex("000000000000000000000000000000000000").unwrap(); - let layer = DummyImage { - key_range: zero.add(10 * i32)..zero.add(10 * i32 + 1), - lsn: Lsn(i), - }; - bstlm.insert(10 * i32, 10 * i32 + 1, i as u32, format!("Layer {}", i)); + bstlm.insert(begin, end, i as u64, format!("Layer {}", i)); } println!("Finished bst init in {:?}", now.elapsed()); @@ -331,17 +309,10 @@ fn bench_sequential(c: &mut Criterion) { } }); }); - group.bench_function("persistent_segment_tree", |b| { - b.iter(|| { - for q in queries.clone().into_iter() { - stlm.query(q.0.field6, q.1.0 as u32); - } - }); - }); group.bench_function("persistent_bst", |b| { b.iter(|| { for q in queries.clone().into_iter() { - bstlm.query(q.0.field6, q.1.0 as u32); + bstlm.query(q.0.to_i128(), q.1.0); } }); }); diff --git a/pageserver/src/tenant/bst_layer_map.rs b/pageserver/src/tenant/bst_layer_map.rs index edef665b19..9687a69ae5 100644 --- a/pageserver/src/tenant/bst_layer_map.rs +++ b/pageserver/src/tenant/bst_layer_map.rs @@ -10,10 +10,10 @@ use rpds::RedBlackTreeMap; /// so it's missing unnecessary details. Values are String for now. pub struct BSTLM { /// Mapping key to the latest layer (if any) until the next key - head: RedBlackTreeMap>, + head: RedBlackTreeMap>, /// All previous states of `self.head` - historic: BTreeMap>>, + historic: BTreeMap>>, } impl std::fmt::Debug for BSTLM { @@ -31,7 +31,7 @@ impl BSTLM { } } - pub fn insert(self: &mut Self, key_begin: u32, key_end: u32, lsn: u32, value: String) { + pub fn insert(self: &mut Self, key_begin: i128, key_end: i128, lsn: u64, value: String) { // TODO check for off-by-one errors // TODO check if LSN is lower than current max LSN. It should be rare for @@ -63,7 +63,7 @@ impl BSTLM { self.historic.insert(lsn, self.head.clone()); } - pub fn query(self: &Self, key: u32, lsn: u32) -> Option<&String> { + pub fn query(self: &Self, key: i128, lsn: u64) -> Option<&String> { // TODO check for off-by-one errors let version = self.historic.range(0..=lsn).rev().next()?.1;