ntain data for // "ikey". break; } } else { // "ikey" falls in the range for this table. Add the // approximate offset of "ikey" within the table. Table* tableptr; Iterator* iter = table_cache_->NewIterator( ReadOptions(), files[i]->number, files[i]->file_size, &tableptr); if (tableptr != NULL) { result += tableptr->ApproximateOffsetOf(ikey.Encode()); } delete iter; } } } return result; }
在version中寻找ikey的记录,返回偏移量,因为sstable间entries是不重复的,所以可以通过判断ikey和largest key的大小得到结果。
void VersionSet::AddLiveFiles(std::set
* live) { for (Version* v = dummy_versions_.next_; v != &dummy_versions_; v = v->next_) { for (int level = 0; level < config::kNumLevels; level++) { const std::vector
& files = v->files_[level]; for (size_t i = 0; i < files.size(); i++) { live->insert(files[i]->number); } } } }
求得所有version中的sstable的文件节点,放置在lives序列中。
void VersionSet::GetRange(const std::vector
& inputs, InternalKey* smallest, InternalKey* largest) { assert(!inputs.empty()); smallest->Clear(); largest->Clear(); for (size_t i = 0; i < inputs.size(); i++) { FileMetaData* f = inputs[i]; if (i == 0) { *smallest = f->smallest; *largest = f->largest; } else { if (icmp_.Compare(f->smallest, *smallest) < 0) { *smallest = f->smallest; } if (icmp_.Compare(f->largest, *largest) > 0) { *largest = f->largest; } } } }
获得input范围内存储的key范围,保存在smallest和largest内。类似的还有GetRange2函数,不同的是GetRange2获取的是两个输入文件群内的key值范围,先将两个文件群容器合并,在调用GetRange。
好了,加上上篇的关于version的介绍,其实整个version、versionset的内容我只写了一部分,但对于理解leveldb的版本控制我想应该有了一个较为清楚的认识,version是有关版本信息的类,主要成员变量是files_[kNumLevels]的容器,记录这个版本的所有sstable信息,versionset就是所有历史versions的集合,而versionedit和versionset::builder都是为了更新version的sstable信息。
如有错误,欢迎大家指正。