设为首页 加入收藏

TOP

leveldb学习:versionedit和versionset(一)
2015-11-21 01:43:21 来源: 作者: 【 】 浏览:0
Tags:leveldb 学习 versionedit versionset

VersionEdit:

compact过程中会有一系列改变当前Version的操作(FileNumber增加,删除input的sstable,增加输出的sstable),为了缩小version切换的时间点,将这些操作封装成versionedit,compact完成时,将versionedit中的操作一次应用到当前version即可得到最新状态的version。
versionedit的成员变量:

 private:
  friend class VersionSet;
  typedef std::set< std::pair
   
     > DeletedFileSet; std::string comparator_; uint64_t log_number_; uint64_t prev_log_number_; uint64_t next_file_number_; SequenceNumber last_sequence_; bool has_comparator_; bool has_log_number_; bool has_prev_log_number_; bool has_next_file_number_; bool has_last_sequence_; std::vector< std::pair
    
      > compact_pointers_; DeletedFileSet deleted_files_; std::vector< std::pair
     
       > new_files_;
     
    
   

deleted_files_和new_files_记录的是compact过程的input sstable和output sstable。
每一次compact之后都会讲对应的versionedit encode进入manifest文件,参考函数encodeto。

void VersionEdit::EncodeTo(std::string* dst) const { if (has_comparator_) { PutVarint32(dst, kComparator); PutLengthPrefixedSlice(dst, comparator_); } if (has_log_number_) { PutVarint32(dst, kLogNumber); PutVarint64(dst, log_number_); } if (has_prev_log_number_) { PutVarint32(dst, kPrevLogNumber); PutVarint64(dst, prev_log_number_); } if (has_next_file_number_) { PutVarint32(dst, kNextFileNumber); PutVarint64(dst, next_file_number_); } if (has_last_sequence_) { PutVarint32(dst, kLastSequence); PutVarint64(dst, last_sequence_); } for (size_t i = 0; i < compact_pointers_.size(); i++) { PutVarint32(dst, kCompactPointer); PutVarint32(dst, compact_pointers_[i].first); // level PutLengthPrefixedSlice(dst, compact_pointers_[i].second.Encode()); } for (DeletedFileSet::const_iterator iter = deleted_files_.begin(); iter != deleted_files_.end(); ++iter) { PutVarint32(dst, kDeletedFile); PutVarint32(dst, iter->first); // level PutVarint64(dst, iter->second); // file number } for (size_t i = 0; i < new_files_.size(); i++) { const FileMetaData& f = new_files_[i].second; PutVarint32(dst, kNewFile); PutVarint32(dst, new_files_[i].first); // level PutVarint64(dst, f.number); PutVarint64(dst, f.file_size); PutLengthPrefixedSlice(dst, f.smallest.Encode()); PutLengthPrefixedSlice(dst, f.largest.Encode()); } }

VersionSet::Builder

将VersionEdit应用到VersionSet上的过程封装成VersionSet::Builder,主要是更新Version::files_[]。

class VersionSet::Builder { private: // Helper to sort by v->files_[file_number].smallest //处理version::files_[i]中的filemetadata的排序 struct BySmallestKey { const InternalKeyComparator* internal_comparator; bool operator()(FileMetaData* f1, FileMetaData* f2) const { int r = internal_comparator->Compare(f1->smallest, f2->smallest); if (r != 0) { return (r < 0); } else { // Break ties by file number return (f1->number < f2->number); } } }; //排序的sstable集合 typedef std::set
     
       FileSet; //要添加和删除的sstable集合 struct LevelState { std::set
      
        deleted_files; FileSet* added_files; }; //要更新的versionset VersionSet* vset_; //基准的version,compact后,将current_传入作为base Version* base_; //各个level上要更新的文件集合 LevelState levels_[config::kNumLevels];
      
     

其实也就是VersionEdit放置sstable改动信息(主要为deleted_files_和new_files_),Builder根据这些信息完成files_[]的改动(参见函数Apply、SaveTo和MaybeAddFile)。

VersionSet

在version的博客里,我们说versionset是DB中的version的集合。先看versionset的成员变量:

private: Env* const env_;//about磁盘读写 const std::string dbname_; const Options* const options_; TableCache* const table_cache_;//操作sstable的tablecache const InternalKeyComparator icmp_; uint64_t next_file_number_;//下一个可用的filenumber uint64_t manifest_file_number_;//manifest文件 uint64_t last_sequence_;//最后用过的SequenceNumber uint64_t log_number_;//log文件的filenumber uint64_t prev_log_number_; // 0 or backing store for memtable being compacted // Opened lazily WritableFile* descriptor_file_; log::Writer* descriptor_log_; Version dummy_versions_; // version链表,表头 Head of circular doubly-linked list of versions. Version* current_; // 当前最新的Version == dummy_versions_.prev_ // Per-level key at which the next compaction at that level should start. // Either an empty string, or a valid InternalKey. std::string compact_pointer_[config::kNumLevels];

为了尽量均匀compact每个level,所以会将这一次comapct的end_key作为下一次

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇leveldb学习:Cache 下一篇leveldb学习:skiplist

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: