diff --git a/db/db_impl.cc b/db/db_impl.cc
index 320b445..b130749 100644
--- a/db/db_impl.cc
+++ b/db/db_impl.cc
@@ -1291,7 +1291,7 @@ Status DBImpl::DecodeValue(std::string* value) const {
 
 Status DBImpl::Get(const ReadOptions& options, const Slice& key,
                    std::string* value) {
-  Status s = Status::TimeOutRead("");
+  Status s;
   MutexLock l(&mutex_);
   SequenceNumber snapshot;
   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,
                    Fields* fields) {
-  Status s = Status::TimeOutRead("");
+  Status s;
   MutexLock l(&mutex_);
   SequenceNumber snapshot;
   if (options.snapshot != nullptr) {
diff --git a/table/vtable_manager.cc b/table/vtable_manager.cc
index 21906ed..654ce37 100644
--- a/table/vtable_manager.cc
+++ b/table/vtable_manager.cc
@@ -14,9 +14,8 @@ namespace leveldb {
 
 struct GCInfo {
   std::string dbname;
-  std::set<uint64_t>* file_list;
+  std::vector<uint64_t> file_list;
   Env* env = nullptr;
-  VTableManager* vtable_manager = nullptr;
 };
 
 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) {
-  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) {
@@ -52,7 +53,7 @@ Status VTableManager::AddInvalid(uint64_t file_num) {
 
   vtables_[file_num].invalid_num += 1;
   if (vtables_[file_num].invalid_num >= vtables_[file_num].records_num) {
-    invalid_.insert(file_num);
+    invalid_.emplace_back(file_num);
   }
 
   MaybeScheduleGarbageCollect();
@@ -129,7 +130,7 @@ Status VTableManager::LoadVTableMeta() {
       }
       AddVTable(vtable_meta);
       if (vtable_meta.invalid_num >= vtable_meta.records_num) {
-        invalid_.insert(vtable_meta.number);
+        invalid_.emplace_back(vtable_meta.number);
       }
     } else {
       return s;
@@ -141,34 +142,40 @@ Status VTableManager::LoadVTableMeta() {
 
 void VTableManager::MaybeScheduleGarbageCollect() {
   size_t size = 0;
-  auto* delete_list = new std::set<uint64_t>();
-  for (auto & file_num : invalid_) {
-    size += vtables_[file_num].table_size;
-  }
-  if (size >= gc_threshold_) {
-    auto* gc_info = new GCInfo;
-    gc_info->dbname = dbname_;
-    gc_info->file_list = delete_list;
-    gc_info->env = env_;
-    gc_info->vtable_manager = this;
-    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);
-    // }
+  auto delete_list = std::vector<uint64_t>();
+  if (!invalid_.empty()) {
+    auto invalid = std::set<uint64_t>(invalid_.begin(), invalid_.end());
+    invalid_ = std::vector<uint64_t>(invalid.begin(), invalid.end());
+    for (auto & file_num : invalid) {
+      if (vtables_.find(file_num) != vtables_.end() && vtables_[file_num].ref <= 0) {
+        size += vtables_[file_num].table_size;
+        delete_list.emplace_back(file_num);
+      }
+    }
+    if (size >= gc_threshold_) {
+      for (auto & file_num : delete_list) {
+        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) {
   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;}
     auto fname = VTableFileName(info->dbname, file_num);
-
-    if (info->vtable_manager->vtables_[file_num].ref <= 0) {
-      info->env->RemoveFile(fname);
-      info->vtable_manager->invalid_.erase(file_num);
-    }
+    info->env->RemoveFile(fname);
   }
 }
 
diff --git a/table/vtable_manager.h b/table/vtable_manager.h
index 8199202..5a76a03 100644
--- a/table/vtable_manager.h
+++ b/table/vtable_manager.h
@@ -58,7 +58,7 @@ class VTableManager {
     std::string dbname_;
     Env* env_;
     std::map<uint64_t, VTableMeta> vtables_;
-    std::set<uint64_t> invalid_;
+    std::vector<uint64_t> invalid_;
     size_t gc_threshold_;
 };