您的位置:首页 > 博客中心 > 数据库 >

LevelDB源码分析--Iterator

时间:2022-03-10 17:52

我们先来参考来至的例子,略微修改希望能帮助更加容易立即,如果有不理解请各位看客阅读原文。

下面我们再来看一个例子,我们为一个书店写程序,书店里有许多书Book,每个书架(BookShelf)上有多本书。

类结构如下所示

class TwoLevelIterator: public Iterator {
BlockFunction block_function_; block内部迭代器的生成函数
  void* arg_;  //通常为TableCahe,供block_function_调用的参数
  const ReadOptions options_;
  Status status_;
  IteratorWrapper index_iter_; //大致相当于shelf_iter_
  IteratorWrapper data_iter_; // 大致相当于book_iter_
  std::string data_block_handle_;
};

void TwoLevelIterator::SeekToFirst() {
  index_iter_.SeekToFirst(); //跳到第一个block
  InitDataBlock();                 //根据当前block设置data_iter_
  if (data_iter_.iter() != NULL) data_iter_.SeekToFirst();
  SkipEmptyDataBlocksForward(); //跳过空block
}

leveldb中TwoLevelIterator也类似BookStore有一个block的遍历指针存放至TwoLevelIterator中而已,当一个block遍历完的时候使用该迭代器跳到下一个block,然后在设置对应的data_iter_。只是在过程中遍历下一层data_iter时内部结构可能尚未初始化需要调用BlockReader从磁盘读取文件进行初始化设置。

这里只是说明了使用TwoLevelIterator遍历SSTable时,当遍历db的时候也同样可以类似的对应SSTable层级的一个迭代器即可,而block_function_需要设置为GetFileIterator就可以遍历整个数据库了。

LevelDB源码分析--Iterator,布布扣,bubuko.com

热门排行

今日推荐

热门手游