LevelDB(六)
主要流程
Option构造流程:
--> BytewiseComparator位比较器、Env
- BytewiseComparatorImpl比较器的单例构造
- WindowsEnv
background_work_mutex_==port::Mutex
、background_work_cv_==port::CondVar
初始化- Limiter初始化:最大限制和可请求资源数都设置为1000
- 开启线程设为false:
started_background_thread_=false
- 设置压缩器类型:kSnappyCompression
DB::Open流程:
-
DBImpl:参数:Option、数据库名
-
Env==Option中的Env
-
比较器:InternalKeyComparator = BytewiseComparator
-
InternalFilterPolicy持有的FilterPolicy=null
-
Options初始化
- 比较器:InternalKeyComparator = BytewiseComparator
- 过滤器:nullptr
- Logger日志
- 创建目录:数据库名
- 将"testdb/LOG" --> “testdb/LOG.old”
- 打开dbname + "/LOG"文件,创建Logger日志对象
- 新建缓存Cache
- ShardedLRUCache 1*2^24 = 2MB
- last_id_ = 0
- 每一个的长度为62
- LRUCache:
capacity_(0), usage_(0)
- 自定义的哈希表HandleTable
length_(0), elems_(0)
:新建长度为4的List
- ShardedLRUCache 1*2^24 = 2MB
-
owns_info_log_ = true
-
owns_cache_ = true
-
dbname_=dbname
-
TableCache表缓存:参数 dbname、Options、表缓存大小1000-10=990
- env_ = options.env
- dbname_=dbname
- options_ = options
- cache_ = ShardedLRUCache 990
- last_id_ = 0
- LRUCache:
capacity_(0), usage_(0)
- 自定义的哈希表HandleTable
length_(0), elems_(0)
:新建长度为4的List
-
db_lock_(nullptr), shutting_down_(false), background_work_finished_signal_(&mutex_), mem_(nullptr), imm_(nullptr), has_imm_(false), logfile_(nullptr), logfile_number_(0), log_(nullptr), seed_(0),
-
WriteBatch批量写,分配长度为12的字符串
-
成员变量,SnapshotList,head_(0)
成员变量SnapshotImpl,参数:sequence_number = 0
-
VersionSet参数:
dbname_ 、options_ 、table_cache_990表缓存、internal_comparator_比较器
env_(options->env), dbname_(dbname), options_(options), table_cache_(table_cache), icmp_(BytewiseComparator), next_file_number_(2), manifest_file_number_(0), last_sequence_(0), log_number_(0), prev_log_number_(0), descriptor_file_(nullptr), descriptor_log_(nullptr), // 成员变量 // 实例化Version dummy_versions_(this), vset_(vset), next_(this), prev_(this), refs_(0), file_to_compact_(nullptr), file_to_compact_level_(-1), compaction_score_(-1), compaction_level_(-1) current_(nullptr)
AppendVersion新建一个Version加入到当前的版本控制链表中–new Version参数:VersionSet==this
vset_(vset), next_(this), prev_(this), refs_(0), file_to_compact_(nullptr), file_to_compact_level_(-1), compaction_score_(-1), compaction_level_(-1)
-
CompactionStats,micros(0), bytes_read(0), bytes_written(0)
-
-
DBImpl impl->Recover恢复日志
-
创建目录dbname_
-
使用Env,锁住"testdb/LOCK"文件
-
如果"testdb/CURRENT"文件不存在,配置中允许创建,创建文件,DBImpl::NewDB():新建一个manifest文件MANIFEST-000001其中写入 user_comparator()->Name() SetLogNumber(0) SetNextFile(2) SetLastSequence(0)
将MANIFEST-000001定入CURRENT中
-
否则返回错误
-
versions_->Recover
-
读取CURRENT文件(MANIFEST文件名),将结果写入current = “testdb/MANIFEST-000001”
dscname = “testdb/MANIFEST-000001”
-
Builder,参数this,Version
vset_(vset), base_(base)
- 创建7层的set,初始化FileMetaData没有数据
-
读"testdb/MANIFEST-000001"文件Reader,中的VersionEdit
file_(file), reporter_(reporter), checksum_(checksum), backing_store_(new char[kBlockSize]), buffer_(), eof_(false), last_record_offset_(0), end_of_buffer_offset_(0), initial_offset_(initial_offset), resyncing_(initial_offset > 0)
-
生成新版本,并计算下一次待压缩的文件,插入Version更新current指针
-
-
读取文件名env_->GetChildren
[2] = “CURRENT”
[3] = “LOCK”
[4] = “LOG”
[5] = “MANIFEST-000001”
-
获取所有的在线的sst文件 遍历目录下的文件
sst文件和目录下的文件相同的全部删除
-
排序 恢复memtable日志
-
-
设置日志参数,新建MemTable、log::Writer(最新的日志文件)
-
将读到的VersionEdit进行更新LogAndApply
-
删除无用的文件 和 进行可能的压缩
DB::Put流程:
- WriteBatch::Put(key, value)
- DBImpl::Write,参数WriteOptions、WriteBatch
- Writer记录WriteBatch
- 插入批量写的队列writers_,
writers_.push_back(&w)
- MakeRoomForWrite写到MemTable中
- BuildBatchGroup批量写入数据
- 写入日志
- 将mem_写入write_batch
- 将写入的Writer从writers_中弹出
DB::Get==DBImpl::Get流程:
- 没有快照,设置快照序号、MemTable、ImmemTable、Version
- LookupKey,参数:user_key、Version number
- 查找Memtable,mem->Get,参数:LookupKey,value值的保存、状态
- 跳表迭代器,查找大于等于key的节点list_->FindGreaterOrEqual
- 保存数据