// options.mbt
//
// Tuning knobs for a Db. All sizes are in bytes.
pub(all) struct Options {
/// Memtable byte budget; exceeding it triggers an automatic flush.
memtable_limit : Int
/// SSTable block size passed to SstBuilder.
block_size : Int
/// Flush ends with an L1 compaction once this many L0 tables have piled up.
l0_compaction_trigger : Int
/// Minimum L1 bytes before an L1 → L2 compaction is considered.
l2_size_trigger : Int
/// L2 compaction also requires l1_bytes * ratio >= l2_bytes: the bottom
/// table is only rewritten once L1 grows to a meaningful fraction of it,
/// which keeps write amplification bounded as the store grows.
l2_size_ratio : Int
}
pub fn Options::default() -> Options {
{
memtable_limit: 4_194_304,
block_size: 4096,
l0_compaction_trigger: 4,
l2_size_trigger: 4_194_304,
l2_size_ratio: 4,
}
}
pub fn Options::with_memtable_limit(self : Options, n : Int) -> Options {
{
memtable_limit: n,
block_size: self.block_size,
l0_compaction_trigger: self.l0_compaction_trigger,
l2_size_trigger: self.l2_size_trigger,
l2_size_ratio: self.l2_size_ratio,
}
}
pub fn Options::with_compaction_trigger(self : Options, n : Int) -> Options {
{
memtable_limit: self.memtable_limit,
block_size: self.block_size,
l0_compaction_trigger: n,
l2_size_trigger: self.l2_size_trigger,
l2_size_ratio: self.l2_size_ratio,
}
}
/// Sets the minimum L1 byte size before L2 compaction is considered.
pub fn Options::with_l2_size_trigger(self : Options, n : Int) -> Options {
{
memtable_limit: self.memtable_limit,
block_size: self.block_size,
l0_compaction_trigger: self.l0_compaction_trigger,
l2_size_trigger: n,
l2_size_ratio: self.l2_size_ratio,
}
}
/// Sets the L1/L2 size ratio that gates L2 compaction (see `l2_size_ratio`).
pub fn Options::with_l2_size_ratio(self : Options, n : Int) -> Options {
{
memtable_limit: self.memtable_limit,
block_size: self.block_size,
l0_compaction_trigger: self.l0_compaction_trigger,
l2_size_trigger: self.l2_size_trigger,
l2_size_ratio: n,
}
}