-
Version及相关的Version-set,Version-edit是leveldb中最重要的概念之一。
leveldb的写入过程可以看做有前端任务和后端任务,前端任务被用户程序调用,完成将用户key写入缓存队列,写入log,写入memtable,后端任务即进行compaction。将imem写入sst,合并sst。
Version相关的类主要为后端任务调用,完成compaction。
Version
- 保存了db中sst文件的元信息,提供对sst文件的查询等功能,另外Version还为Compact提供数据支持。 Version-set
- 是Version的集合,随着db的使用,sst文件会发生合并,新增,db呈现为不同的版本,Version-set集合了各个版本。 Version-edit
- 是Version变化的delt
源码分析
version类
-
成员变量
-
VersionSet* vset_
指向version set
-
Version* next_
-
Version* prev_
-
int ref_
version被引用的次数
-
vector < FileMetaData*> files_[config::kNumLevels]
SST文件的元信息,二维数组,每一个level是一个vector
-
FileMetaData* file_to_compact_ ; int file_to_compack_level
由Seek触发的,下一次compact的sst文件和对应的level
-
double compaction_score_;int compaction_level_
下一次要compact的level和对应的score
主要方法
-
Status Get(const ReadOptions&, const LookupKey& key, std::string* val, GetStats* stats)
获取key对应的value
-
bool UpdateStats(const GetStats& stats);
将stats 更新到version,stats记录了seek的结果,包括sts文件信息和seek的level
-
bool RecordReadSample(Slice key);
取样式get一个key,通过get,来判断当前是否需要触发compact
-
void Ref(); void UnRef();
增加和减少一个引用,增加引用就是在ref_ 上加一,减少引用时可能会通过delete this删除自身
-
void GetOverlappingInputs(int level,const InternalKey* begin,const InternalKey* end,std::vector < FileMetaData*>* inputs)
在level中的sst文件中,找到所有与[begin,start]有重合的file,并将其放在inputs中作为返回参数,对于level0,如果begin和start不是正好和返回的file的range重合或者是其子集,那么begin和end会被扩充,然后重新search整个level。
如果begin或者end 为null,即表示对应的边界为无穷小或者无穷大 -
bool OverlapInLevel(int level, const Slice* smallest_user_key,const Slice* largest_user_key)
判断level中的文件,是否有与指定range重合的
-
int PickLevelForMemTableOutput(const Slice& smallest_user_key,const Slice& largest_user_key);
从level0开始,逐层判断此层是否存在与[smallest,largest]有重合的file,找到第一个存在的level,返回,即便某层没有重合的file,如果其level+1层,与此range有重合的file的total size超过了某个值,则停止搜索,返回此层。
这样做的目的是为了防止覆盖过多的level+1层(grandparents)文件导致compact时过多的IO?? -
Iterator* NewConcatenatingIterator(const ReadOptions&, int level) const
返回一个双层迭代器,第一层用来遍历对应level的所有文件,第二层用来遍历某个文件的cache中的k-v,使用此双层迭代器,可以方便的遍历一个level中所有的k-v
-
void ForEachOverlapping(Slice user_key, Slice internal_key,void* arg,bool (func)(void, int, FileMetaData*));
对于所有包含user-key的file,按照从新到旧的顺序,应用func函数,直到func返回为false
VersionSet类
-
主要成员
-
TableCache* const table_cache_ 读取version中的文件时,其实是从cache中读取