LevelDB场景分析2--Open
1.源码
1 Status DB::Open(const Options& options, const std::string& dbname,
2 DB** dbptr) {
3 *dbptr = NULL;
4
5 DBImpl* impl = new DBImpl(options, dbname);
6 impl->mutex_.Lock();
7 VersionEdit edit;
8 Status s = impl->Recover(&edit); // Handles create_if_missing, error_if_exists
9 if (s.ok()) {
uint64_t new_log_number = impl->versions_->NewFileNumber();
WritableFile* lfile;
s = options.env->NewWritableFile(LogFileName(dbname, new_log_number),
&lfile);
if (s.ok()) {
edit.SetLogNumber(new_log_number);
impl->logfile_ = lfile;
impl->logfile_number_ = new_log_number;
impl->log_ = new log::Writer(lfile);
s = impl->versions_->LogAndApply(&edit, &impl->mutex_);
}
if (s.ok()) {
impl->DeleteObsoleteFiles();
impl->MaybeScheduleCompaction();
}
}
impl->mutex_.Unlock();
if (s.ok()) {
*dbptr = impl;
} else {
delete impl;
}
return s;
}
2.DBImpl::DBImpl
1 DBImpl::DBImpl(const Options& raw_options, const std::string& dbname)
2 : env_(raw_options.env),
3 internal_comparator_(raw_options.comparator),
4 internal_filter_policy_(raw_options.filter_policy),
5 options_(SanitizeOptions(dbname, &internal_comparator_,
6 &internal_filter_policy_, raw_options)),
7 owns_info_log_(options_.info_log != raw_options.info_log),
8 owns_cache_(options_.block_cache != raw_options.block_cache),
9 dbname_(dbname),
db_lock_(NULL),
shutting_down_(NULL),
bg_cv_(&mutex_),
mem_(new MemTable(internal_comparator_)),
imm_(NULL),
logfile_(NULL),
logfile_number_(),
log_(NULL),
seed_(),
tmp_batch_(new WriteBatch),
bg_compaction_scheduled_(false),
manual_compaction_(NULL) {
mem_->Ref();
has_imm_.Release_Store(NULL);
// Reserve ten files or so for other uses and give the rest to TableCache.
const int table_cache_size = options_.max_open_files - kNumNonTableCacheFiles;
table_cache_ = new TableCache(dbname_, &options_, table_cache_size);
versions_ = new VersionSet(dbname_, &options_, table_cache_,
&internal_comparator_);
}
Env *env_
- 单例
- 创建random-read,sequential-read,common文件
- 文件目录增删查改,检测。
- 文件锁,锁进程。
- 启动线程功能
- 新增日志文件
InternalKeyComparator internal_comparator_
- internal key的compare()
InternalFilterPolicy internal_filter_policy_
- filter policy wrapper that converts from internal keys to user keys
Options options_
- overall:Options to control the behavior of a database (passed to DB::Open)
- Env *
- Logger *
- write_buffer_size
- max_open_files
- block_cache
- block_size
- CompressionType
- FilterPolicy
Table Cache *table_cache_
- Env *env_
- Options options_
- Cache *cache_
Memtable *mem_
- KeyComparator comparator_
- int refs_
- Arena arena_
- Table table_
MemTable *imm_
- KeyComparator comparator_
- int refs_
- Arena arena_
- Table table_
WriteableFile *log_file_
- A file abstraction for sequential writing.
- The implementationmust provide buffering since callers may append small fragments at a time to the file.
log::Writer *log_
- explicit Writer(WritableFile* dest);
- 写日志文件
std::deque<Writer*> writers_
- Status status;
- WriteBatch *batch;
- bool sync;
- bool done;
- port::CondVar cv;
- explicit Writer(port::Mutex* mu) : cv(mu)
WriteBatch *write_batch_
- 批量写入
- 实际是保存在buffer中,key--value,到达一定数量后,写入
SnapshotList snapshots_
- 双向链表,内容是SnapshotImpl list_;
- Oldest,Newest
std::set<uint64_t> pending_outputs_
- Set of table files to protect from deletion because they are part of ongoing compactions.
ManualCompaction manual_compaction_
- struct ManualCompaction {
int level;bool done;const InternalKey* begin; // NULL means beginning of key rangeconst InternalKey* end; // NULL means end of key rangeInternalKey tmp_storage; // Used to keep track of compaction progress};VersionSet *versions_
- LogAndApply()
- Recover()
- current()
- ManifestFileNumber()
- NewFileNumber()
- ReuseFileNumber()
- NumLevelFiles()
- NumLevelBytes()
- LastSequence()
- LogNumber()
- PrevLogNumber()
- PickCompaction()
- CompactRange()
- AddLiveFiles()
- LevelSummary()
- Env* const env_;
const std::string dbname_;const Options* const options_;TableCache* const table_cache_;const InternalKeyComparator icmp_;uint64_t next_file_number_;uint64_t manifest_file_number_;uint64_t last_sequence_;uint64_t log_number_;uint64_t prev_log_number_; // 0 or backing store for memtable being compacted// Opened lazilyWritableFile* descriptor_file_;log::Writer* descriptor_log_;Version dummy_versions_; // Head of circular doubly-linked list of versions.Version* current_; // == dummy_versions_.prev_// Per-level key at which the next compaction at that level should start.// Either an empty string, or a valid InternalKey.std::string compact_pointer_[config::kNumLevels];CompactionState states_[config::kNumLevels]
- Per level compaction stats.
- stats_[level] stores the stats for compactions that produced data for the specified "level".
LevelDB场景分析2--Open的更多相关文章
- LevelDB场景分析1--整体结构分析
基本用法 数据结构 class DBImpl : public DB { private: struct CompactionState; struct Writer;// Infor ...
- LevelDB场景分析4--BackgroundCompaction
1.DBImpl::Open uint64_t new_log_number = impl->versions_->NewFileNumber(); WritableF ...
- TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析
TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...
- Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例
<Oracle dbms_lock.sleep()存储过程使用技巧>-场景-分析-实例 摘要:今天是2014年3月10日,北京,雾霾,下午组织相关部门开会.会议的结尾一名开发工程师找到了我 ...
- 理解 python metaclass使用技巧与应用场景分析
理解python metaclass使用技巧与应用场景分析 参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...
- 数据结构之链表C语言实现以及使用场景分析
牢骚:本篇博客两个星期前已经存为草稿,鉴于发生一些糟糕的事情,今天才基本完成.本人6月份应届毕业生一枚,毕业后当天来到帝都,之后也非常顺利,面试了俩家公司都成功了.一家做C++方面电商ERP,一家做w ...
- mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法
mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法 官方mysql一个slave只能对应一个master,mariadb 10开始支持多源 ...
- ThreadLocal的理解与应用场景分析
对于Java ThreadLocal的理解与应用场景分析 一.对ThreadLocal理解 ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存 ...
- Java 常用List集合使用场景分析
Java 常用List集合使用场景分析 过年前的最后一篇,本章通过介绍ArrayList,LinkedList,Vector,CopyOnWriteArrayList 底层实现原理和四个集合的区别.让 ...
随机推荐
- mysql必知必会(一、数据库基础知识)
基础概念 1.数据库(database):是一个以某种有组织的方式存储的数据集合.(保存有组织的数据的容器) 2.表(table):是一种结构化的文件,可用来存储某种特定类型的数据.(表名在同个数据库 ...
- [Backbone]Real Route
Duplication is Bad. Let's DRY (Don't Repeat Yourself) our routes to make /pp:per_page an optional pa ...
- Foreda8上安装CMake2.8.1.2
本机操作系统:Linux 2.6.23.1-42.fc8 #1 SMP Tue Oct 30 13:55:12 EDT 2007 i686 i686 i386 GNU/Linux 在本机上准备安装My ...
- C++:cin、cin.getline()、getline()的用法
主要内容: 1.cin用法 2.cin.getline()用法 3.getline()用法 3.注意的问题 一.cin>> 用法1:输入一个数字或字符 #include <iostr ...
- Linux - 系统路径加入命令
系统路径加入命令 本文地址: http://blog.csdn.net/caroline_wendy 1. 在根文件夹建立bin文件夹: $mkdir bin 2. 改动".bash_pro ...
- MAC下PHP开发
ZendStudio 10.5安装: http://blog.sina.com.cn/s/blog_7c8dc2d50101nhvb.html PHP+MySQL+Apache开发环境安装:XAMPP ...
- 微信小程序 - 自定义tabbar
更新: 2019-1-18:自定义tabbar组件已发布 各种奇葩的需求,造就了我们 wxml <view class="nav-tabs"> <view cla ...
- iOS正則表達式(一)
什么是正則表達式? 正則表達式是对字符串操作的一种逻辑公式. 作用? 在iOS开发中我们通常使用正則表達式来匹配给定的字符串是否符合我们的业务逻辑,比方说用户注冊帐号仅仅能是手机号或者邮箱等.我们还能 ...
- SpringMVC的入门例子
MVC框架是什么 模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式.它主要通过分离模型.视图及控制器在应用程序中的角色将业务逻辑从界面中解耦.通常,模型负责封装应用程序数 ...
- python2.7中minetypes.py的UnicodeDecodeError
问题: python错误提示: UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not ...