小组成员: 曹可心-10223903406 朴祉燕-10224602413
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

61 lines
2.2 KiB

#ifndef STORAGE_LEVELDB_DB_VLOG_MANAGER_H_
#define STORAGE_LEVELDB_DB_VLOG_MANAGER_H_
#include <unordered_map>
#include <cstdint>
#include "leveldb/env.h"
#include "db/filename.h"
#include "leveldb/options.h"
namespace leveldb{
class SequentialFile;
namespace vlog{
class VlogManager{
public:
VlogManager() = default;
~VlogManager() = default;
//Add a vlog file, vlog file is already exist.
void AddVlogFile(uint64_t vlogfile_number, SequentialFile* seq_file, WritableFile* write_file);
SequentialFile* GetVlogFile(uint64_t vlogfile_number);
bool IsEmpty();
void MarkVlogValueInvalid(uint64_t vlogfile_number, uint64_t offset);
SequentialFile* GetSequentialFile(WritableFile* write_file) {
auto it = writable_to_sequential_.find(write_file);
return it != writable_to_sequential_.end() ? it->second : nullptr;
}
void IncrementTotalValueCount(WritableFile* write_file) {
auto seq_file = GetSequentialFile(write_file);
if (seq_file) {
seq_file->IncrementTotalValueCount(); // 假设 SequentialFile 提供该方法
}
}
void CleanupInvalidVlogFiles(const Options& options, const std::string& dbname) {
for (const auto& vlog_pair : vlog_table_) {
uint64_t vlogfile_number = vlog_pair.first;
auto vlog_file = vlog_pair.second;
if (vlog_file->AllValuesInvalid()) { // 检查文件内所有值是否无效
RemoveVlogFile(vlogfile_number, options, dbname); // 删除 VLog 文件
}
}
}
void RemoveVlogFile(uint64_t vlogfile_number, const Options& options, const std::string& dbname) { // 移除无效的vlogfile文件
auto it = vlog_table_.find(vlogfile_number);
if (it != vlog_table_.end()) {
delete it->second; // 删除对应的 SequentialFile
vlog_table_.erase(it); // 从管理器中移除
options.env->DeleteFile(VlogFileName(dbname, vlogfile_number)); // 删除实际文件
}
}
private:
std::unordered_map<uint64_t, SequentialFile*> vlog_table_; // 用映射组织vlog文件号和文件的关系
std::unordered_map<WritableFile*, SequentialFile*> writable_to_sequential_;
};
}// namespace vlog
}
#endif