diff --git a/db/version_set.cc b/db/version_set.cc index e1352ebe57..ad11691892 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -1163,7 +1163,7 @@ VersionSet::~VersionSet() { cfd.second->current->Unref(); // List must be empty assert(cfd.second->dummy_versions.next_ == &cfd.second->dummy_versions); - delete cfd.second; + cfd.second->Unref(); } for (auto file : obsolete_files_) { delete file; @@ -3059,7 +3059,8 @@ void VersionSet::DropColumnFamily(VersionEdit* edit) { cfd->second->current->Unref(); // List must be empty assert(cfd->second->dummy_versions.next_ == &cfd->second->dummy_versions); - delete cfd->second; + // might delete itself + cfd->second->Unref(); column_family_data_.erase(cfd); } diff --git a/db/version_set.h b/db/version_set.h index bd9b1095ae..b89083613c 100644 --- a/db/version_set.h +++ b/db/version_set.h @@ -223,11 +223,29 @@ struct ColumnFamilyData { Version dummy_versions; // Head of circular doubly-linked list of versions. Version* current; // == dummy_versions.prev_ ColumnFamilyOptions options; + int refs; + + void Ref() { + ++refs; + } + + void Unref() { + assert(refs > 0); + if (refs == 1) { + delete this; + } else { + --refs; + } + } ColumnFamilyData(const std::string& name, VersionSet* vset, const ColumnFamilyOptions& options) - : name(name), dummy_versions(vset), current(nullptr), options(options) {} + : name(name), + dummy_versions(vset), + current(nullptr), + options(options), + refs(1) {} ~ColumnFamilyData() {} };