LevelDB源码分析--Cache及Get查找流程
时间:2022-03-10 17:52
本打算接下来分析version相关的概念,但是在准备的过程中看到了VersionSet的table_cache_这个变量才想起还有这样一个模块尚未分析,经过权衡觉得leveldb的version相对Cache来说相对复杂,而且version虽然对整个leveldb来说实现上跟其他功能十分紧密,但是从概念上来说却相对弱很多,有点感觉是附加的功能的感觉。所以从介绍系统首先应该注意的是整个系统概念的完整性的角度说还是先分析Cache相关的功能。
我们先来看Cache的基本框架结构数据:
Status Version::Get(const ReadOptions& options, const LookupKey& k, std::string* value, GetStats* stats) { // 从0级开始一级一级查找,0级最新,1级次新,依次更旧, //所以查找的时候不能跳跃级别 ,找到最新的数据以后旧的数据就不在需要了 for (int level = 0; level < config::kNumLevels; level++) { size_t num_files = files_[level].size(); if (num_files == 0) continue; //取得文件句柄 FileMetaData* const* files = &files_[level][0]; if (level == 0) { // Level-0 需要查找全部文件,因为level-0中可能存在重叠 for (uint32_t i = 0; i < num_files; i++) { FileMetaData* f = files[i]; if (ucmp->Compare(user_key, f->smallest.user_key()) >= 0 && ucmp->Compare(user_key, f->largest.user_key()) <= 0) { tmp.push_back(f); } } //按文件新旧程度排序,新的在最前面 std::sort(tmp.begin(), tmp.end(), NewestFirst); files = &tmp[0]; num_files = tmp.size(); } else { // 找到第一个 largest key >= ikey的文件(SSTable). uint32_t index = FindFile(vset_->icmp_, files_[level], ikey); tmp2 = files[index]; if (ucmp->Compare(user_key, tmp2->smallest.user_key()) < 0) { // 不在该文件中 files = NULL; num_files = 0; } else { files = &tmp2; num_files = 1; } } //找到具体的SSTable以后在该SSTable的缓存中进行具体查找 s = vset_->table_cache_->Get(options, f->number, f->file_size, ikey, &saver, SaveValue); switch (saver.state) { case kNotFound: break; // 继续查找,知道找出的所有文件都查找完 case kFound: return s; case kDeleted: s = Status::NotFound(Slice()); // 已经被删除,直接返回 return s; case kCorrupt: s = Status::Corruption("corrupted key for ", user_key); return s; } } } return Status::NotFound(Slice()); // Use an empty error message for speed }
LevelDB源码分析--Cache及Get查找流程,布布扣,bubuko.com