Leveldb源码分析--19

本文深入剖析Leveldb的VersionSet,重点讲解LogAndApply()函数的流程,包括在MANIFEST文件不存在时创建新文件,以及在写入操作中的锁管理。同时讨论了WriteSnapshot()和ManifestContains()的作用。此外,还提及ApproximateOffsetOf()用于估算SSTable中key的偏移量。
摘要由CSDN通过智能技术生成

11 VersionSet分析之2

11.4 LogAndApply()

函数声明:Status LogAndApply(VersionEdit*edit, port::Mutex* mu)
前面接口小节中讲过其功能:在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变动保存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值