前面我们分析了leveldb中的index block和data block。这里主要是分析filter block。filter block属于一种metadata block,它的构造主要由FilterBlockBuilder完成。filter block的作用就是提供快速判断一个key是否存在于某个datablock中,以加速查找的过滤器。
回忆在分析TableBuilder的Add函数时,每次向sstable中添加一个key-value,都会执行
if (r->filter_block != NULL) {
r->filter_block->AddKey(key);
}
以将key加入到filter block中。从判断语句我们也可以看到,filter block是可选项,不是必须要有的。
而且每写完一个data block,并在TableBuilder中的Flush函数中将data block写盘时,都会执行
if (r->filter_block != NULL) {
r->filter_block->StartBlock(r->offset);
}
而且在写完整个sstable时,还会在TableBuilder.Finish函数中执行以下代码
if (ok() && r->filter_block != NULL) {
WriteRawBlock(r->filter_block->Finish(), kNoCompression,
&filter_block_handle