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 internal_filter_policy_; // 提高随机读的性能

const Options options_;  // Options to control the behavior of a database (passed to DB::Open)

bool owns_info_log_;

bool owns_cache_;

const std::string dbname_;

// table_cache_ provides its own synchronization

TableCache* table_cache_;

// Lock over the persistent DB state.  Non-NULL iff successfully acquired.

FileLock* db_lock_;

// State below is protected by mutex_

port::Mutex mutex_;

port::AtomicPointer shutting_down_;

port::CondVar bg_cv_;          // Signalled when background work finishes

MemTable* mem_;

MemTable* imm_;                // Memtable being compacted

port::AtomicPointer has_imm_;  // So bg thread can detect non-NULL imm_

WritableFile* logfile_;

uint64_t logfile_number_;

log::Writer* log_;

uint32_t seed_;                // For sampling.

// Queue of writers.

std::deque<Writer*> writers_;

WriteBatch* tmp_batch_;

SnapshotList snapshots_;

// Set of table files to protect from deletion because they are

// part of ongoing compactions.

std::set<uint64_t> pending_outputs_;

// Has a background compaction been scheduled or is running?

bool bg_compaction_scheduled_;

ManualCompaction* manual_compaction_;

VersionSet* versions_;

// Have we encountered a background error in paranoid mode?

Status bg_error_;

CompactionStats stats_[config::kNumLevels];

};

红色部分成员是需要重点关注的。

主要场景

public:

Status DB::Open(const Options& options, const std::string& dbname, DB** dbptr)

// Implementations of the DB interface

virtual Status Put(const WriteOptions&, const Slice& key, const Slice& value);

virtual Status Delete(const WriteOptions&, const Slice& key);

virtual Status Write(const WriteOptions& options, WriteBatch* updates);

virtual Status Get(const ReadOptions& options,

const Slice& key,

std::string* value);

virtual Iterator* NewIterator(const ReadOptions&);

virtual const Snapshot* GetSnapshot();

virtual void ReleaseSnapshot(const Snapshot* snapshot);

virtual bool GetProperty(const Slice& property, std::string* value);

virtual void GetApproximateSizes(const Range* range, int n, uint64_t* sizes);

virtual void CompactRange(const Slice* begin, const Slice* end);

// Extra methods (for testing) that are not in the public DB interface

// Record a sample of bytes read at the specified internal key.

// Samples are taken approximately once every config::kReadBytesPeriod

// bytes.

void RecordReadSample(Slice key);

private:

Iterator* NewInternalIterator(const ReadOptions&,

SequenceNumber* latest_snapshot,

uint32_t* seed);

Status NewDB();

// Recover the descriptor from persistent storage.  May do a significant

// amount of work to recover recently logged updates.  Any changes to

// be made to the descriptor are added to *edit.

Status Recover(VersionEdit* edit) EXCLUSIVE_LOCKS_REQUIRED(mutex_);

void MaybeIgnoreError(Status* s) const;

// Delete any unneeded files and stale in-memory entries.

void DeleteObsoleteFiles();

// Compact the in-memory write buffer to disk.  Switches to a new

// log-file/memtable and writes a new descriptor iff successful.

// Errors are recorded in bg_error_.

void CompactMemTable() EXCLUSIVE_LOCKS_REQUIRED(mutex_);

Status RecoverLogFile(uint64_t log_number,

VersionEdit* edit,

SequenceNumber* max_sequence)

EXCLUSIVE_LOCKS_REQUIRED(mutex_);

Status WriteLevel0Table(MemTable* mem, VersionEdit* edit, Version* base)

EXCLUSIVE_LOCKS_REQUIRED(mutex_);

Status MakeRoomForWrite(bool force /* compact even if there is room? */)

EXCLUSIVE_LOCKS_REQUIRED(mutex_);

WriteBatch* BuildBatchGroup(Writer** last_writer);

void RecordBackgroundError(const Status& s);

void MaybeScheduleCompaction() EXCLUSIVE_LOCKS_REQUIRED(mutex_);

static void BGWork(void* db);

void BackgroundCall();

void  BackgroundCompaction() EXCLUSIVE_LOCKS_REQUIRED(mutex_);

void CleanupCompaction(CompactionState* compact)

EXCLUSIVE_LOCKS_REQUIRED(mutex_);

Status DoCompactionWork(CompactionState* compact)

EXCLUSIVE_LOCKS_REQUIRED(mutex_);

Status OpenCompactionOutputFile(CompactionState* compact);

Status FinishCompactionOutputFile(CompactionState* compact, Iterator* input);

Status InstallCompactionResults(CompactionState* compact)

EXCLUSIVE_LOCKS_REQUIRED(mutex_);

时间: 2024-11-10 13:07:11

LevelDB场景分析1--整体结构分析的相关文章

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-&

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智能手机 生活工作能力 周一到周五期间在校学习,周末节假日到校外兼职. 知识层次和能力 在校大学生,对电脑.手机使用熟练 动机.目的和困难 姜东每次上自习都需要到教学楼大厅下查看空教室,如果电子屏坏了(比如说二教)就只能一个教室一个教室的去找了. 用户的偏好 爱学习,平时喜欢去图书馆,喜欢科技类书籍 用户场景