diff --git a/src/db/builder.rs b/src/db/builder.rs index 9140e5e265b0285cbbe94264be27d8895f4aa219..5a35ddcab12b159a317b26b36f41df544298eb6a 100644 --- a/src/db/builder.rs +++ b/src/db/builder.rs @@ -10,7 +10,7 @@ use crate::table::table::Table; use crate::table::table_builder::TableBuilder; use crate::traits::DataIterator; use crate::util::env::Env; -use crate::util::options::{Options, ReadOptions}; +use crate::util::options::{Options, OptionsPtr, ReadOptions}; use crate::util::Result; use crate::util::slice::Slice; use crate::util::status::{LevelError, Status}; @@ -43,7 +43,7 @@ impl BuildTable { /// ``` /// /// ``` - pub fn build_table(dbname: &Slice, env: &Env, options: &Options, + pub fn build_table(dbname: &Slice, env: &Env, options: OptionsPtr, table_cache: &TableCache, mut iter: Box, meta: &mut FileMetaData) -> Result { meta.set_file_size(0); @@ -60,9 +60,9 @@ impl BuildTable { return Err(fileRS.err().unwrap()); } - let writableFile = Arc::new(fileRS.unwrap()); + let writable_file = Arc::new(fileRS.unwrap()); // 生成一个 TableBuilder - let builder: TableBuilder = TableBuilder::new_with_writable_file(options, writableFile); + let builder: TableBuilder = TableBuilder::new_with_writable_file(options, writable_file.clone()); meta.get_smallest().decode_from(&iter.key()); @@ -86,7 +86,7 @@ impl BuildTable { // Finish and check for file errors // 将文件刷新到磁盘 if s.is_ok() { - let rs:io::Result<()> = writableFile.sync_data(); + let rs:io::Result<()> = writable_file.sync_data(); if rs.is_ok() { s = Status::default(); }else{ diff --git a/src/db/builder_test.rs b/src/db/builder_test.rs index 7f1746ad088908cf69e0d0fdf99085b2f097d6d9..46899e30533b29eaa3fe7517b405395bc6b85088 100644 --- a/src/db/builder_test.rs +++ b/src/db/builder_test.rs @@ -7,11 +7,6 @@ mod test { #[test] fn test_build_table() { - - // BuildTable::build_table(&Slice::from("a"), Options::default(), - // TableCache::new(), - // Box::new()); println!("get_name: {}", "a"); - } } \ No newline at end of file diff --git a/src/db/table_cache.rs b/src/db/table_cache.rs index 5824617dad9413a81f2b8101ade86f78583ec507..6fa4804a0af6d0fe47d3ca509c57d7e1bc2abdb7 100644 --- a/src/db/table_cache.rs +++ b/src/db/table_cache.rs @@ -4,7 +4,7 @@ use crate::util::options::ReadOptions; use crate::util::slice::Slice; use crate::util::Result; -struct Saver {} +pub struct Saver {} pub struct TableCache {} @@ -31,9 +31,10 @@ impl TableCache { /// ``` /// /// ``` - pub fn get(&self, _options: &ReadOptions, _file_number: u64, _file_size: usize, _k: &Slice, _arg: &mut Saver, _handle_result: F) - where F: FnMut(&mut Saver, &Slice, &Slice) -> Result<()> { - () + pub fn get(&self, _options: &ReadOptions, _file_number: u64, _file_size: usize, + _k: &Slice, _arg: &mut Saver, _handle_result: F) + where F: FnMut(&mut Saver, &Slice, &Slice) { + todo!() } /// 根据文件号消除缓存 /// diff --git a/src/table/block_builder.rs b/src/table/block_builder.rs index 3ca4eecebd780f8e0d3bcf90d934b046a471cc8a..63166ce7b39b20261d94993ebe19a4ca680305f1 100644 --- a/src/table/block_builder.rs +++ b/src/table/block_builder.rs @@ -1,6 +1,6 @@ use std::fs::File; use std::sync::Arc; -use crate::util::options::Options; +use crate::util::options::{Options, OptionsPtr}; use crate::util::slice::Slice; use crate::util::Result; @@ -13,10 +13,14 @@ use crate::util::status::Status; // Arc会追踪这个指针的所有拷贝,当最后一份拷贝离开作用域时,它就会安全释放内存。 // 智能指针 Box。 box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。 + +/// BlockBuilder 的 `Arc` 别名 +pub type BlockBuilderPtr = Arc; + pub struct BlockBuilder { // 在 BlockBuilder 初始化时,指定的配置项 - options: Box, - index_block_options: Box, + options: OptionsPtr, + index_block_options: OptionsPtr, // SSTable 生成后的文件 file: Arc, @@ -25,13 +29,13 @@ pub struct BlockBuilder { status: Status, // 生成 SSTable 中的数据区域 - data_block: Arc, + data_block: BlockBuilderPtr, // 生成 SSTable 中的数据索引区域 - index_block: Arc, + index_block: BlockBuilderPtr, } impl BlockBuilder { - pub fn new(options: &Options) -> Self { + pub fn new(options: OptionsPtr) -> Self { todo!() } diff --git a/src/table/filter_block.rs b/src/table/filter_block.rs index 625f2c932795420e673a068ebd1d826bf49d0f08..c24694e120e61ab3a8a99086f45a1b8d68a76ffb 100644 --- a/src/table/filter_block.rs +++ b/src/table/filter_block.rs @@ -1,7 +1,7 @@ use std::io::Write; use std::sync::Arc; use crate::traits::coding_trait::CodingTrait; -use crate::traits::filter_policy_trait::FilterPolicy; +use crate::traits::filter_policy_trait::{FilterPolicy, FilterPolicyPtr}; use crate::util::coding::Coding; use crate::util::slice::Slice; @@ -15,8 +15,7 @@ const FILTER_BASE: usize = 1 << FILTER_BASE_LG; /// meta block 构建器 /// pub trait FilterBlock { - #[inline] - fn new_with_policy(policy: Box) -> Self; + fn new_with_policy(policy: FilterPolicyPtr) -> Self; /// /// 构造一个 FilterBlockBuilder @@ -33,8 +32,7 @@ pub trait FilterBlock { /// ``` /// /// ``` - #[inline] - fn new_with_policy_capacity(policy: Box, capacity: usize) -> Self; + fn new_with_policy_capacity(policy: FilterPolicyPtr, capacity: usize) -> Self; /// 设置block的起始位置 /// @@ -49,7 +47,6 @@ pub trait FilterBlock { /// ``` /// filter_block_builder.start_block(1024_u64); /// ``` - #[inline] fn start_block(&mut self, block_offset: u64); fn add_key_from_str(&mut self, key: &str); @@ -78,7 +75,7 @@ pub trait FilterBlock { /// ``` fn finish(&mut self) -> Result; - fn get_policy(&self) -> Box<&dyn FilterPolicy>; + fn get_policy(&self) -> FilterPolicyPtr; fn get_keys(&self) -> Vec; @@ -93,7 +90,7 @@ pub trait FilterBlock { /// SSTable 文件里面的 meta block 构建器, 按内存里面指定的格式整理在内存中 pub struct FilterBlockBuilder { - policy: Box, + policy: FilterPolicyPtr, // Flattened key contents keys: Vec, // Starting index in keys_ of each key @@ -106,7 +103,7 @@ pub struct FilterBlockBuilder { } pub struct FilterBlockReader { - policy: Box, + policy: FilterPolicyPtr, // Pointer to filter data (at block-start) data: Vec, // Pointer to beginning of offset array (at block-end) @@ -118,11 +115,11 @@ pub struct FilterBlockReader { } impl FilterBlock for FilterBlockBuilder { - fn new_with_policy(policy: Box) -> Self { + fn new_with_policy(policy: FilterPolicyPtr) -> Self { FilterBlock::new_with_policy_capacity(policy, 64) } - fn new_with_policy_capacity(policy: Box, capacity: usize) -> Self { + fn new_with_policy_capacity(policy: FilterPolicyPtr, capacity: usize) -> Self { let keys:Vec = Vec::with_capacity(capacity); let start:Vec = Vec::with_capacity(capacity); let result:Vec = Vec::with_capacity(capacity); @@ -187,8 +184,8 @@ impl FilterBlock for FilterBlockBuilder { Ok(Slice::from_buf(&self.result)) } - fn get_policy(&self) -> Box<&dyn FilterPolicy> { - Box::new(self.policy.as_ref()) + fn get_policy(&self) -> FilterPolicyPtr { + self.policy.clone() } fn get_keys(&self) -> Vec { @@ -257,7 +254,7 @@ impl FilterBlockBuilder { } impl FilterBlockReader { - pub fn new_with_policy(policy: Box, contents: Slice) -> Self { + pub fn new_with_policy(policy: FilterPolicyPtr, contents: Slice) -> Self { let data = Vec::new(); let offset = Vec::new(); @@ -292,8 +289,8 @@ impl FilterBlockReader { todo!() } - pub fn get_policy(&self) -> Box<&dyn FilterPolicy> { - Box::new(self.policy.as_ref()) + pub fn get_policy(&self) -> FilterPolicyPtr { + self.policy.clone() } pub fn get_data(&self) -> Vec { diff --git a/src/table/filter_block_test.rs b/src/table/filter_block_test.rs index 9582b2a04357e36822726bd7302c5822c75cf463..23506196fcc758d919834ae36258e569d3477d23 100644 --- a/src/table/filter_block_test.rs +++ b/src/table/filter_block_test.rs @@ -113,9 +113,10 @@ mod test { #[test] fn test_filter_block_new_with_policy() { - let policy = Box::new(TestHashFilter::new()); + let policy: Arc> = Arc::new(Box::new(TestHashFilter::new())); - let filter_block: FilterBlockBuilder = FilterBlockBuilder::new_with_policy(policy, 10); + let filter_block: FilterBlockBuilder = FilterBlockBuilder:: + new_with_policy_capacity(policy, 10); let fp = filter_block.get_policy(); let filter_policy_name = fp.name(); @@ -129,10 +130,10 @@ mod test { #[test] fn test_filter_block_reader_new_with_policy_empty_content() { - let policy = Box::new(TestHashFilter::new()); + let policy: Arc> = Arc::new(Box::new(TestHashFilter::new())); let contents = Slice::default(); - let filter_block_reader: FilterBlockReader = FilterBlockReader::new_with_policy(policy, contents); + let filter_block_reader: FilterBlockReader = FilterBlockReader::new_with_policy(policy, contents); let fp_reader = filter_block_reader.get_policy(); let _reader_filter_policy_name = fp_reader.name(); @@ -145,8 +146,8 @@ mod test { #[test] fn test_filter_block_new_with_policy_and_addkey() { - let policy = Box::new(TestHashFilter::new()); - let mut filter_block_builder: FilterBlockBuilder = FilterBlockBuilder::new_with_policy( + let policy: Arc> = Arc::new(Box::new(TestHashFilter::new())); + let mut filter_block_builder: FilterBlockBuilder = FilterBlockBuilder::new_with_policy_capacity( policy, 10); filter_block_builder.start_block(100); diff --git a/src/table/table_builder.rs b/src/table/table_builder.rs index 4615fdc6e527b73ca0e8c667959967e213119172..7e0155e1e9e398cb2785e31af88a0764e7c6a1ce 100644 --- a/src/table/table_builder.rs +++ b/src/table/table_builder.rs @@ -5,7 +5,7 @@ use crate::table::block_builder::BlockBuilder; use crate::table::filter_block::{FilterBlock, FilterBlockBuilder}; use crate::table::format::BlockHandle; use crate::traits::filter_policy_trait::FilterPolicy; -use crate::util::options::{CompressionType, Options}; +use crate::util::options::{CompressionType, OptionsPtr, Options}; use crate::util::slice::Slice; use crate::util::status::Status; use crate::util::unsafe_slice::UnsafeSlice; @@ -16,8 +16,8 @@ pub struct TableBuilder { /// TableBuilder Rep 结构体, 内部使用 struct Rep<> { - options: Box, - index_block_options: Box, + options: OptionsPtr, + index_block_options: OptionsPtr, // SSTable 生成后的文件 file: Arc, @@ -47,8 +47,8 @@ struct Rep<> { } impl TableBuilder { - pub fn new_with_writable_file(options: &Options, writableFile: Arc) -> Self { - let rep = Rep::new(options, writableFile); + pub fn new_with_writable_file(options: OptionsPtr, writable_file: Arc) -> Self { + let rep = Rep::new(options, writable_file); // Self { // rep @@ -95,34 +95,30 @@ impl TableBuilder { } impl Rep { - pub fn new(opt: &Options, writableFile: Arc) -> Self { - // todo 如何赋值? Box::new(opt) - let options = Box::new(Default::default()); - let index_block_options = Box::new(Default::default()); - + pub fn new(opt: OptionsPtr, writableFile: Arc) -> Self { let mut filter_block: Option; if opt.filter_policy.is_none() { filter_block = None; }else { - filter_block = Some(FilterBlockBuilder::new_with_policy(opt.filter_policy.unwrap())); + filter_block = Some(FilterBlockBuilder::new_with_policy(opt.filter_policy.clone().unwrap())); } Self { - options, - index_block_options, + options: opt.clone(), + index_block_options: opt.clone(), file: writableFile, offset: 0, // default Status::OK status: Status::default(), - data_block: BlockBuilder::new(&options.as_ref()), - index_block: BlockBuilder::new(&index_block_options.as_ref()), - last_key: Default::default(), + data_block: BlockBuilder::new(opt.clone()), + index_block: BlockBuilder::new(opt.clone()), + last_key: Slice::default(), num_entries: 0, closed: false, filter_block, pending_index_entry: false, - pending_handle: Default::default(), - compressed_output: Default::default(), + pending_handle: BlockHandle::default(), + compressed_output: Slice::default(), } } } \ No newline at end of file diff --git a/src/traits/filter_policy_trait.rs b/src/traits/filter_policy_trait.rs index 3920604d71a533583b8243645d75dbc1886191b8..aaafafd2b0af82d7bbf3435e74b3922bf0be716c 100644 --- a/src/traits/filter_policy_trait.rs +++ b/src/traits/filter_policy_trait.rs @@ -1,5 +1,10 @@ +use std::sync::Arc; use crate::util::slice::Slice; + +/// FilterPolicy 的 `Arc>` 别名 +pub type FilterPolicyPtr = Arc>; + /// 用于key过滤,可以快速的排除不存在的key pub trait FilterPolicy { diff --git a/src/util/options.rs b/src/util/options.rs index 4764b888de7c214ba7cffd672dbe2c044cdd3fd2..ba51a8c5c24ad601eddb986b0e573d2bf6775c60 100644 --- a/src/util/options.rs +++ b/src/util/options.rs @@ -2,10 +2,13 @@ use std::sync::Arc; use crate::db::db::Snapshot; use crate::db::db_format::InternalKeyComparator; use crate::traits::comparator_trait::Comparator; -use crate::traits::filter_policy_trait::FilterPolicy; +use crate::traits::filter_policy_trait::{FilterPolicy, FilterPolicyPtr}; use crate::util::comparator::BytewiseComparatorImpl; use crate::util::env::Env; +/// Options 的 `Arc>` 别名 +pub type OptionsPtr = Arc>; + pub enum CompressionType { NoCompression, SnappyCompression @@ -17,6 +20,9 @@ pub struct Cache {} // use crate::traits::filter_policy_trait::FilterPolicy; // pub struct FilterPolicy {} +// pub cmp: Box, +// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `dyn Comparator` +// #[derive(Clone)] pub struct Options { /// Comparator used to define the order of keys in the table. @@ -98,7 +104,7 @@ pub struct Options { /// If non-null, use the specified filter policy to reduce disk reads. /// Many applications will benefit from passing the result of /// NewBloomFilterPolicy() here. - pub filter_policy: Option>, + pub filter_policy: Option, } /// Options that control read operations pub struct ReadOptions {