LevelDb源码学习——版本管理

本文介绍leveldb中的Version、Version-set和Version-edit概念,解析这些组件如何支持数据库的写入操作与紧凑化过程。Version管理SST文件元信息,Version-set维护不同版本的集合,Version-edit记录版本变更。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Version及相关的Version-set,Version-edit是leveldb中最重要的概念之一。 leveldb的写入过程可以看做有前端任务和后端任务,前端任务被用户程序调用,完成将用户key写入缓存队列,写入log,写入memtable,后端任务即进行compaction。将imem写入sst,合并sst。 Version相关的类主要为后端任务调用,完成compaction。 Version
保存了db中sst文件的元信息,提供对sst文件的查询等功能,另外Version还为Compact提供数据支持。
Version-set
是Version的集合,随着db的使用,sst文件会发生合并,新增,db呈现为不同的版本,Version-set集合了各个版本。
Version-edit
是Version变化的delt

源码分析

version类

成员变量

VersionSet* vset_

指向version set

Version* next_

Version* prev_

int ref_

version被引用的次数

vector < FileMetaData*> files_[config::kNumLevels]

SST文件的元信息,二维数组,每一个level是一个vector

FileMetaData* file_to_compact_ ; int file_to_compack_level

由Seek触发的,下一次compact的sst文件和对应的level

double compaction_score_;int compaction_level_

下一次要compact的level和对应的score

主要方法

Status Get(const ReadOptions&, const LookupKey& key, std::string* val, GetStats* stats)

获取key对应的value

bool UpdateStats(const GetStats& stats);

将stats 更新到version,stats记录了seek的结果,包括sts文件信息和seek的level

bool RecordReadSample(Slice key);

取样式get一个key,通过get,来判断当前是否需要触发compact

void Ref(); void UnRef();

增加和减少一个引用,增加引用就是在ref_ 上加一,减少引用时可能会通过delete this删除自身

void GetOverlappingInputs(int level,const InternalKey* begin,const InternalKey* end,std::vector < FileMetaData*>* inputs)

在level中的sst文件中,找到所有与[begin,start]有重合的file,并将其放在inputs中作为返回参数,对于level0,如果begin和start不是正好和返回的file的range重合或者是其子集,那么begin和end会被扩充,然后重新search整个level。
如果begin或者end 为null,即表示对应的边界为无穷小或者无穷大

bool OverlapInLevel(int level, const Slice* smallest_user_key,const Slice* largest_user_key)

判断level中的文件,是否有与指定range重合的

int PickLevelForMemTableOutput(const Slice& smallest_user_key,const Slice& largest_user_key);

从level0开始,逐层判断此层是否存在与[smallest,largest]有重合的file,找到第一个存在的level,返回,即便某层没有重合的file,如果其level+1层,与此range有重合的file的total size超过了某个值,则停止搜索,返回此层。
这样做的目的是为了防止覆盖过多的level+1层(grandparents)文件导致compact时过多的IO??

Iterator* NewConcatenatingIterator(const ReadOptions&, int level) const

返回一个双层迭代器,第一层用来遍历对应level的所有文件,第二层用来遍历某个文件的cache中的k-v,使用此双层迭代器,可以方便的遍历一个level中所有的k-v

void ForEachOverlapping(Slice user_key, Slice internal_key,void* arg,bool (func)(void, int, FileMetaData*));

对于所有包含user-key的file,按照从新到旧的顺序,应用func函数,直到func返回为false

VersionSet类

主要成员

TableCache* const table_cache_ 读取version中的文件时,其实是从cache中读取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值