Leveldb源码分析--13

8 FilterPolicy&Bloom之2

8.5 构建FilterBlock

8.5.1 FilterBlockBuilder

了解了filter机制,现在来看看filter block的构建,这就是类FilterBlockBuilder。它为指定的table构建所有的filter,结果是一个string字符串,并作为一个block存放在table中。它有三个函数接口:

  // 开始构建新的filter block,TableBuilder在构造函数和Flush中调用
  void StartBlock(uint64_tblock_offset);
  // 添加key,TableBuilder每次向data block中加入key时调用
  void AddKey(const Slice&key);
  // 结束构建,TableBuilder在结束对table的构建时调用
  Slice Finish();  
FilterBlockBuilder的构建顺序必须满足如下范式:(StartBlock AddKey*)* Finish,显然这和前面讲过的BlockBuilder有所不同。
其成员变量有:
  const FilterPolicy* policy_; // filter类型,构造函数参数指定
  std::string keys_;          //Flattened key contents
  std::vector<size_t> start_;   // 各key在keys_中的位置
  std::string result_;          // 当前计算出的filter data
  std::vector<uint32_t>filter_offsets_; // 各个filter在result_中的位置
  std::vector<Slice> tmp_keys_;// policy_->CreateFilter()参数 
前面说过base是2KB,这对应两个常量kFilterBase =11, kFilterBase =(1<<kFilterBaseLg);其实从后面的实现来看tmp_keys_完全不必作为成员变量,直接作为函数GenerateFilter()的栈变量就可以。下面就分别分析三个函数接口。
8.5.2 FilterBlockBuilder::StartBlock()

它根据参数block_offset计算出filter index,然后循环调用GenerateFilter生产新的Filter。

  uint64_t filter_index =(block_offset / kFilterBase);
  ass
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值