use commonware_runtime::{buffer::paged::CacheRef, tokio::Context};
use commonware_storage::freezer::{Config, Freezer};
use commonware_utils::{sequence::FixedBytes, NZUsize, NZU16};
use rand::{rngs::StdRng, RngCore, SeedableRng};
use std::num::{NonZeroU16, NonZeroUsize};
const WRITE_BUFFER: usize = 1024 * 1024;
const VALUE_TARGET_SIZE: u64 = 100 * 1024 * 1024;
const TABLE_INITIAL_SIZE: u32 = 65_536;
const TABLE_RESIZE_FREQUENCY: u8 = 4;
const TABLE_RESIZE_CHUNK_SIZE: u32 = 1024;
const TABLE_REPLAY_BUFFER: usize = 1024 * 1024;
pub const KEY_PARTITION: &str = "freezer-bench-key";
pub const VALUE_PARTITION: &str = "freezer-bench-value";
pub const TABLE_PARTITION: &str = "freezer-bench-table";
const PAGE_SIZE: NonZeroU16 = NZU16!(16_384);
const PAGE_CACHE_SIZE: NonZeroUsize = NZUsize!(10_000);
pub type Key = FixedBytes<64>;
pub type Val = FixedBytes<128>;
pub type FreezerType = Freezer<Context, Key, Val>;
pub async fn init(ctx: Context) -> FreezerType {
let cfg = Config {
key_partition: KEY_PARTITION.into(),
key_write_buffer: NZUsize!(WRITE_BUFFER),
key_page_cache: CacheRef::from_pooler(&ctx, PAGE_SIZE, PAGE_CACHE_SIZE),
value_partition: VALUE_PARTITION.into(),
value_compression: None,
value_write_buffer: NZUsize!(WRITE_BUFFER),
value_target_size: VALUE_TARGET_SIZE,
table_partition: TABLE_PARTITION.into(),
table_initial_size: TABLE_INITIAL_SIZE,
table_resize_frequency: TABLE_RESIZE_FREQUENCY,
table_resize_chunk_size: TABLE_RESIZE_CHUNK_SIZE,
table_replay_buffer: NZUsize!(TABLE_REPLAY_BUFFER),
codec_config: (),
};
Freezer::init(ctx, cfg).await.unwrap()
}
pub async fn append_random(freezer: &mut FreezerType, count: u64) -> Vec<Key> {
let mut rng = StdRng::seed_from_u64(42);
let mut key_buf = [0u8; 64];
let mut val_buf = [0u8; 128];
let mut keys = Vec::with_capacity(count as usize);
for _ in 0..count {
rng.fill_bytes(&mut key_buf);
let key = Key::new(key_buf);
keys.push(key.clone());
rng.fill_bytes(&mut val_buf);
freezer.put(key, Val::new(val_buf)).await.unwrap();
}
freezer.sync().await.unwrap();
keys
}