From aaf9c6203c21b9056b3bf4654fee58ad8473240b Mon Sep 17 00:00:00 2001 From: Siying Dong Date: Wed, 11 Dec 2013 11:56:36 -0800 Subject: [PATCH] [RocksDB][Performance Branch]Iterator Cleanup method only tries to find obsolete files if it has the last reference to a version Summary: When deconstructing an iterator, no need to check obsolete file if it doesn't hold last reference of any version. Test Plan: make all check Reviewers: haobo, igor, dhruba, kailiu Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D14595 --- db/db_impl.cc | 7 ++++--- db/version_set.cc | 4 +++- db/version_set.h | 4 +++- 3 files changed, 10 insertions(+), 5 deletions(-) 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,