struct Options : public DBOptions, public ColumnFamilyOptions {
struct ImmutableOptions : public ImmutableDBOptions, public ImmutableCFOptions {
¶ Options of column families
::Open(const Options& options, const std::string& dbname, DB** dbptr) {
Status DB(options);
DBOptions db_options(options);
ColumnFamilyOptions cf_optionsstd::vector<ColumnFamilyDescriptor> column_families;
.push_back(
column_families(kDefaultColumnFamilyName, cf_options));
ColumnFamilyDescriptor...
= DB::Open(db_options, dbname, column_families, &handles, dbptr); Status s
即从Options
中取出ColumnFamilyOptions
并且放到default
column family里。
::Open(const DBOptions& db_options, const std::string& dbname,
Status DBconst std::vector<ColumnFamilyDescriptor>& column_families,
std::vector<ColumnFamilyHandle*>* handles, DB** dbptr) {
const bool kSeqPerBatch = true;
const bool kBatchPerTxn = true;
return DBImpl::Open(db_options, dbname, column_families, handles, dbptr,
!kSeqPerBatch, kBatchPerTxn);
}
::Open(const DBOptions& db_options, const std::string& dbname,
Status DBImplconst std::vector<ColumnFamilyDescriptor>& column_families,
std::vector<ColumnFamilyHandle*>* handles, DB** dbptr,
const bool seq_per_batch, const bool batch_per_txn) {
...
for (auto cf : column_families) {
...
= impl->CreateColumnFamily(cf.options, cf.name, &handle);
s ...
DBImpl::CreateColumnFamily
调用了DBImpl::CreateColumnFamilyImpl
,ColumnFamilyOptions
是参数。
DBImpl::CreateColumnFamilyImpl
执行了versions_->LogAndApply
,即调用了VersionSet::LogAndApply
,ColumnFamilyOptions
是参数。
VersionSet::LogAndApply
调用了另一个版本的VersionSet::LogAndApply
,ColumnFamilyOptions
是参数。
另一个版本的VersionSet::LogAndApply
调用了VersionSet::ProcessManifestWrites
,ColumnFamilyOptions
是参数。
VersionSet::ProcessManifestWrites
调用了VersionSet::CreateColumnFamily
,ColumnFamilyOptions
是参数。
VersionSet::CreateColumnFamily
执行了column_family_set_->CreateColumnFamily
,即调用了ColumnFamilySet::CreateColumnFamily
,ColumnFamilyOptions
是参数。然后把返回的ColumnFamilyData
返回回去。(这里的version
list没搞懂)
ColumnFamilySet::CreateColumnFamily
构造了ColumnFamilyData
,把db_options_
和自己的参数const ColumnFamilyOptions& options
传进去。然后把构造好的ColumnFamilyData
加入到自己的linked
list里,最后返回回去。
ColumnFamilyData
的构造函数中,经过一系列操作,把传进来的ColumnFamilyOptions
和ImmutableDBOptions
里的immutable部分放到ImmutableOptions
类型的ioptions_
里,mutable部分放到MutableCFOptions
类型的mutable_cf_options_
里。此外,ColumnFamilyData
的构造函数中还初始化了compaction_picker_
,并将自己的ImmutableOptions
类型的ioptions_
存一份到LevelCompactionPicker::ioptions_
中。
所以这时,Column
family的option就保存在VersionSet
类型的DBImpl::versions_
里的
VersionSet::column_family_set_
里的linked list里的
ColumnFamilyData
里的
ImmutableOptions
类型的ioptions_
和MutableCFOptions
类型的mutable_cf_options_
里。
¶ Options of DB
::Open(const Options& options, const std::string& dbname, DB** dbptr) {
Status DB(options);
DBOptions db_options...
= DB::Open(db_options, dbname, column_families, &handles, dbptr); Status s
::Open(const DBOptions& db_options, const std::string& dbname,
Status DBconst std::vector<ColumnFamilyDescriptor>& column_families,
std::vector<ColumnFamilyHandle*>* handles, DB** dbptr) {
const bool kSeqPerBatch = true;
const bool kBatchPerTxn = true;
return DBImpl::Open(db_options, dbname, column_families, handles, dbptr,
!kSeqPerBatch, kBatchPerTxn);
}
* impl = new DBImpl(db_options, dbname, seq_per_batch, batch_per_txn); DBImpl
在DBImpl
的构造函数中,把DBOptions
拆成了mutable_db_options_
和immutable_db_options_
。此外,还初始化了versions_
,把ImmutableDBOptions
存入了DBImpl::versions_.column_family_set_.db_options_
,并且把column_family_memtables_.column_family_set_
指针设置为versions_.column_family_set_
。
¶ 写入路径上的option传递
DBImpl::WriteImpl
中,通过ColumnFamilyMemTablesImpl
类型的column_family_memtables
能访问到ImmutableDBOptions
和所有ColumnFamilyOptions
。column_family_memtables
作为参数传给WriteBatchInternal::InsertInto
的memtables
形参,类型转换为ColumnFamilyMemTables
。
WriteBatchInternal::InsertInto
中,把memtables
保存到inserter.cf_mems_
,此时ColumnFamilyMemTablesImpl
是inserter.cf_mems_
。inserter
传给了WriteBatch::Iterate
的handler
形参。
WriteBatch::Iterate
中,ColumnFamilyMemTablesImpl
是handler.cf_mems_
。调用WriteBatchInternal::Iterate
,handler
作为参数,名字不变。
WriteBatchInternal::Iterate
中,ColumnFamilyMemTablesImpl
是handler.cf_mems_
。执行handler->PutCF
,即调用MemTableInserter::PutCF
。
MemTableInserter::PutCF
中,ColumnFamilyMemTablesImpl
是cf_mems_
。调用MemTableInserter::PutCFImpl
。
MemTableInserter::PutCFImpl
中,ColumnFamilyMemTablesImpl
是cf_mems_
。先调用MemTableInserter::SeekToColumnFamily
,在里面执行cf_mems_->Seek(column_family_id)
,即调用ColumnFamilyMemTablesImpl::Seek
,在里面设置current_
。
MemTableInserter::CheckMemtableFull
中,执行cfd = cf_mems_->current()
,取出当前的column
family的ColumnFamilyData
,然后可能执行flush_scheduler_->ScheduleWork(cfd)
。注意,通过ColumnFamilyData
可以访问到ImmutableOptions
和MutableCFOptions
。
然后根据
RocksDB代码分析——写入流程,一波操作之后ColumnFamilyData
作为flush任务的载体被放到了FlushRequest
里,进而被放进了DBImpl::flush_queue_
里。
然后根据
RocksDB代码分析——Flush流程,DBImpl::BackgroundFlush
调用DBImpl::PopFirstFromFlushQueue
从DBImpl::flush_queue_
中取出FlushRequest flush_req
,从中再取出ColumnFamilyData
。一波操作之后ColumnFamilyData
可能作为compaction任务的载体被放进DBImpl::compaction_queue_
。
然后根据
RocksDB代码分析——Compaction流程,DBImpl::BackgroundCompaction
可能调用DBImpl::PickCompactionFromQueue
从compaction_queue_
里取出一个ColumnFamilyData *cfd
,然后调用cfd->PickCompaction
,得到Compaction *
。
ColumnFamilyData::PickCompaction
执行了compaction_picker_->PickCompaction
,即调用了LevelCompactionPicker::PickCompaction
。
LevelCompactionPicker::PickCompaction
中构造了LevelCompactionBuilder builder
,将ImmutableOptions
类型的LevelCompactionPicker::ioptions_
存入LevelCompactionBuilder::ioptions_
。
由上文可知,LevelCompactionPicker::ioptions_
是在构造ColumnFamilyData
时初始化的,其ioptions_
来自ColumnFamilyData::ioptions_
。