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

leveldb源码分析--SSTable之TableBuilder

时间:2022-03-10 17:49

上一篇文章讲述了SSTable的格式以后,本文结合源码解析SSTable是如何生成的。

Status TableBuilder::Finish() {

  //先将data_block内容写到文件
  Flush();

  // 写filterblock也即为Metablock记录的filter信息,具体分析稍后再filterblock中专门分析
  if (ok() && r->filter_block != NULL) {
    WriteRawBlock(r->filter_block->Finish(), kNoCompression,
                  &filter_block_handle);
  }

  // 写入metablock的index,包含一个key=filter.filter名,value=开始的filter_block的handle
  if (ok()) {
    BlockBuilder meta_index_block(&r->options);
    if (r->filter_block != NULL) {
      std::string key = "filter.";
      key.append(r->options.filter_policy->Name());
      std::string handle_encoding;
      filter_block_handle.EncodeTo(&handle_encoding);
     meta_index_block.Add(key, handle_encoding);
    }
    // 写入文件中
    WriteBlock(&meta_index_block, &metaindex_block_handle);
  }

  // 写data_block的索引块,之前每个data_block会取一个FindShortestSeparator作为key,
  // value为该block的block_handle,最后一块的key为FindShortSuccessor
  if (ok()) {
    if (r->pending_index_entry) {
      r->options.comparator->FindShortSuccessor(&r->last_key);
      std::string handle_encoding;
      r->pending_handle.EncodeTo(&handle_encoding);
      r->index_block.Add(r->last_key, Slice(handle_encoding));
      r->pending_index_entry = false;
    }
    WriteBlock(&r->index_block, &index_block_handle);
  }

  // 写footer块,包括了MetaIndex block和Indexblock 的BlockHandle,以及填充区和一个magic数字
  if (ok()) {
    Footer footer;
    footer.set_metaindex_handle(metaindex_block_handle);
    footer.set_index_handle(index_block_handle);
    footer.EncodeTo(&footer_encoding);
    r->status = r->file->Append(footer_encoding);
    if (r->status.ok()) {
      r->offset += footer_encoding.size();
    }
  }
  return r->status;
}

 

知道了table_builder的各个函数的处理流程以后,我们自然会想这些函数是在什么地方调用的呢?什么地方初始化的呢?通过阅读代码我们可以知道build SSTable都是在compaction的时候进行的,为compact memtable和SSTable的时候都会调用到。其中compact memtable是在builder.cc的BuildTable中,而compact SSTable则是在DoCompactionWork中。BuildTable逻辑简单,这里就不再进行解释,推荐读者先阅读这个流程,以认识生成一个SSTable 的过程。而DoCompactionWork由于涉及到更多的compaction相关的内容,这个我们在后面解释compaction的时候再专门介绍。

leveldb源码分析--SSTable之TableBuilder,布布扣,bubuko.com

热门排行

今日推荐

热门手游