10 Version分析之2
10.5 Version::UpdateStats()
Stat表明在指定key range查找key时,都要先seek此文件,才能在后续的sstable文件中找到key。
该函数是将stat记录的sstable文件的allowed_seeks减1,减到0就执行compaction。也就是说如果文件被seek的次数超过了限制,表明读取效率已经很低,需要执行compaction了。所以说allowed_seeks是对compaction流程的有一个优化。
函数声明:boolVersion::UpdateStats(const GetStats& stats)
函数逻辑很简单:
FileMetaData* f =stats.seek_file;
if (f != NULL) {
f->allowed_seeks--;
if (f->allowed_seeks <=0 && file_to_compact_ == NULL) {
file_to_compact_ = f;
file_to_compact_level_ =stats.seek_file_level;
return true;
}
}
return false;
变量allowed_seeks的值在sstable文件加入到version时确定,也就是后面将遇到的VersionSet::Builder::Apply()函数。
10.6 Version::GetOverlappingInputs()
void Version::GetOverlappingInputs(int level,
const InternalKey* begin, constInternalKey* end, std::vector<FileMetaData*>* inputs)
要注意的是,对于level0,由于文件可能有重合,其处理具有特殊性。当在level 0中找到有sstable文件和[begin, end]重合时,会相应的将begin/end扩展到文件的min key/max key,然后重新开始搜索。
了解了功能,下面分析函数实现代码,逻