一、SST文件结构分析
其中data block/filter block/meta_index block称之为 x block
index block:每个key_value表示一个index entry,指向一个data block,key为data block中最大的key,value为8字节,存储了data block的在SST文件中的offset/size
meta_index block:整个block只有一个key_value(key为filter block的name,value为filter block的offset和size)
二、table_builder.h分析
memtable写满后由SST文件存储,这个过程由table_builder完成
变量:rep_,所有的数据、状态都存放在rep中
函数功能:
-
TableBuilder():初始化rep,构造filter block
-
WriteRawBlock():把一段数据(raw block)写入文件中,并返回block在文件中的offset和size,block handle类型
- 功能:block的数据和trailer被写入文件
-
WriteBlock():对block做处理再写入文件(压缩、不压缩)
- data block:是key_value数据的block(包含很多的key_value),对应一个filter block
- index_entry:每个block对应一个index_entry
- Add():1、增加的key必须大于last_key,key必须是升序的;2、把key加入到filter block中,将offset和size作为value加入index_block,更新last_key,把本次的key_value加入data block中,然后data block会把数据序列化后放入自己的buffer中;3、data block中size达到阈值会flush到文件中
- flush():把data block和blockhandle中的offset和size写入文件,调用writablefile内部的buffer写入磁盘,创建filter block
-
Finish():完成SST文件的全部构建
- 调用flash(),设置标志位,写入最后一块data block
- 完成Filter block的构建,并写入文件
- 创建meta_index_block(key是filter$name,value是filter block的offset size编码的结果)
- 如果有pending_index_entry就加入index block
- 生成footer,并写入文件,更新rep_
最终 TableBuilder产生的SST文件由5个区块组成