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 底层实现原理和四个集合的区别.让 ...
随机推荐
- permission 权限 列表 6.0 运行时【案例】
demo地址:https://github.com/baiqiantao/PermissionTest.git <uses-permission android:name="andro ...
- JavaScript操作XML (一)
JavaScript操作XML是通过XML DOM来完成的.那么什么是XML DOM呢?XML DOM 是: 用于 XML 的标准对象模型 用于 XML 的标准编程接口 中立于平台和语言 W3C 的标 ...
- 【OpenCV】解析OpenCV中copyMakerBorder函数
Use the OpenCV function :copy_make_border:`copyMakeBorder <>` to set the borders (extra paddin ...
- 在CentOS/RHEL上设置SSH免密码登录
本文会告诉你怎样在 CentOS/RHEL 上设置 SSH 免密码登录.自动登录配置好以后,你可以通过它使用 SSH (Secure Shell)和安全复制 (SCP)来移动文件. SSH 是开源的, ...
- RAID5工作原理介绍
RAID 5是一种存储性能.数据安全和存储成本兼顾的存储解决方案.以四个硬盘组成的RAID 5为例,其数据存储方式如图4所示:图中,P0为D0,D1和D2的奇偶校验信息,P1为D3,D4,D5的奇偶校 ...
- 关于block的回调使用-防止内存泄露问题
block 一般用于回调,比方请求数据我们把asi封装好,仅仅用block调数据就方便很多 获取到得数据假设要给之加入数据,切记不能够使用self.(这个数组) 或者_(这个数组) addObject ...
- java编程思想---对象
一.对象 对于每种语言来说,都有自己操纵内存中元素的方法. 在java中,一切被视为对象.可是操纵对象的是一个"引用".举个样例,能够比作为遥控器对电视的操作,遥控器就是引用,而电 ...
- VS2010已停止工作,framework 4.0安装失败
好久没在台式机上写程序了,今天打开一个解决方案,报错: 从来没有遇到这种情况,重新关闭解决方案,在菜单栏中打开解决方案说没有framework 4.0,其实我安装的是4.5 ,也有4.0,于是全部卸载 ...
- ZH奶酪:Ubuntu14.04 安装Android SDK(SDK tools only)
1.安装JDK(我安装的是Oracle的,而不是openjdk) jdk目录:usr/lib/jvm/java-7-oracle/bin/java 2.下载Android-SDK,在下边的网页选择对应 ...
- tomcat thread dump 分析
前言 Java Thread Dump 是一个非常有用的应用诊断工具, 通过thread dump出来的信息, 可以定位到你需要了解的线程, 以及这个线程的调用栈. 如果配合linux的top命令, ...