到此为止,基本上leveldb的主要功能组件都已经分析完了,下面如何把它们组合在一起形成一个高效稳定的数据库,这就是DBimpl类和compact进程的工作。
- campact进程
为了均衡读写的效率,sstable文件分层次(level)管理,db预定义了最大的level值。compact负责将memtable持久化成sstable,以及均衡整个db中各level的sstable。
- 版本控制
当执行一次compaction后,Leveldb将在当前版本基础上创建一个新版本,当前版本就变成了历史版本。在leveldb中,Version就代表了一个版本,它包括当前磁盘及内存中的所有文件信息。VersionSet是所有Version的集合,这是个version的管理机构。在所有的version中,只有一个是CURRENT。
VersionEdit 表示Version之间的变化,相当于delta 增量,表示有增加了多少文件,删除了文件。
VersionEdit会保存到MANIFEST文件中,当做数据恢复时就会从MANIFEST文件中读出来重建数据。
这两部分具体的操作还是在源码中细讲吧。
static double MaxBytesForLevel(int level) {
// Note: the result for level zero is not really used since we set
// the level-0 compaction threshold based on number of files.
double result = 10 * 1048576.0; // Result for both level-0 and level-1
while (level > 1) {
result *= 10;
level--;
}
return result;
}
static uint64_t MaxFileSizeForLevel(int level) {
return kTargetFileSize; // We could vary per level to reduce number of files?
}
关于不同level中sstabl