LevelDb源碼學習——版本管理

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中讀取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章