use bytesize::ByteSize;
use weedb::Caches;
use weedb::rocksdb::{BlockBasedOptions, DBCompressionType, DataBlockIndexType, Options};
use super::TableContext;
pub const DEFAULT_MIN_BLOB_SIZE: u64 = bytesize::KIB * 32;
pub fn default_block_based_table_factory<C: AsRef<Caches>>(opts: &mut Options, ctx: &C) {
let caches = ctx.as_ref();
opts.set_level_compaction_dynamic_level_bytes(true);
let mut block_factory = BlockBasedOptions::default();
block_factory.set_block_cache(&caches.block_cache);
block_factory.set_format_version(6);
opts.set_block_based_table_factory(&block_factory);
}
pub fn optimize_for_point_lookup<C: AsRef<Caches>>(opts: &mut Options, ctx: &C) {
let caches = ctx.as_ref();
let mut block_factory = BlockBasedOptions::default();
block_factory.set_data_block_index_type(DataBlockIndexType::BinaryAndHash);
block_factory.set_data_block_hash_ratio(0.75);
block_factory.set_bloom_filter(10.0, false);
block_factory.set_block_cache(&caches.block_cache);
opts.set_block_based_table_factory(&block_factory);
opts.set_memtable_prefix_bloom_ratio(0.02);
opts.set_memtable_whole_key_filtering(true);
}
pub fn optimize_for_level_compaction(
opts: &mut Options,
ctx: &TableContext,
buffer_size: ByteSize,
buffer_count: usize,
) {
const MIN_BUFFERS_TO_MERGE: u64 = 2;
let min_budget = buffer_size.0.saturating_mul(MIN_BUFFERS_TO_MERGE);
let max_budget = buffer_size.0.saturating_mul(buffer_count as _);
opts.set_write_buffer_size(buffer_size.0 as _);
opts.set_min_write_buffer_number_to_merge(MIN_BUFFERS_TO_MERGE as _);
opts.set_max_write_buffer_number(buffer_count as _);
opts.set_level_zero_file_num_compaction_trigger(2);
opts.set_target_file_size_base(max_budget / 8);
opts.set_max_bytes_for_level_base(max_budget);
ctx.track_buffer_usage(ByteSize(min_budget), ByteSize(max_budget));
}
pub fn zstd_block_based_table_factory<C: AsRef<Caches>>(opts: &mut Options, ctx: &C) {
let caches = ctx.as_ref();
let mut block_factory = BlockBasedOptions::default();
block_factory.set_block_cache(&caches.block_cache);
opts.set_block_based_table_factory(&block_factory);
opts.set_compression_type(DBCompressionType::Zstd);
}
pub fn with_blob_db(opts: &mut Options, min_value_size: u64, compression_type: DBCompressionType) {
opts.set_enable_blob_files(true);
opts.set_enable_blob_gc(true);
opts.set_min_blob_size(min_value_size);
opts.set_blob_compression_type(compression_type);
}