LevelDB 完全解析(7):初始化

2020-05-26 16:33:02 浏览数 (1)

前文回顾

  • LevelDB 完全解析(0):基本原理和整体架构
  • LevelDB 完全解析(1):MemTable
  • LevelDB 完全解析(2):Log
  • LevelDB 完全解析(3):SSTable
  • LevelDB 完全解析(4):Manifest
  • LevelDB 完全解析(5):Cache
  • LevelDB 完全解析(6):Filter

一个 LevelDB 实例初始化的主要任务包括:

  1. 从 Manifest 文件恢复各个 level 的 SSTable 的元数据。
  2. 根据 log 文件恢复 MemTable。
  3. 恢复 last_sequence_、next_file_numbe_等元信息。

DB::Open

一个 LevelDB 实例的初始化是从 DB::Open 这个函数开始的:

代码语言:javascript复制
Status DB::Open(const Options& options, const std::string& dbname, DB** dbptr);

options - 打开/创建 LevelDB 实例的配置参数。

dbname - 保存数据的目录名。

dbptr - 初始化成功的 LevelDB 实例保存在 *dbptr。

DB::Open 的执行逻辑:

  1. 创建 DBImpl 对象:DBImpl 的构造函数会做一些简单的初始化工作。
  2. 调用 DBImpl::Recover。
  3. 根据条件决定是否需要创建新的 MemTable。
  4. 根据条件决定是否需要保存 Manifest。
  5. 删除过期文件,调度后台的 compaction 任务。

重点是第 2 步。

DBImpl::Recover

DBImpl::Recover 是 LevelDB 初始化的主要逻辑:

  1. 根据参数判断是否要创建新的数据库。
  2. 从 Manifest 文件恢复各个 level 的 SSTable 的元数据:调用 VersionSet::Recover 读取 Manifest 的内容。
  3. 文件检查:1)外存上的文件是否和 Manifest 的内容一致;2)收集需要恢复的 log 文件。
  4. 根据 log 文件恢复 MemTable:针对每个 log 文件调用 RecoverLogFile,同时更新 next_file_numbe_。
  5. 更新 last_sequence_。

0 人点赞