diff --git a/db/db_impl.cc b/db/db_impl.cc index 2353227..a6b09a2 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -146,12 +146,14 @@ DBImpl::DBImpl(const Options& raw_options, const std::string& dbname) tmp_batch_(new WriteBatch), background_compaction_scheduled_(false), manual_compaction_(nullptr), + // TODO(begin) versions_(new VersionSet(dbname_, &options_, table_cache_, &internal_comparator_)), slot_page_(new SlotPage(dbname)) { vlog_set_ = new VlogSet(dbname, nullptr); vlog_set_->set_vlog_gc(new VlogGC(slot_page_, vlog_set_)); + // TODO(end) } DBImpl::~DBImpl() { @@ -181,9 +183,10 @@ DBImpl::~DBImpl() { if (owns_cache_) { delete options_.block_cache; } - + // TODO(begin) delete slot_page_; delete vlog_set_; + // TODO(end) } Status DBImpl::NewDB() { @@ -1174,14 +1177,14 @@ Status DBImpl::Get(const ReadOptions& options, const Slice& key, if (imm != nullptr) imm->Unref(); current->Unref(); - // TODO: search the slotpage and get value from vlog + // TODO(begin): search the slotpage and get value from vlog size_t slot_num = *(size_t *)value->c_str(); struct slot_content sc; std::string vlog_value; slot_page_->get_slot(slot_num, &sc); vlog_set_->get_value(sc.vlog_num, sc.value_offset, &vlog_value); *value = vlog_value; - + // TODO(end) return s; } @@ -1216,7 +1219,7 @@ void DBImpl::ReleaseSnapshot(const Snapshot* snapshot) { // Convenience methods Status DBImpl::Put(const WriteOptions& o, const Slice& key, const Slice& val) { - // TODO: allocate slot_num in slotpage and put value in vlog + // TODO(begin): allocate slot_num in slotpage and put value in vlog size_t slot_num = slot_page_->alloc_slot(); struct slot_content sc; @@ -1228,9 +1231,11 @@ Status DBImpl::Put(const WriteOptions& o, const Slice& key, const Slice& val) { Slice slot_val(data, sizeof(data)); return DB::Put(o, key, slot_val); + // TODO(end) } Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { + // TODO(begin) // size_t slot_num = *(size_t *)value->c_str(); // struct slot_content sc; // std::string vlog_value; @@ -1248,7 +1253,7 @@ Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { std::string vlog_value; slot_page_->get_slot(slot_num, &sc); vlog_set_->del_value(sc.vlog_num, sc.value_offset); - + // TODO(end) return DB::Delete(options, key); } diff --git a/db/db_impl.h b/db/db_impl.h index 9b74668..f6917e6 100644 --- a/db/db_impl.h +++ b/db/db_impl.h @@ -78,10 +78,10 @@ class DBImpl : public DB { friend class DB; struct CompactionState; struct Writer; - + // TODO(begin) SlotPage *slot_page_; VlogSet *vlog_set_; - + // TODO(end) // Information for a manual compaction struct ManualCompaction { int level; diff --git a/report.md b/report.md index 351a904..d0b31e6 100644 --- a/report.md +++ b/report.md @@ -61,7 +61,25 @@ 3. slot_page文件和vlog文件的GC 对于vlog文件,我们在内存中维护一个bitmap,用来表示每一个slot的使用情况,并在插入和GC删除kv时进行动态的分配和释放。对于vlog文件的GC,我们用一个后台线程来扫描所有vlog的discard计数器。当某些vlog的discard计数器超过某个阈值(比如1024),我们就对这些vlog文件进行GC过程,当GC完成之后将slot_page中的slot元数据进行更新,再将原来的vlog文件进行删除,GC过程就完成了。 - +##### 2.2.1 相关代码文件 +- [`/db/db_impl.cc`](./db/db_impl.cc) +- [`/db/db_impl.h`](./db/db_impl.h) +- +- [`/db/shared_lock.h`](./db/shared_lock.h) 定义了一个 SharedLock 类,用于实现读写锁机制,包含四种操作:soft_lock():获取共享读锁,确保在没有写操作时允许多个读操作并发进行;soft_unlock():释放共享读锁;hard_lock():获取独占写锁,确保只有当没有其他读写操作时,允许写入操作进行;hard_unlock():释放独占写锁。 +- [`/db/slotpage.h`](./db/slotpage.h) +- [`/db/threadpool.h`](./db/threadpool.h) +- [`/db/vlog.h`](./db/vlog.h) +- [`/db/vlog_gc.cpp`](./db/vlog_gc.cpp) +- [`/db/vlog_gc.h`](./db/vlog_gc.h) +- [`/db/vlog_set.cpp`](./db/vlog_set.cpp) +- [`/db/vlog_set.h`](./db/vlog_set.h) +- +- [`/test/db_test3.cc`](./test/db_test3.cc):测试 value 的字段功能 +- [`/test/db_test4.cc`](./test/db_test4.cc) +- [`/test/db_test5.cc`](./test/db_test5.cc) +- +- [`CMakeLists.txt`](CMakeLists.txt):添加可执行文件 +### 锁机制 ### 3. 数据结构设计 `key的格式:| key | slot_num | `