6 SSTable之2
6.4 创建sstable文件
了解了sstable文件的存储格式,以及Data Block的组织,下面就可以分析如何创建sstable文件了。相关代码在table_builder.h/.cc以及block_builder.h/.cc(构建Block)中。
6.4.1 TableBuilder类
构建sstable文件的类是TableBuilder,该类提供了几个有限的方法可以用来添加k/v对,Flush到文件中等等,它依赖于BlockBuilder来构建Block。
TableBuilder的几个接口说明下:
> void Add(const Slice& key, const Slice& value),向当前正在构建的表添加新的{key, value}对,要求根据Option指定的Comparator,key必须位于所有前面添加的key之后;
> void Flush(),将当前缓存的k/v全部flush到文件中,一个高级方法,大部分的client不需要直接调用该方法;
> void Finish(),结束表的构建,该方法被调用后,将不再会使用传入的WritableFile;
> void Abandon(),结束表的构建,并丢弃当前缓存的内容,该方法被调用后,将不再会使用传入的WritableFile;【只是设置closed为true,无其他操作】
一旦Finish()/Abandon()方法被调用,将不能再次执行Flush或者Add操作。
下面来看看涉及到的类,如图6.3-1所示。
图6.3-1
其中WritableFile和op log一样,使用的都是内存映射文件。Options是一些调用者可设置的选项。
TableBuilder只有一个成员变量Rep* rep_,实际上Rep结构体的成员就是TableBuilder所有的成员变量;这样做的目的,可能是为了隐藏其内部细节。Rep的定义也是在.cc文件中,对外是透明的。
简单解释下成员的含义:
Options options; // data block的选项
Options index_block_options; // index block的选项
WritableFile* file; // sstable文件
uint64_t offset; // 要写入data block在sstable文件中的偏移,初始0
Status status; //当前状态-初始ok
BlockBuilder data_block; //当前操作的data block
BlockBuilder index_block; // sstable的index block
std::string last_key; //当前data block最后的k/v对的key
int64_t num_entries; //当前data block的个数,初始0
bool closed; //调用了Finish() or Abandon(),初始false
FilterBlockBuilder*filter_block; //根据filter数据快速定位key是否在block中
bool pending_index_entry; //见下面的Add函数,初始false
BlockHandle pending_handle; //添加到index block的data block的信息
std::string compressed_output;//压缩后的data block,临时存储&