VersionSet的作用是记录各个版本,这些版本的组织形式是一个环形的双向链表。
【数据成员介绍】
compact_pointer_:记录每层下次做compact的开始的key;string型数组,index-->level, value-->internal key,
current_:指向当前版本;
dbname_:数据库的名称;
descriptor_file_:指向可写的manifest文件;
descriptor_log_:指向log writer对象;
dummy_versions_:版本环形双相链表的头;
env_:指向与平台相关的env;
icmp_:InternalKeyComparator,内部比较器;
last_sequence_:上一个序列号(快照就是靠它实现的);
log_number_:日志文件编号;
manifest_file_number_:manifest文件编号;
next_file_number:下一个文件编号,文件编号计数器;
options_:应用配置项,调用者配置的哪些配置项;
prev_log_number_:
table_cache_:指向sst文件的cache对象;
【辅助方法介绍】
static double MaxBytesForLevel(int level)
作用:计算每层文件总大小阈值;但是level 0其实不是基于文件大小来的,而是基于文件个数,因为level 0 sst文件的key range之间是允许有交叠,所以在查找的时候,如果文件太多,意味着增加了seek文件次数,读的效率就会降低。
每层文件的总大小大小:
level0 : 10M
level1 : 10M
level2 : 100M
level3 : 1000M
level4 : 10000M
level5 : 100000M
level6 : 1000000M
static uint64_t MaxFileSizeForLevel(int level)
作用:每层最大的文件大小为2M,(为了减少每层的文件数,可以违反这个规则,因为每个进程打开的文件数是有限制的,所以可以根据层级的不同来调整文件大小的限制,这个也算是一个改进点)
static int64_t TotalFileSize(const std::vector<FileMetaData*>& files)
作用:计算给定files的总文件大小;