diff --git a/db/db_impl.cc b/db/db_impl.cc index 895bb20cc..192232483 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -2515,9 +2515,10 @@ static void CleanupIteratorState(void* arg1, void* arg2) { deletion_state.memtables_to_free.push_back(m); } } - state->version->Unref(); - // fast path FindObsoleteFiles - state->db->FindObsoleteFiles(deletion_state, false, true); + if (state->version->Unref()) { + // fast path FindObsoleteFiles + state->db->FindObsoleteFiles(deletion_state, false, true); + } state->mu->Unlock(); state->db->PurgeObsoleteFiles(deletion_state); delete state; diff --git a/db/version_set.cc b/db/version_set.cc index 653695caf..74a33b6fb 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -591,13 +591,15 @@ void Version::Ref() { ++refs_; } -void Version::Unref() { +bool Version::Unref() { assert(this != &vset_->dummy_versions_); assert(refs_ >= 1); --refs_; if (refs_ == 0) { delete this; + return true; } + return false; } bool Version::OverlapInLevel(int level, diff --git a/db/version_set.h b/db/version_set.h index bf466a932..aab4b82bc 100644 --- a/db/version_set.h +++ b/db/version_set.h @@ -89,7 +89,9 @@ class Version { // Reference count management (so Versions do not disappear out from // under live iterators) void Ref(); - void Unref(); + // Decrease reference count. Delete the object if no reference left + // and return true. Otherwise, return false. + bool Unref(); void GetOverlappingInputs( int level,