LevelDB 初始化的 UML圖(未完結, 裏面有點小複雜)

LevelDB 初始化的 UML圖

Iq80DBFactoryDbImplMemTableDbLockLogs靜態檢查cpu是否64位(因爲32位容易用完虛擬地址空間)open()初始化數據庫配置設置key的比較器internalKeyComparator初始化內存表(跳躍表實現)定義並創建壓縮的線程池設置表緩存tableCache鎖定數據庫的目錄化並回復當前版本號讀取db文件來, 設置內存的最新版本編號創建日誌對象清理無用文件向壓縮的線程池提交壓縮任務Iq80DBFactoryDbImplMemTableDbLockLogs

levelDB 的 put 方法:

DBDbImpllogMemTableput()數據檢查後臺線程是否有異常(後臺壓縮線程)創建重入鎖檢查內存以確保有足夠的內存空間(makeRoomForWrite()複雜)設置本次的開始序列號sequenceBegin和最大序列號sequenceEnd將數據寫入日誌文件更新內存表(把put()的key和value更新到memTable)DBDbImpllogMemTable

makeRoomForWrite()檢查並確保內存充足(涉及到核心的內存和文件壓縮邏輯)

Created with Raphaël 2.2.0makeRoomForWrite()檢查是否持有當前線程的重入鎖?允許延遲並且當前版本的 level0的文件數超過了文件數的軟限制?釋放重入鎖並睡眠1ms以讓出cpu給壓縮線程非強制並且內存表的內存使用< 寫緩存的大小?結束不可變內存仍未釋放線程等待喚醒當前版本的 level0的文件數大於最大限制數12關閉當前日誌對象並新起一個log固化當前內存爲不可變內存, 並重新分配可變內存取消強制壓縮的限制(force=false)提交壓縮任務到壓縮的線程池yesnoyesnoyesnoyesnoyesno

上面提交壓縮任務的執行的方法是:maybeScheduleCompaction(), 實現如下:

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