leveldb的Version相关类分析

个人随笔 (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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值