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