2.1 minor_compaction
leveldb 中的compaction可分为两类,第一类是从内存memtable中直接生成level0的sstable文件,即minor_compaction;第二类是合并不同层级之间的sstable文件,即major_compaction。本节首先来看minor_compaction。
1)minor_compaction的触发
之前关于Get流程和Put/Delete流程的分析中分别提到了这两个函数:
在函数MakeRoomForWrite中,首先会进行level0层的sstable文件数量,当前memtable写入数据,当前是否有imem正在写入等各个条件的检查,判断是否将当前mem变为imem并调用MaybeScheduleCompactoin()函数,也就是说,最终都是通过MaybeScheduleCompactoin()函数执行minor_compaction操作。
2)真正执行minor_conpaction的函数
层层转发到WriteLevel0Table函数,该函数内调用BuildTable函数进行真正的minor_compaction操作。
WriteLevel0Table函数内处理了版本管理,日志记录等方面的内容,这些部分会在其他专门分析日志,版本管理中分析。
BuildTable函数中,生成新的写入文件以及一个TableBuilder类的对象,这个对象的作用是将写入的数据按照sstable文件的格式写入文件。通过迭代器iter,将imem中的数据依次写入builder中,由builder写入文件。最后是一些状态判断以确保本次操作过程中没有产生错误。
接下来分析TableBuilder类,在这之前首先请大家阅读讲述sstable文件结构的文章:http://www.360doc.com/content...
通过builder的Add函数将imem的键值对依次存入文件,该函数如下:
r->pending_index_entry只有在新的datablock生成时才被set为true,此时需要生成index_block的一项并填入r->index_block中去。
r->data_block存储了写入当前块的所有数据,通过判断当前写入数据数量确定是否开启一个新的块,如果条件成立则调用Flush函数写入当前块。在Flush函数中最终会调用WriteRawBlock函数填入每块最后的五个字节。
回到BuildTable函数,当所有数据被写完后,调用builder->Finish函数写入可选的filter block和metaindex block,最终写入index block和footer数据。
与major compaction相比,minor compaction就是把内存中的imem写入sstable文件,这为将来分析major compaction提供了良好的基础。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。