use commonware_runtime::{buffer::paged::CacheRef, tokio::Context};
use commonware_storage::{
journal::{
contiguous::{
fixed::{Config as FixedConfig, Journal as FixedJournal},
variable::{Config as VariableConfig, Journal as VariableJournal},
Mutable,
},
Error as JournalError,
},
Persistable,
};
use commonware_utils::{sequence::FixedBytes, NZUsize, NZU16, NZU64};
use criterion::criterion_main;
use rand::{rngs::StdRng, RngCore, SeedableRng};
use std::num::{NonZeroU16, NonZeroU64, NonZeroUsize};
mod fixed_append;
mod fixed_read_random;
mod fixed_read_sequential;
mod fixed_replay;
mod variable_replay;
criterion_main!(
fixed_append::benches,
fixed_read_random::benches,
fixed_read_sequential::benches,
fixed_replay::benches,
variable_replay::benches,
);
const WRITE_BUFFER: NonZeroUsize = NZUsize!(1_024 * 1024);
const PAGE_SIZE: NonZeroU16 = NZU16!(8_192);
const PAGE_CACHE_SIZE: NonZeroUsize = NZUsize!(10_000);
const ITEMS_PER_BLOB: NonZeroU64 = NZU64!(100_000);
const ITEM_SIZE: usize = 32;
async fn get_fixed_journal<const ITEM_SIZE: usize>(
context: Context,
partition_name: &str,
items_per_blob: NonZeroU64,
) -> FixedJournal<Context, FixedBytes<ITEM_SIZE>> {
let journal_config = FixedConfig {
partition: partition_name.into(),
items_per_blob,
write_buffer: WRITE_BUFFER,
page_cache: CacheRef::from_pooler(&context, PAGE_SIZE, PAGE_CACHE_SIZE),
};
FixedJournal::init(context, journal_config).await.unwrap()
}
async fn append_fixed_random_data<C, const ITEM_SIZE: usize>(journal: &mut C, items_to_write: u64)
where
C: Mutable<Item = FixedBytes<ITEM_SIZE>> + Persistable<Error = JournalError>,
{
let mut rng = StdRng::seed_from_u64(0);
let mut arr = [0; ITEM_SIZE];
for _ in 0..items_to_write {
rng.fill_bytes(&mut arr);
journal
.append(&FixedBytes::new(arr))
.await
.expect("failed to append data");
}
journal.sync().await.expect("failed to sync journal");
}
async fn get_variable_journal<const ITEM_SIZE: usize>(
context: Context,
partition_name: &str,
items_per_section: NonZeroU64,
) -> VariableJournal<Context, FixedBytes<ITEM_SIZE>> {
let journal_config = VariableConfig {
partition: partition_name.into(),
items_per_section,
compression: None,
codec_config: (),
page_cache: CacheRef::from_pooler(&context, PAGE_SIZE, PAGE_CACHE_SIZE),
write_buffer: WRITE_BUFFER,
};
VariableJournal::init(context, journal_config)
.await
.unwrap()
}