diff --git a/db/version_set.cc b/db/version_set.cc index ffbdd46cd..f8465027b 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -2327,10 +2327,14 @@ void CloseTables(void* ptr, size_t) { VersionSet::~VersionSet() { // we need to delete column_family_set_ because its destructor depends on // VersionSet - column_family_set_->get_table_cache()->ApplyToAllCacheEntries(&CloseTables, - false); + Cache* table_cache = column_family_set_->get_table_cache(); + table_cache->ApplyToAllCacheEntries(&CloseTables, false /* thread_safe */); column_family_set_.reset(); for (auto file : obsolete_files_) { + if (file->table_reader_handle) { + table_cache->Release(file->table_reader_handle); + TableCache::Evict(table_cache, file->fd.GetNumber()); + } delete file; } obsolete_files_.clear(); diff --git a/table/block_based_table_reader.cc b/table/block_based_table_reader.cc index 3c4f0b80e..a0b58c6b2 100644 --- a/table/block_based_table_reader.cc +++ b/table/block_based_table_reader.cc @@ -2083,6 +2083,9 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) { } void BlockBasedTable::Close() { + if (rep_->closed) { + return; + } rep_->filter_entry.Release(rep_->table_options.block_cache.get()); rep_->index_entry.Release(rep_->table_options.block_cache.get()); rep_->range_del_entry.Release(rep_->table_options.block_cache.get()); @@ -2099,6 +2102,7 @@ void BlockBasedTable::Close() { rep_->dummy_index_reader_offset, cache_key); rep_->table_options.block_cache.get()->Erase(key); } + rep_->closed = true; } Status BlockBasedTable::DumpIndexBlock(WritableFile* out_file) { diff --git a/table/block_based_table_reader.h b/table/block_based_table_reader.h index 8b3494ef5..3acc3a8fb 100644 --- a/table/block_based_table_reader.h +++ b/table/block_based_table_reader.h @@ -467,6 +467,7 @@ struct BlockBasedTable::Rep { // A value of kDisableGlobalSequenceNumber means that this feature is disabled // and every key have it's own seqno. SequenceNumber global_seqno; + bool closed = false; }; } // namespace rocksdb