个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
在leveldb中,Version相关类是其中比较复杂的几个类了,类之间的关联很紧密,每个类有各自的功能,彼此之间又联系丰富,是耦合比较紧密的几个类。
ps-这几个类分析起来还是比较头大的~~~
Version相关类
Version相关主要包括三个类:
Version,VersionEdit,VersionSet;
Version类负责记录各level层的文件;
VersoinEdit类负责做manifest记录内容的转换,从记录字符串转换到对LevelTree的内容,从LevelTree的内容到记录字符串。
VersionSet类负责统筹LevelTree的内容,包含当前使用的comparator,下一个文件序列号,sequence用到多少等信息;尤其重要的是,内部包含Version类实例化属性,可以记录初始Version信息,并随着数据持续写入,文件的添加,形成新的Version,形成一个Version的链表结构。
Version类
Version类所包含的主要内容是:
level tree的各level层对应的文件列表:
struct FileMetaData{
int refs;
int allowed_seeks;
uint64_t number;
uint64_t file_size;
InternalKey smallest;
InternalKey largest;
};
std::vector<FileMetaData*> files_[config::kNumLevels];
VersionEdit类
VersionEdit在我的感觉里,是一个负责从文件记录到LevelTree结构的中转类,它提供了manifest记录内容的识别,识别一条记录内容,把记录内容识别为LevelTree结构的元素,例如是一条登记comparator的记录,例如是一条添加sst或log的记录,例如是一个删除sst内容的记录。识别了这个信息后,就可以把它汇总入VersionSet和Version中了。
VerstionEdit的关键内容
bool has_comparator_;
bool has_log_number_;
bool has_prev_log_number_;
bool has_next_file_number_;
bool has_last_sequnce_;
std::string comparator_;
uint64_t log_number_;
uint64_t prev_log_number_;
uin64_t next_file_number_;
SequenceNumber last_sequence_;
std::vector<std::pair<int, InternalKey>> compact_pointers_;
std::set<std::pair<int, uint64_t>> deleted_files_;
std::vector<std::pair<int, FileMetaData>> new_files_;
VersionSet类
VersionSet就是维护LevelTree结构的主要结构了,它不光包含了VerisonEdit中所向它输入的内容–comparator,log-number,net-file-number,last-sequnce,以及对应的level-files,deleted-files,compact-pointers,还要引入一些其它的特性,例如block缓存cache,所以它包含的内容就比较多了。
VersionSet的主要内容:
table-cache做block缓存用;
dummy-version用来记录Version列表,记录了level-files,deleted-files的变更内容Versions变化。
其它的sequnce、log-number,number-file-number等来源于VersionEdit的描述。
TableCache* const table_cache_;
const InternalKeyComparator icmp_;
uint64_t next_file_number_;
uint64_t manifest_file_number_;
uint64_t last_sequnce_;
uint64_t log_number_;
uint64_t prev_log_number_;
Version dummy_versions_;
Version* current_;
std::string compact_pointer_[config::kNumLevels];
个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)