mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-14 08:52:56 +00:00
Use i128
This commit is contained in:
@@ -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);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user