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()) {
10     uint64_t new_log_number = impl->versions_->NewFileNumber();
11     WritableFile* lfile;
12     s = options.env->NewWritableFile(LogFileName(dbname, new_log_number),
13                                      &lfile);
14     if (s.ok()) {
15       edit.SetLogNumber(new_log_number);
16       impl->logfile_ = lfile;
17       impl->logfile_number_ = new_log_number;
18       impl->log_ = new log::Writer(lfile);
19       s = impl->versions_->LogAndApply(&edit, &impl->mutex_);
20     }
21     if (s.ok()) {
22       impl->DeleteObsoleteFiles();
23       impl->MaybeScheduleCompaction();
24     }
25   }
26   impl->mutex_.Unlock();
27   if (s.ok()) {
28     *dbptr = impl;
29   } else {
30     delete impl;
31   }
32   return s;
33 }

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),
10       db_lock_(NULL),
11       shutting_down_(NULL),
12       bg_cv_(&mutex_),
13       mem_(new MemTable(internal_comparator_)),
14       imm_(NULL),
15       logfile_(NULL),
16       logfile_number_(0),
17       log_(NULL),
18       seed_(0),
19       tmp_batch_(new WriteBatch),
20       bg_compaction_scheduled_(false),
21       manual_compaction_(NULL) {
22   mem_->Ref();
23   has_imm_.Release_Store(NULL);
24 
25   // Reserve ten files or so for other uses and give the rest to TableCache.
26   const int table_cache_size = options_.max_open_files - kNumNonTableCacheFiles;
27   table_cache_ = new TableCache(dbname_, &options_, table_cache_size);
28 
29   versions_ = new VersionSet(dbname_, &options_, table_cache_,
30                              &internal_comparator_);
31 }

Env *env_

  1. 单例
  2. 创建random-read,sequential-read,common文件
  3. 文件目录增删查改,检测。
  4. 文件锁,锁进程。
  5. 启动线程功能
  6. 新增日志文件

InternalKeyComparator internal_comparator_

  1. internal key的compare()

InternalFilterPolicy internal_filter_policy_

  1. filter policy wrapper that converts from internal keys to user keys

Options options_

  1. overall:Options to control the behavior of a database (passed to DB::Open)
  2. Env *
  3. Logger *
  4. write_buffer_size
  5. max_open_files
  6. block_cache
  7. block_size
  8. CompressionType
  9. FilterPolicy

Table Cache *table_cache_

  1. Env *env_
  2. Options options_
  3. Cache *cache_

Memtable *mem_

  1. KeyComparator comparator_
  2. int refs_
  3. Arena arena_
  4. Table table_

MemTable *imm_

  1. KeyComparator comparator_
  2. int refs_
  3. Arena arena_
  4. Table table_

WriteableFile *log_file_

  1. A file abstraction for sequential writing.
  2. The implementationmust provide buffering since callers may append small fragments at a time to the file.

log::Writer *log_

  1. explicit Writer(WritableFile* dest);
  2. 写日志文件

std::deque<Writer*> writers_

  1. Status status;
  2. WriteBatch *batch;
  3. bool sync;
  4. bool done;
  5. port::CondVar cv;
  6. explicit Writer(port::Mutex* mu) : cv(mu)

WriteBatch *write_batch_

  1. 批量写入
  2. 实际是保存在buffer中,key--value,到达一定数量后,写入

SnapshotList snapshots_

  1. 双向链表,内容是SnapshotImpl list_;
  2. Oldest,Newest

std::set<uint64_t> pending_outputs_

  1. Set of table files to protect from deletion because they are part of ongoing compactions.

ManualCompaction manual_compaction_

  1. struct ManualCompaction {

        int level;

    bool done;

    const InternalKey* begin;   // NULL means beginning of key range

    const InternalKey* end;     // NULL means end of key range

    InternalKey tmp_storage;    // Used to keep track of compaction progress

    };

VersionSet *versions_

  1. LogAndApply()
  2. Recover()
  3. current()
  4. ManifestFileNumber()
  5. NewFileNumber()
  6. ReuseFileNumber()
  7. NumLevelFiles()
  8. NumLevelBytes()
  9. LastSequence()
  10. LogNumber()
  11. PrevLogNumber()
  12. PickCompaction()
  13. CompactRange()
  14. AddLiveFiles()
  15. LevelSummary()
  16. 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 lazily

    WritableFile* 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]

  1. Per level compaction stats.
  2. stats_[level] stores the stats for compactions that produced data for the specified "level".
时间: 2024-07-29 11:52:44

LevelDB场景分析2--Open的相关文章

LevelDB场景分析1--整体结构分析

基本用法 数据结构 class DBImpl : public DB { private: struct CompactionState; struct Writer;// Information kept for every waiting writer Env* const env_; // 文件,目录,日志,Schedule线程 const InternalKeyComparator internal_comparator_; const InternalFilterPolicy inte

LevelDB场景分析4--BackgroundCompaction

DBImpl::Open 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 

scala akka 修炼之路6(scala函数式柯里化风格应用场景分析)

胜败兵家事不期,包羞忍耻是男儿--斗牛士fighting,fighting,fighting... 小象学习和使用scala也一段时间了,最初小象学习scala主要为了学习spark生态,但是深入学习scala的一些特性后,深深被scala函数式和面向对象的风格所折服,不得不赞美设计这门语言的设计者.小象大学阶段在使用MATLAB做数据分析和自动化设计时,就非常喜欢使用MATLAB的命令行和面向矩阵运算的风格编写分析代码:喜欢使用java编写层次化和清晰的模块接口,而这些Scala语言设计中都有

典型用户及用户场景分析

典型用户及用户场景分析 糖糖---一个热爱编程的准程序员 名字 糖糖 性别.年龄 男,刚21岁 收入 暂时还没有 比例和重要性 市场比例很大,很重要 典型场景 写了一段自认为很优秀的代码,想要保存在一个合适的地方 使用本软件/服务的环境 需要保存自己的代码 生活/工作情况 现在还是学生,努力学习 知识层次和能力 大学还未毕业,学习热情极高,编程能力较好 用户的动机.目的和困难 保存代码,但是没有合适的地方 用户的偏好 喜欢给代码增加自定义的标签 呆呆---热爱思考人生的缺乏编程联系的“小学生”

mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法

mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法 官方mysql一个slave只能对应一个master,mariadb 10开始支持多源复制,一个slave可以有多个master,分别从各自的master复制不同的DB. 这个特性可以用在OLAP环境中,传统电商DB都是拆了再拆,分库分表,sharding,而OLAP环境或者大数据平台环境,通常需要各种数据的聚合,多个平台多个DB数据的复合查询,而这些数据分散在各个库中,怎么办了,当

用户分析和场景分析

用户分析: 名字:二柱子 年龄:30 收入:3000元一个月 代表的比例:代表的是程序维护人员 二柱子:二柱子是一名负责任的找到了网站的管理员,对电脑有很好的掌握,平常最反感得是那些在网站中发小广告的,严重影响了网站的秩序,对网站维护产生干扰, 用户偏好: 场景分析:在进行维护网站的时候,发现有人在网站中发小广告,这让他很生气,希望把这个用户移除出这个网站,并对这个ip进行判断,禁止这个ip访问该网站.

电商抢购秒杀系统的设计_1_应用场景分析

电商抢购秒杀系统的设计_1_应用场景分析 概述 所谓知已知彼,百战不殆,在开始详细介绍实战中的抢购秒杀系统时,我们了解一些抢购秒杀系统系统面临的尴尬与难点.另外需要说明一点,下面的内容都是在工作中慢慢总结得来,我们团队也是慢慢摸着石头过河,甚至最初的的架构设计并非是抢购秒杀系统. 评估系统处理能力 理论基础:LNMP的并发考虑与资源分配 虽然有基础去评估我们应用系统的处理能力,但是电商购买的业务流程挺复杂,从登录,商品详情,购物车,填写收货地址,选择支付方式,创建订单,完成支付,以及隐含的定时服

软件工程结队项目——智能点餐系统典型用户及用户场景分析

一.典型用户分析:一个典型用户描述了一组用户的典型技巧.能力.需要.想法.工作习惯和工作环境. 1.买家典型用户分析: 名字 小郭(石家庄铁道大学交1202-5班) 性别.年龄 男,22岁 联系方式 18330108270 职业 学生 收入 暂无 知识层次和能力 大学在读,会使用各种手机APP软件 生活/工作情况 上课,吃饭,睡觉,偶尔打打游戏,经常在学校门口买饭 动机,目的,困难 很喜欢吃学校门口小吃摊的炒饼,困难:中午3,4节有课时,下课都排队买饭,等的时间太长. 用户偏好 睡觉,打球 用户

典型用户与用户场景分析

自习室查询APP典型用户和用户场景分析: 典型用户 姓名 阿涛 年龄 19 收入 目前为在校大学生,平时做一些兼职工作 用户比例 典型场景 使用软件的查询自习室功能 使用环境 android智能手机 生活工作能力 周一到周五期间在校学习,周末节假日到校外兼职. 知识层次和能力 在校大学生,对电脑.手机使用熟练 动机.目的和困难 姜东每次上自习都需要到教学楼大厅下查看空教室,如果电子屏坏了(比如说二教)就只能一个教室一个教室的去找了. 用户的偏好 爱学习,平时喜欢去图书馆,喜欢科技类书籍 用户场景