RocksDB是通过version管理某一个时刻的db状态的,任何读写都是对一个version的操作,RocksDB有一套复杂的version管理机制,来实现同一时刻读的原子性。笔者通过拜读Rocks DB的源码,终于理清了versionSet,version,superVersion这些概念之间的关系。面向对象的开发语言中,要理清楚不通对象之间的关系,最直观的方式就是通过对象间的属性引用关系。本文尝试通过讲解对象的属性描述version的管理机制。
- version:version是以ColumnFamily为单位生成的,一个ColumnFamily一个version。
- cfd_: 版本所属的columnFamilyData
- table_cache_:
- storage_info_:保存当前version关联的StorageInfo,构造是通过传入的cfd_生成,传入一个cfd_->current()->storage_info作为ref_vstorage指针。
- vset:所属的versionSet
- next_:保存version链表上的下一个版本指针。
- prev_: 保存上一个version版本指针。
- 构造函数:version(cfd, vset, file_Opt, mutable_cf_opt, version_number,...)。
- versionSet: 一个db一个versionSet,包含这个db的所有ColumnFamily
- ColumnFamilySet
- WalSet:protected by db mutex
- current_version_number: 维护version number,作为下一个version的version_number参数。
- versionStorageInfo:保存这个version的存储信息
- user_comparator: 用户指定的compare function
- files_: 关联的文件。
- versionEdit:
- 对一个version的修改记录,会生成一个versionEdit
- versionEdit里的操作会被写入manifest
- version+versionEdit = new version
- versionEdit提供addFile和deleteFile接口,用于处理sst文件的新增和删除。
- versionEditHandler:构造一个新的version时使用
- version_set_:保存db的versionSet指针。
- SuperVersion:保存当前最新version和关联的memtable
- cdf:所属ColumnFamily
- mem:持有的memtable
- imm:所有的immutable memtables
- current:当前最新version指针
- static int dummy:kSVInUse指向dummy
- static void* const kSVInUse : 表示当前SV正在使用
- static void: const kSVObsolete : 当前SV已经释放
- ColumnFamilyData:
- dummy_versions_: head of version_list
- current: dummy_versions->prev_
- super_version_
- local_sv_: local_copy of SuperVersion
RocksDB的读写接口都是对一个ColumnFamily来的,那通过上面这些对象间的引用关系,我们就能直观看到一次读写或compaction操作了哪些对象。最后,用一个图来更直观展示下读写和compaction操作并发时,version的状态。