leveldb中,压缩分为2大类:minor Compaction,major compaction。前者是将memdb中的数据落入sst文件,后者则是将sst文件进行归并,提高文件的检索效率
minor Compaction
当数据写入时,会尝试进行mem的刷新操作,后台协程接到命令后,将会触发memCompaction方法。
进行压缩时,中间会暂停major compaction操作,而整体的压缩流程相当的平淡无奇,对一个跳表尝试创建一个sst文件,并找到对应层级插入。
完成刷新之后,会继续写入Manifest中。最终将清空旧有的memdb
major Compaction
sst文件的合并压缩,则是一个比较复杂的触发流程,其中包括自动触发auto以及范围压缩range。
压缩前,会去定位一个当前压缩的上下文。上下文首先会针对压缩分来计算当前压缩的进度,因为会全局遍历的压缩操作,所以会管理相关进度,若并非压缩分数过高,则肯定是存在当前等待压缩的文件,则将其取出生成上下文。
得到一批压缩文件,则需要继续找到下一层需要同时压缩的文件信息,这就需要遍历所有的下层文件内容。
得到最终的压缩列表后,其实就是进行归并排序来进行文件压缩。最终将新增文件和旧有文件进行更新并生成一个新的version对象。