#ifndef LEVELDB_KV_SEPARATE_MANAGEMENT_H #define LEVELDB_KV_SEPARATE_MANAGEMENT_H #include #include #include #include "leveldb/slice.h" #include namespace leveldb { typedef struct ValueLogInfo { uint64_t last_sequence_; size_t file_size_; // 文件大小 uint64_t logfile_number_; // 文件编号 int left_kv_numbers_; // 剩下的 kv 数量 uint64_t invalid_memory_; // value log 中无效的空间大小 }ValueLogInfo; struct MapCmp{ bool operator ()(const ValueLogInfo* a, const ValueLogInfo* b) { return a->invalid_memory_ < b->invalid_memory_; // 按照 value 从大到小排列 } }; class SeparateManagement { public: SeparateManagement(uint64_t garbage_collection_threshold) : garbage_collection_threshold_(garbage_collection_threshold) {} ~SeparateManagement() {} bool ConvertQueue(uint64_t& db_sequence); // 改变 db 的 last_sequence void UpdateMap(uint64_t fid,uint64_t abandon_memory); void UpdateQueue(uint64_t fid); bool GetGarbageCollectionQueue(uint64_t& fid,uint64_t& last_sequence); void WriteFileMap(uint64_t fid, int kv_numbers, size_t log_memory); bool MayNeedGarbageCollection() { return !garbage_collection_.empty(); } void RemoveFileFromMap(uint64_t fid) { map_file_info_.erase(fid); } bool EmptyMap() { return map_file_info_.empty(); } void CollectionMap(); private: uint64_t garbage_collection_threshold_; // 当前版本的所有的vlog文件的索引。 std::unordered_map map_file_info_; // 垃圾回收队列,这个队列中表示的文件info 将来是要进行gc回收的 std::deque garbage_collection_; // 需要触发gc回收的,但是还没有进行分配sequencen的info std::deque need_updates_; std::unordered_set delete_files_; }; } // namespace leveldb #endif //LEVELDB_KV_SEPARATE_MANAGEMENT_H