leveldb:合并之DoCompactionWork(多文件间的合并)

再来分析DoCompactionWork前,我们先来熟悉几个与DoCompactionWork相关的数据结构

Compaction

class Compaction {
 public:
  ~Compaction();

  // 返回将要合并的层数,我们将level_与level_+1中冲突的文件合并到level_+1层
  int level() const { return level_; }

  // 返回VersionEdit用于记录这次合并产生的文件变化
  VersionEdit* edit() { return &edit_; }

  //返回第level + which层中产生冲突文件的个数,which只能为0或1
  int num_input_files(int which) const { return inputs_[which].size(); }

  // 返回第level + which层中第i个冲突文件的元数据信息
  FileMetaData* input(int which, int i) const { return inputs_[which][i]; }

  // 合并产生的新文件的最大文件大小,超过该值就得另生成新文件用于合并
  uint64_t MaxOutputFileSize() const { return max_output_file_size_; }

  // 能否直接将第level层的冲突文件直接放入level + 1层
  bool IsTrivialMove() const;

  // 冲突的文件合并完后就可以删除了,将要删除的文件记录进edit中
  void AddInputDeletions(VersionEdit* edit);

  // level+1层以上层中的文件都不包含该user_key,说明该user_key是最老的了
  bool IsBaseLevelForKey(const Slice& user_key);

  // 是否该停止对internal_key的合并,停止的原因是因为将
  bool ShouldStopBefore(const Slice& internal_key);

  // 减少input_version_的引用计数
  void ReleaseInputs();

 private:
  friend class Version;
  friend class VersionSet;

  Compaction(const Options* options, int level);

  int level_;//合并哪一层
  uint64_t max_output_file_size_;//合并产生的文件大小的最大值
  Version* input_version_; //合并的版本
  VersionEdit edit_; //用来记录合并过程中sst文件的变化情况

  // "level_" and "level_+1"层中需要进行合并的冲突文件的元数据集合
  std::vector<FileMetaData*> inputs_[2]; 

  // grandparent == level_ + 2,第level_ + 2层文件的元数据信息集合
  std::vector<FileMetaData*> grandparents_;
  size_t grandparent_index_;  // Index in grandparent_starts_
  bool seen_key_;     //用于判断现在要合并的key是否以及和level+2层文件产生冲突了
  int64_t overlapped_bytes_;  //用于记录当前合并产生的level+1层的文件与level+2层产生冲突的文件大小总和

  // State for implementing IsBaseLevelForKey

  //用于优化IsBaseLevelForKey性能的,因为调用IsBaseLevelForKey的key都是递增的
  //所以没有必要每次都从各层的第一个文件检查
  size_t level_ptrs_[config::kNumLevels];
};

bool Compaction::IsTrivialMove() 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值