diff --git a/README.md b/README.md index 373c322b81e5f96d9b67bd4310f5ab3759bc10c1..c31a5a8f45bee2d97f083203d49430375b6c3e1b 100644 --- a/README.md +++ b/README.md @@ -67,30 +67,30 @@ LSM tree 是许多 KV型或日志型数据库所依赖的核心实现,例如Bi ### 1.1.0 1.1.0 版本, 完成基础零部件 -| 功能模块 | 完成人 | 进度 | -|----------------------------------------------------------------------------------|-------------|-----| -| util.Options(ReadOptions, WriteOptions) | kazeseiriou | | -| util.ENV(WritableFile, SequentialFile, RandomAccessFile, FileLock) | lxd5866 | | -| util.Logger | peach | | -| table.Block, BlockBuilder, FilterBlockBuilder | colagy | | -| FilterBlock, FilterBlockReader | colagy | | -| table.format(Footer, BlockHandle) | fengyang | | -| db.dbformat(InternalKeyComparator, InternalFilterPolicy, LookupKey, InternalKey) | fengyang | | -| db.SkipList | wangboo | | -| table.Iterator(DBIter, MergingIterator, TwoLevelIterator...) | kazeseiriou | | -| IteratorWrapper | kazeseiriou | | -| db.MemTable(MemTable, MemTableIterator) | wangboo | | -| SSTable | fengyang | | -| table.Table | peach | | -| db.leveldb_util | hui | | -| db.log_format | hui | | -| db.LogReader | wangboo | 90% | -| db.LogWriter | wangboo | 90% | -| db.TableCache | colagy | | -| LinkedList | fengyang | | -| db.VersionEdit(Tag, VersionEdit, FileMetaData) | fengyang | | -| db.VersionSet(Version, LevelFileNumIterator, SaverState) | fengyang | | -| WriteBatch | peach | | +| 功能模块 | 完成人 | 进度 | +|----------------------------------------------------------------------------------|--------------|-----| +| util.Options(ReadOptions, WriteOptions) | kazeseiriou | | +| util.ENV(WritableFile, SequentialFile, RandomAccessFile, FileLock) | lxd5866 | | +| util.Logger | peach | | +| table.Block, BlockBuilder, FilterBlockBuilder | colagy | | +| FilterBlock, FilterBlockReader | colagy | | +| table.format(Footer, BlockHandle) | fengyang、半支烟 | | +| db.dbformat(InternalKeyComparator, InternalFilterPolicy, LookupKey, InternalKey) | fengyang、半支烟 | | +| db.SkipList | wangboo | | +| table.Iterator(DBIter, MergingIterator, TwoLevelIterator...) | kazeseiriou | | +| IteratorWrapper | kazeseiriou | | +| db.MemTable(MemTable, MemTableIterator) | wangboo | | +| SSTable | fengyang | | +| table.Table | peach | | +| db.leveldb_util | wangboo | | +| db.log_format | wangboo | | +| db.LogReader | wangboo | 90% | +| db.LogWriter | wangboo | 90% | +| db.TableCache | colagy | | +| LinkedList | fengyang | | +| db.VersionEdit(Tag, VersionEdit, FileMetaData) | fengyang | | +| db.VersionSet(Version, LevelFileNumIterator, SaverState) | fengyang | | +| WriteBatch | peach | | #### 1.1.0 计划 * 完成gitee -> github (同步) 主仓库gitee diff --git a/src/db/file_meta_data.rs b/src/db/file_meta_data.rs index 7747ac3ce029be8a9ea6994a599f2e9e8deb6297..bc67682954616e298755d3232aff10decc9772d9 100644 --- a/src/db/file_meta_data.rs +++ b/src/db/file_meta_data.rs @@ -6,6 +6,7 @@ use crate::db::db_format::{InternalKey, InternalKeyComparator}; /// @see version_edit FileMetaData #[derive(Debug)] pub struct FileMetaData { + // todo 参考rc的实现 refs: i32, // Seeks allowed until compaction allowed_seeks: i32, @@ -18,11 +19,6 @@ pub struct FileMetaData { largest: InternalKey } -#[allow(improper_ctypes)] -extern { - fn memcmp(s1: *const i32, s2: *const i32) -> i32; -} - impl Default for FileMetaData { #[inline] fn default() -> Self { @@ -38,28 +34,30 @@ impl Default for FileMetaData { } impl FileMetaData { - pub fn create_refs(refs: i32) -> Self { - FileMetaData::create_refs_allowed_seeks(refs, 1 << 30) + #[inline] + pub fn new_with_refs(refs: i32) -> Self { + FileMetaData::new_with_refs_allowed_seeks(refs, 1 << 30) } - pub fn create_refs_allowed_seeks(refs: i32, allowed_seeks: i32) -> Self { - FileMetaData::create_refs_allowed_seeks_file_size(refs, allowed_seeks, 0) + #[inline] + pub fn new_with_refs_allowed_seeks(refs: i32, allowed_seeks: i32) -> Self { + FileMetaData::new_with_refs_allowed_seeks_file_size(refs, allowed_seeks, 0) } - pub fn create_refs_allowed_seeks_file_size(refs: i32, allowed_seeks: i32, file_size: u64) -> Self { - FileMetaData::create_refs_allowed_seeks_file_size_internal_key(refs, allowed_seeks, file_size, InternalKey::default(), InternalKey::default()) + pub fn new_with_refs_allowed_seeks_file_size(refs: i32, allowed_seeks: i32, file_size: u64) -> Self { + FileMetaData::new_with_refs_allowed_seeks_file_size_internal_key(refs, allowed_seeks, file_size, InternalKey::default(), InternalKey::default()) } - pub fn create_refs_allowed_seeks_file_size_internal_key(refs: i32, allowed_seeks: i32, file_size: u64, + pub fn new_with_refs_allowed_seeks_file_size_internal_key(refs: i32, allowed_seeks: i32, file_size: u64, smallest: InternalKey, largest: InternalKey) -> Self { - FileMetaData::create(refs, allowed_seeks, 0, file_size, smallest, largest) + FileMetaData::new(refs, allowed_seeks, 0, file_size, smallest, largest) } - pub fn create_number_file_size_internal_key(number: u64, file_size: u64, smallest: InternalKey, largest: InternalKey) -> Self { - FileMetaData::create(0, 1 << 30, number, file_size, smallest, largest) + pub fn new_with_number_file_size_internal_key(number: u64, file_size: u64, smallest: InternalKey, largest: InternalKey) -> Self { + FileMetaData::new(0, 1 << 30, number, file_size, smallest, largest) } - pub fn create(refs: i32, allowed_seeks: i32, number: u64, file_size: u64, smallest: InternalKey, largest: InternalKey) -> Self { + pub fn new(refs: i32, allowed_seeks: i32, number: u64, file_size: u64, smallest: InternalKey, largest: InternalKey) -> Self { Self { refs, allowed_seeks, diff --git a/src/db/file_meta_data_test.rs b/src/db/file_meta_data_test.rs index 2889a1ae123f3bb49928cd4daece107397a0b896..7c1b079b0c7bb1663718333dcadb8b7e5b171d4b 100644 --- a/src/db/file_meta_data_test.rs +++ b/src/db/file_meta_data_test.rs @@ -7,8 +7,8 @@ mod test { fn test_eq() { let meta1: FileMetaData = FileMetaData::default(); let meta2: FileMetaData = FileMetaData::default(); - let meta3: FileMetaData = FileMetaData::create_refs(6); - let meta3_1: FileMetaData = FileMetaData::create_refs(6); + let meta3: FileMetaData = FileMetaData::new_with_refs(6); + let meta3_1: FileMetaData = FileMetaData::new_with_refs(6); assert!(meta1.eq(&meta2)); assert!(!meta1.eq(&meta3)); @@ -19,9 +19,9 @@ mod test { fn test_partial_ord() { let meta0: FileMetaData = FileMetaData::default(); let meta0_1: FileMetaData = FileMetaData::default(); - let meta3: FileMetaData = FileMetaData::create_refs(3); - let meta6: FileMetaData = FileMetaData::create_refs(6); - let meta7: FileMetaData = FileMetaData::create_refs(7); + let meta3: FileMetaData = FileMetaData::new_with_refs(3); + let meta6: FileMetaData = FileMetaData::new_with_refs(6); + let meta7: FileMetaData = FileMetaData::new_with_refs(7); assert!(meta0.partial_cmp(&meta0_1).is_some()); } diff --git a/src/db/version_edit.rs b/src/db/version_edit.rs index 14be86f66d27498610039c162c1aa779f8b59a09..e820e778d9c66e6d1b9c3c9349b33411a9792c30 100644 --- a/src/db/version_edit.rs +++ b/src/db/version_edit.rs @@ -106,7 +106,7 @@ impl VersionEdit { /// /// ``` fn add_file(&mut self, level: u32, file: u64, file_size: u64, smallest: InternalKey, largest: InternalKey) { - let file_meta_data = FileMetaData::create_number_file_size_internal_key(file, file_size, smallest, largest); + let file_meta_data = FileMetaData::new_with_number_file_size_internal_key(file, file_size, smallest, largest); self.new_files_.push((level, file_meta_data)); } diff --git a/src/db/version_set.rs b/src/db/version_set.rs index 9c7a7088f6f13d2864498dfe7fdb440f130bad26..15dabb08fee721512b2ddc46b95a5cc0cf463376 100644 --- a/src/db/version_set.rs +++ b/src/db/version_set.rs @@ -95,7 +95,7 @@ pub struct Compaction { // .h line 68 - 71 struct GetStats { - seek_file: FileMetaData, + seek_file: Rc, seek_file_level: i32 } @@ -112,7 +112,7 @@ struct LevelFileNumIterator { // line 604 pub struct Builder { - vset_: VersionSet, + vset_: Rc, // VersionSet* ; // Version* base_; @@ -133,20 +133,16 @@ struct LevelState { } impl Version { - fn create(vset: VersionSet) -> Self { + fn new(vset: Rc) -> Self { todo!() } fn set_next(&mut self, data: &Rc) -> bool { - self.next_ = (*data).clone().into(); - - true + todo!() } fn set_prev(&mut self, data: &Rc) -> bool { - self.prev_ = (*data).clone().into(); - - true + todo!() } fn get_refs(&self) -> i32 { @@ -173,7 +169,7 @@ impl Version { /// ``` /// /// ``` - fn add_iterators(&self, options: ReadOptions, /* iters: Vec */) { + fn add_iterators(&self, options: ReadOptions, /* mut iters: Vec */) { todo!() } @@ -214,7 +210,7 @@ impl Version { /// ``` /// /// ``` - fn update_stats(&self, stats: GetStats) -> bool{ + fn update_stats(&mut self, stats: GetStats) -> bool{ todo!() } @@ -313,7 +309,7 @@ impl Drop for Version { // //. // } -impl<'a> VersionSet { +impl VersionSet { /// 返回文件源数据中最小的索引。 如果文件不存在,则返回文件数量 /// /// Return the smallest index i such that files[i]->largest >= key. @@ -333,7 +329,7 @@ impl<'a> VersionSet { /// ``` /// /// ``` - fn find_file(icmp: Box, files:Vec, key:Slice) -> u32 { + fn find_file(icmp: &InternalKeyComparator, files:&Vec, key:&Slice) -> u32 { todo!() } @@ -363,8 +359,8 @@ impl<'a> VersionSet { /// ``` /// /// ``` - fn some_file_overlaps_range(icmp: Box, disjoint_sorted_files:bool, - files:Vec, smallest_user_key:Slice,largest_user_key:Slice) -> bool { + fn some_file_overlaps_range(icmp: &InternalKeyComparator, disjoint_sorted_files:bool, + files:&Vec, smallest_user_key:&Slice,largest_user_key:&Slice) -> bool { todo!() } } @@ -414,6 +410,6 @@ impl BySmallestKey { } // Break ties by file number - return f1.get_number() < f2.get_number(); + f1.get_number() < f2.get_number() } } \ No newline at end of file