LevelDB中的Iterator

Iterator

void Iterator::seek(const Slice& target); // 定位到第一個key大於等於target的位置
以下的Key指的是InternalKey。

MemTableIterator

用於對MemTable進行遍歷和查找。
在內部轉調用MemTable::Table::Iterator, MemTable::Table是SkipList的typedef ,MemTable::Table::Iterator是一個內部類,沒有繼承自Iterator,避免了一些虛函數調用開銷。
key():Key
value():Value

MemTable::NewIterator()返回指向MemTableIterator的指針。

Block::Iter

封裝了block內部的前綴壓縮和重啓點細節,用於對block中的key-value遍歷和查找。
因爲Data Block和Index Block使用了相同的格式,二者的Iterator所表示的key和value的意義不同。
對於Data Block
key():Key
value():Value
對於Index Block
key():對應Data Block的last_key的ShortestSeparator(可以簡單理解爲Data Block的largest key)
value(): 對應Data Block的BlockHandle的變長編碼

Block::NewIterator()返回指向Block::Iter的指針。

Version::LevelFileNumIterator

非level 0的sst元信息集合的Iterator,用來遍歷和查找sst文件。
key():FileMetaData的largest
value():FileMetaData的number和file_size的fixed64編碼

做爲TwoLevelIterator的index_iter使用。

TwoLevelIterator

考慮在一個sst文件中進行查找,可以先加載Index Block,並用其Iterator找到特定的Data Block,然後通過Data Block的Iterator找到具體的data。
對於類似這種需要定位index,然後根據index定位到具體data的使用方式,封裝成TwoLevelIterator使用。
TwoLevelIterator包含index_iter和data_iter,另外需要一個block_function用來根據index_iter的value()初始化data_iter。

Table::NewIterator()返回的是指向TwoLevelIterator的指針,其index_iter是Index Block的Iterator,block_function是Table::BlockReader(),它的功能是根據index_iter的value()找到(此處有block cache)並返回該Data Block的Iterator。
於是Table::NewIterator()就能用來遍歷和查找整個sst文件中的key-value了。

========================================
Version::LevelFileNumIterator可以根據一個key找到一個文件的number和file_size,於是可以依靠該文件的number和file_size去FindTable()(此處有table cache),然後就可以使用Table::NewIterator()去查找、遍歷了。
TableCache::NewIterator()就用來FindTable()後獲得Table::NewIterator()。GetFileIterator()用來調用TableCache::NewIterator()。
於是可以將Version::LevelFileNumIterator做爲index_iter,將GetFileIterator()做爲block_function又構造出一個TwoLevelIterator,用來對非level 0的sst文件集合中的key-value進行遍歷和查找。

MergingIterator

內部有多個child Iterator,以類似歸併的方式進行遍歷和查找。
用處一:
compact的時候,所有輸入文件形成iterator數組,level 0的一個sst對應一個Iterator(Table::NewIterator()),其他level整個level對應一個Iterator(Version::LevelFileNumIterator和GetFileIterator()構造出的TwoLevelIterator)。
用處二:
參見DBIter。

NewMergingIterator()返回指向MergingIterator的指針。

DBIter

DBImpl::NewIterator()返回指向DBIter的指針。
DBIter內部實際通過一個MergingIterator工作,NewInternalIterator()返回該MergingIterator,這個MergingIterator的children包括mem一個迭代器、imm一個迭代器、level 0每個sst一個迭代器、其他level每個level一個迭代器。

DBImpl::NewIterator()先通過NewInternalIterator()獲取了一個MergingIterator,另外獲取了一個sequence number(用戶指定或取當前值),然後調用NewDBIterator()返回指向DBIter的指針。

因爲是面向用戶的,DBIter::key()返回的是user key,DBIter處理了內部多個相同user key的問題。

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