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