10 Version分析之1
Version不会修改其管理的sstable文件,只有读取操作。
10.1 Version接口
先来看看Version类的接口函数,接下来再一一分析。
// 追加一系列iterator到 @*iters中,将在merge到一起时生成该Version的内容
// 要求: Version已经保存了(见VersionSet::SaveTo)
void AddIterators(constReadOptions&, std::vector<Iterator*>* iters);
// 给定@key查找value,如果找到保存在@*val并返回OK。
// 否则返回non-OK,设置@ *stats.
// 要求:没有hold lock
struct GetStats {
FileMetaData* seek_file;
int seek_file_level;
};
Status Get(constReadOptions&, const LookupKey& key, std::string* val,GetStats* stats);
// 把@stats加入到当前状态中,如果需要触发新的compaction返回true
// 要求:hold lock
bool UpdateStats(constGetStats& stats);
void GetOverlappingInputs(intlevel,
const InternalKey*begin, // NULL 指在所有key之前
const InternalKey* end, // NULL指在所有key之后
std::vector<FileMetaData*>* inputs);
// 如果指定level中的某些文件和[*smallest_user_key,*largest_user_key]有重合就返回true。
// @smallest_user_key==NULL表示比DB中所有key都小的key.
// @largest_user_key==NULL表示比DB中所有key都大的key.
bool OverlapInLevel(int level,const Slice*smallest_user_key, const Slice* largest_user_key);
// 返回我们应该在哪个level上放置新的memtable compaction,
// 该compaction覆盖了范围[smallest_user_key,largest_user_key].
int PickLevelForMemTableOutput(const Slice& smallest_user_key,
const Slice& largest_user_key);
int NumFiles(int level) const {return files_[level].size(); } // 指定level的sstable个数
10.2 Version::AddIterators()
DBImpl::NewIterator()->DBImpl::NewInternalIterator()->Version::AddIterators()。
函数功能是为该Version中的所有sstable都创建一个Two Level Iterator,以遍历sstable的内容。
对于level=0级别的sstable文件,直接通过TableCache::NewIterator()接口创建,这会直接载入sstable文件到内存cache中。
对于level>0级别的sstable文件,通过函数NewTwoLevelIterator()创建一个TwoLevelIterator,这就使用了lazy open的机制。
下面来分析函数代码:
S1 对于l