11 VersionSet分析之2
11.4 LogAndApply()
前面接口小节中讲过其功能:在currentversion上应用指定的VersionEdit,生成新的MANIFEST信息,保存到磁盘上,并用作current version,故为Log And Apply。
参数edit也会被函数修改。
11.4.1 函数流程
S1 为edit设置log number等4个计数器。
if (edit->has_log_number_) {
assert(edit->log_number_>= log_number_);
assert(edit->log_number_< next_file_number_);
} else edit->SetLogNumber(log_number_);
if(!edit->has_prev_log_number_) edit->SetPrevLogNumber(prev_log_number_);
edit->SetNextFile(next_file_number_);
edit->SetLastSequence(last_sequence_);
要保证edit自己的log number是比较大的那个,否则就是致命错误。保证edit的log number小于next file number,否则就是致命错误-见9.1小节。
S2 创建一个新的Version v,并把新的edit变动保存到v中。
Version* v = new Version(this);
{
Leveldb VersionSet深入解析:LogAndApply()与Manifest

本文深入剖析Leveldb的VersionSet,重点讲解LogAndApply()函数的流程,包括在MANIFEST文件不存在时创建新文件,以及在写入操作中的锁管理。同时讨论了WriteSnapshot()和ManifestContains()的作用。此外,还提及ApproximateOffsetOf()用于估算SSTable中key的偏移量。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



