10215300402 朱维清 10222140408 谷杰
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

68 行
2.1 KiB

#ifndef LEVELDB_KV_SEPARATE_MANAGEMENT_H
#define LEVELDB_KV_SEPARATE_MANAGEMENT_H
#include <unordered_map>
#include <unordered_set>
#include <deque>
#include "leveldb/slice.h"
#include <iterator>
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<uint64_t, ValueLogInfo*> map_file_info_;
// 垃圾回收队列,这个队列中表示的文件info 将来是要进行gc回收的
std::deque<ValueLogInfo*> garbage_collection_;
// 需要触发gc回收的,但是还没有进行分配sequencen的info
std::deque<ValueLogInfo*> need_updates_;
std::unordered_set<uint64_t> delete_files_;
};
} // namespace leveldb
#endif //LEVELDB_KV_SEPARATE_MANAGEMENT_H