From 54b533d7cbad60089348cfdb2ac37c988f1828f4 Mon Sep 17 00:00:00 2001 From: alexfisher <1823748191@qq.com> Date: Sat, 30 Nov 2024 22:51:33 +0800 Subject: [PATCH] version 2 roughly complete with GC --- db/builder.cc | 9 +++++++++ db/db_impl.cc | 29 ++++++++++++++++++++++++----- db/repair.cc | 2 +- db/version_edit.cc | 4 ++++ db/version_edit.h | 5 ++++- db/version_set.cc | 2 +- test/test.cpp | 6 ++++-- 7 files changed, 47 insertions(+), 10 deletions(-) diff --git a/db/builder.cc b/db/builder.cc index e6329e0..7cf13f8 100644 --- a/db/builder.cc +++ b/db/builder.cc @@ -28,6 +28,15 @@ Status BuildTable(const std::string& dbname, Env* env, const Options& options, return s; } + { + auto tmp_value=iter->value(); + if(tmp_value.data()[0]==(char)(0x01)){ + tmp_value.remove_prefix(1); + assert(GetVarint64(&tmp_value,&meta->valuelog_id)); + } + else meta->valuelog_id=0; + } + TableBuilder* builder = new TableBuilder(options, file); meta->smallest.DecodeFrom(iter->key()); Slice key; diff --git a/db/db_impl.cc b/db/db_impl.cc index f09caf1..94a45b2 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -57,6 +57,7 @@ struct DBImpl::CompactionState { struct Output { uint64_t number; uint64_t file_size; + uint64_t valuelog_id; InternalKey smallest, largest; }; @@ -541,7 +542,7 @@ Status DBImpl::WriteLevel0Table(MemTable* mem, VersionEdit* edit, level = base->PickLevelForMemTableOutput(min_user_key, max_user_key); } edit->AddFile(level, meta.number, meta.file_size, meta.smallest, - meta.largest); + meta.largest,meta.valuelog_id); } CompactionStats stats; @@ -745,7 +746,7 @@ void DBImpl::BackgroundCompaction() { FileMetaData* f = c->input(0, 0); c->edit()->RemoveFile(c->level(), f->number); c->edit()->AddFile(c->level() + 1, f->number, f->file_size, f->smallest, - f->largest); + f->largest,f->valuelog_id); status = versions_->LogAndApply(c->edit(), &mutex_); if (!status.ok()) { RecordBackgroundError(status); @@ -819,8 +820,11 @@ Status DBImpl::OpenCompactionOutputFile(CompactionState* compact) { out.number = file_number; out.smallest.Clear(); out.largest.Clear(); - compact->outputs.push_back(out); compact->valuelog_file_id=versions_->NewFileNumber(); + out.valuelog_id=compact->valuelog_file_id; + + compact->outputs.push_back(out); + mutex_.Unlock(); } @@ -913,7 +917,7 @@ Status DBImpl::InstallCompactionResults(CompactionState* compact) { for (size_t i = 0; i < compact->outputs.size(); i++) { const CompactionState::Output& out = compact->outputs[i]; compact->compaction->edit()->AddFile(level + 1, out.number, out.file_size, - out.smallest, out.largest); + out.smallest, out.largest,out.valuelog_id); } return versions_->LogAndApply(compact->compaction->edit(), &mutex_); } @@ -947,6 +951,12 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) { std::string current_user_key; bool has_current_user_key = false; SequenceNumber last_sequence_for_key = kMaxSequenceNumber; + std::set old_valuelog_ids; + for (int which = 0; which < 2; which++) { + for (int i = 0; i < compact->compaction->num_input_files(which); i++) { + if(compact->compaction->input(which, i)->valuelog_id)old_valuelog_ids.emplace(compact->compaction->input(which, i)->valuelog_id); + } + } while (input->Valid() && !shutting_down_.load(std::memory_order_acquire)) { // Prioritize immutable compaction work if (has_imm_.load(std::memory_order_relaxed)) { @@ -1035,6 +1045,7 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) { new_value=old_value; } else{ + old_value.remove_prefix(1); uint64_t file_id,valuelog_offset,valuelog_len; bool res=GetVarint64(&old_value,&file_id); if(!res)assert(0); @@ -1078,6 +1089,14 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) { if (status.ok()) { status = input->status(); } + //not completely correct, should be written in new function, related to removeabsol... + if(status.ok()){ + for(auto id:old_valuelog_ids){ + auto valuelog_filename=ValueLogFileName(dbname_,id); + Status s=env_->RemoveFile(valuelog_filename); + assert(s.ok()); + } + } delete input; input = nullptr; @@ -1607,7 +1626,7 @@ Status DBImpl::ReadValueLog(uint64_t file_id, uint64_t offset,uint64_t len,Slice //std::cout<& files = current_->files_[level]; for (size_t i = 0; i < files.size(); i++) { const FileMetaData* f = files[i]; - edit.AddFile(level, f->number, f->file_size, f->smallest, f->largest); + edit.AddFile(level, f->number, f->file_size, f->smallest, f->largest,f->valuelog_id); } } diff --git a/test/test.cpp b/test/test.cpp index 14c2a51..ca6a5ec 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -10,6 +10,8 @@ using FieldArray=std::vector>; Status OpenDB(std::string dbName, DB **db) { Options options; + options.max_file_size=16*1024; + options.write_buffer_size=32*1024; options.create_if_missing = true; return DB::Open(options, dbName, db); } @@ -165,7 +167,7 @@ TEST(Test, LARGE_DATA_COMPACT_TEST) { abort(); } std::vector values; - for(int i=0;i<1000;i++){ + for(int i=0;i<100000;i++){ std::string key=std::to_string(i); std::string value; for(int j=0;j<1000;j++){ @@ -174,7 +176,7 @@ TEST(Test, LARGE_DATA_COMPACT_TEST) { values.push_back(value); db->Put(writeOptions,key,value); } - for(int i=0;i<1000;i++){ + for(int i=0;i<100000;i++){ std::string key=std::to_string(i); std::string value; Status s=db->Get(readOptions,key,&value);