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的状态。
