// Copyright (c) 2011 The LevelDB Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. #ifndef STORAGE_LEVELDB_DB_VERSION_EDIT_H_ #define STORAGE_LEVELDB_DB_VERSION_EDIT_H_ #include #include #include #include "db/dbformat.h" namespace leveldb { class VersionSet; struct FileMetaData { FileMetaData() : refs(0), allowed_seeks(1 << 30), file_size(0) {} int refs; int allowed_seeks; // Seeks allowed until compaction uint64_t number; uint64_t file_size; // File size in bytes InternalKey smallest; // Smallest internal key served by table InternalKey largest; // Largest internal key served by table }; // 注释:vlog文件的元数据 struct LogMetaData { LogMetaData() : refs(0), allowed_seeks(1 << 30), file_size(0) {} int refs; // 引用计数 int allowed_seeks; //当该值为0时,意味着需要进行compaction操作了; 变量allowed_seeks的值在sstable文件加入到version时确定 uint64_t number; //文件名相关;sstable文件的名字是 number.ldb uint64_t file_size; //文件大小 InternalKey smallest; //最小的key InternalKey largest; //最大的key }; class VersionEdit { public: VersionEdit() { Clear(); } ~VersionEdit() = default; void Clear(); void SetComparatorName(const Slice& name) { has_comparator_ = true; comparator_ = name.ToString(); } void SetLogNumber(uint64_t num) { has_log_number_ = true; log_number_ = num; } void SetPrevLogNumber(uint64_t num) { has_prev_log_number_ = true; prev_log_number_ = num; } void SetNextFile(uint64_t num) { has_next_file_number_ = true; next_file_number_ = num; } void SetLastSequence(SequenceNumber seq) { has_last_sequence_ = true; last_sequence_ = seq; } //注释: 设置序列号 imm_last_sequence_(imm 转 sst的时候用) void SetImmLastSequence(SequenceNumber seq,uint64_t fid) { has_imm_last_sequence_ = true; imm_last_sequence_ = seq; imm_log_file_number_ = fid; } void SetCompactPointer(int level, const InternalKey& key) { compact_pointers_.push_back(std::make_pair(level, key)); } // Add the specified file at the specified number. // REQUIRES: This version has not been saved (see VersionSet::SaveTo) // REQUIRES: "smallest" and "largest" are smallest and largest keys in file void AddFile(int level, uint64_t file, uint64_t file_size, const InternalKey& smallest, const InternalKey& largest) { FileMetaData f; f.number = file; f.file_size = file_size; f.smallest = smallest; f.largest = largest; new_files_.push_back(std::make_pair(level, f)); } // Delete the specified "file" from the specified "level". void RemoveFile(int level, uint64_t file) { deleted_files_.insert(std::make_pair(level, file)); } void EncodeTo(std::string* dst) const; Status DecodeFrom(const Slice& src); std::string DebugString() const; private: friend class VersionSet; typedef std::set> 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_; //注释:是否包含 imm_last_sequence_ bool has_imm_last_sequence_; //注释:恢复log的时候 用来定位memtable 和 immemtabl中的位置 SequenceNumber imm_last_sequence_; //注释:imm_last_sequence 所处在的log文件 uint64_t imm_log_file_number_; std::vector> compact_pointers_; DeletedFileSet deleted_files_; std::vector> new_files_; }; } // namespace leveldb #endif // STORAGE_LEVELDB_DB_VERSION_EDIT_H_