一个 LevelDB 实例初始化的主要任务包括:
- 从 Manifest 文件恢复各个 level 的 SSTable 的元数据。
- 根据 log 文件恢复 MemTable。
- 恢复 last_sequence_、next_file_numbe_等元信息。
DB::Open
一个 LevelDB 实例的初始化是从 DB::Open 这个函数开始的:
Status DB::Open(const Options& options, const std::string& dbname, DB** dbptr);
options – 打开/创建 LevelDB 实例的配置参数。 dbname – 保存数据的目录名。 dbptr – 初始化成功的 LevelDB 实例保存在 *dbptr。
DB::Open 的执行逻辑:
- 创建 DBImpl 对象:DBImpl 的构造函数会做一些简单的初始化工作。
- 调用 DBImpl::Recover。
- 根据条件决定是否需要创建新的 MemTable。
- 根据条件决定是否需要保存 Manifest。
- 删除过期文件,调度后台的 compaction 任务。
重点是第 2 步。
DBImpl::Recover
DBImpl::Recover 是 LevelDB 初始化的主要逻辑:
- 根据参数判断是否要创建新的数据库。
- 从 Manifest 文件恢复各个 level 的 SSTable 的元数据:调用 VersionSet::Recover 读取 Manifest 的内容。
- 文件检查:1)外存上的文件是否和 Manifest 的内容一致;2)收集需要恢复的 log 文件。
- 根据 log 文件恢复 MemTable:针对每个 log 文件调用 RecoverLogFile,同时更新 next_file_numbe_。
- 更新 last_sequence_。
今天的文章LevelDB 完全解析(7):初始化分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/16484.html