This commit is contained in:
Bojan Serafimov
2022-12-02 14:52:55 -05:00
parent 72db121a8a
commit 2dcbdd9e47
2 changed files with 9 additions and 38 deletions

View File

@@ -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);
}
});
});

View File

@@ -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<u32, Option<String>>,
head: RedBlackTreeMap<i128, Option<String>>,
/// All previous states of `self.head`
historic: BTreeMap<u32, RedBlackTreeMap<u32, Option<String>>>,
historic: BTreeMap<u64, RedBlackTreeMap<i128, Option<String>>>,
}
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;