浏览代码

Merge remote-tracking branch 'refs/remotes/origin/main'

main
wesley 4 个月前
父节点
当前提交
328a8b3cc6
共有 3 个文件被更改,包括 36 次插入29 次删除
  1. +2
    -2
      db/db_impl.cc
  2. +33
    -26
      table/vtable_manager.cc
  3. +1
    -1
      table/vtable_manager.h

+ 2
- 2
db/db_impl.cc 查看文件

@ -1291,7 +1291,7 @@ Status DBImpl::DecodeValue(std::string* value) const {
Status DBImpl::Get(const ReadOptions& options, const Slice& key, Status DBImpl::Get(const ReadOptions& options, const Slice& key,
std::string* value) { std::string* value) {
Status s = Status::TimeOutRead(""); Status s;
MutexLock l(&mutex_); MutexLock l(&mutex_);
SequenceNumber snapshot; SequenceNumber snapshot;
if (options.snapshot != nullptr) { if (options.snapshot != nullptr) {
@ -1347,7 +1347,7 @@ Status DBImpl::Get(const ReadOptions& options, const Slice& key,
Status DBImpl::Get(const ReadOptions& options, const Slice& key, Status DBImpl::Get(const ReadOptions& options, const Slice& key,
Fields* fields) { Fields* fields) {
Status s = Status::TimeOutRead(""); Status s;
MutexLock l(&mutex_); MutexLock l(&mutex_);
SequenceNumber snapshot; SequenceNumber snapshot;
if (options.snapshot != nullptr) { if (options.snapshot != nullptr) {

+ 33
- 26
table/vtable_manager.cc 查看文件

@ -14,9 +14,8 @@ namespace leveldb {
struct GCInfo { struct GCInfo {
std::string dbname; std::string dbname;
std::set<uint64_t>* file_list; std::vector<uint64_t> file_list;
Env* env = nullptr; Env* env = nullptr;
VTableManager* vtable_manager = nullptr;
}; };
void VTableMeta::Encode(std::string* target) const { void VTableMeta::Encode(std::string* target) const {
@ -41,7 +40,9 @@ void VTableManager::AddVTable(const VTableMeta& vtable_meta) {
} }
void VTableManager::RemoveVTable(uint64_t file_num) { void VTableManager::RemoveVTable(uint64_t file_num) {
vtables_.erase(file_num); const auto it = vtables_.find(file_num);
if (it == vtables_.end()) { return; }
vtables_.erase(it);
} }
Status VTableManager::AddInvalid(uint64_t file_num) { Status VTableManager::AddInvalid(uint64_t file_num) {
@ -52,7 +53,7 @@ Status VTableManager::AddInvalid(uint64_t file_num) {
vtables_[file_num].invalid_num += 1; vtables_[file_num].invalid_num += 1;
if (vtables_[file_num].invalid_num >= vtables_[file_num].records_num) { if (vtables_[file_num].invalid_num >= vtables_[file_num].records_num) {
invalid_.insert(file_num); invalid_.emplace_back(file_num);
} }
MaybeScheduleGarbageCollect(); MaybeScheduleGarbageCollect();
@ -129,7 +130,7 @@ Status VTableManager::LoadVTableMeta() {
} }
AddVTable(vtable_meta); AddVTable(vtable_meta);
if (vtable_meta.invalid_num >= vtable_meta.records_num) { if (vtable_meta.invalid_num >= vtable_meta.records_num) {
invalid_.insert(vtable_meta.number); invalid_.emplace_back(vtable_meta.number);
} }
} else { } else {
return s; return s;
@ -141,34 +142,40 @@ Status VTableManager::LoadVTableMeta() {
void VTableManager::MaybeScheduleGarbageCollect() { void VTableManager::MaybeScheduleGarbageCollect() {
size_t size = 0; size_t size = 0;
auto* delete_list = new std::set<uint64_t>(); auto delete_list = std::vector<uint64_t>();
for (auto & file_num : invalid_) { if (!invalid_.empty()) {
size += vtables_[file_num].table_size; auto invalid = std::set<uint64_t>(invalid_.begin(), invalid_.end());
} invalid_ = std::vector<uint64_t>(invalid.begin(), invalid.end());
if (size >= gc_threshold_) { for (auto & file_num : invalid) {
auto* gc_info = new GCInfo; if (vtables_.find(file_num) != vtables_.end() && vtables_[file_num].ref <= 0) {
gc_info->dbname = dbname_; size += vtables_[file_num].table_size;
gc_info->file_list = delete_list; delete_list.emplace_back(file_num);
gc_info->env = env_; }
gc_info->vtable_manager = this; }
env_->StartThread(&VTableManager::BackgroudGC, gc_info); if (size >= gc_threshold_) {
// for (auto & file_num : gc_info->file_list) { for (auto & file_num : delete_list) {
// RemoveVTable(file_num); auto it = std::remove(invalid_.begin(), invalid_.end(), file_num);
// auto it = std::remove(invalid_.begin(), invalid_.end(), file_num); RemoveVTable(file_num);
// } }
auto* gc_info = new GCInfo;
gc_info->dbname = dbname_;
gc_info->file_list = delete_list;
gc_info->env = env_;
env_->StartThread(&VTableManager::BackgroudGC, gc_info);
// for (auto & file_num : gc_info->file_list) {
// RemoveVTable(file_num);
// auto it = std::remove(invalid_.begin(), invalid_.end(), file_num);
// }
}
} }
} }
void VTableManager::BackgroudGC(void* gc_info) { void VTableManager::BackgroudGC(void* gc_info) {
auto info = reinterpret_cast<GCInfo*>(gc_info); auto info = reinterpret_cast<GCInfo*>(gc_info);
for (auto & file_num : *info->file_list) { for (auto & file_num : info->file_list) {
// if (file_num <= 0) {continue;} // if (file_num <= 0) {continue;}
auto fname = VTableFileName(info->dbname, file_num); auto fname = VTableFileName(info->dbname, file_num);
info->env->RemoveFile(fname);
if (info->vtable_manager->vtables_[file_num].ref <= 0) {
info->env->RemoveFile(fname);
info->vtable_manager->invalid_.erase(file_num);
}
} }
} }

+ 1
- 1
table/vtable_manager.h 查看文件

@ -58,7 +58,7 @@ class VTableManager {
std::string dbname_; std::string dbname_;
Env* env_; Env* env_;
std::map<uint64_t, VTableMeta> vtables_; std::map<uint64_t, VTableMeta> vtables_;
std::set<uint64_t> invalid_; std::vector<uint64_t> invalid_;
size_t gc_threshold_; size_t gc_threshold_;
}; };

||||||
x
 
000:0
正在加载...
取消
保存