mod common;
use common::{block_on, drain_parked, park};
use fluxbench::bench;
use fluxbench::prelude::*;
use pagedb::vfs::memory::MemVfs;
use pagedb::{Db, OpenOptions, RealmId};
const PAGE: usize = 4096;
const KEK: [u8; 32] = [7; 32];
const REALM: RealmId = RealmId::new([3; 16]);
const VALUE_LEN: usize = 128;
const INSERTED_KEYS: u32 = 1_200;
const DELETED_KEYS: u32 = 1_100;
fn prepared_dense_repack() -> Db<MemVfs> {
block_on(async {
drain_parked();
let db = Db::open(MemVfs::new(), KEK, PAGE, REALM, OpenOptions::default())
.await
.expect("open bench store");
let value = [0x2A; VALUE_LEN];
let mut write = db.begin_write().await.expect("begin insert txn");
for i in 0..INSERTED_KEYS {
write
.put(format!("key-{i:06}").as_bytes(), &value)
.await
.expect("insert");
}
write.commit().await.expect("commit inserts");
let mut delete = db.begin_write().await.expect("begin delete txn");
for i in 0..DELETED_KEYS {
delete
.delete(format!("key-{i:06}").as_bytes())
.await
.expect("delete");
}
delete.commit().await.expect("commit deletes");
db
})
}
#[bench(group = "compaction/dense_repack")]
fn dense_repack(b: &mut Bencher) {
b.iter_with_setup(prepared_dense_repack, |db| {
block_on(async move {
let stats = db.compact_now().await.expect("compact");
assert!(
stats.main_db_pages_reclaimed > 0,
"setup did not enter dense repack: {stats:?}"
);
park(db);
stats
})
});
}
fn main() {
if let Err(error) = fluxbench::run() {
eprintln!("fluxbench error: {error}");
std::process::exit(1);
}
}