From c00e177f3613068eda4bff4abfbd3bd4165a86e8 Mon Sep 17 00:00:00 2001 From: Chris Mumford Date: Wed, 15 May 2019 13:13:13 -0700 Subject: [PATCH] Guard DBImpl::versions_ by mutex_. mutex_ was already acquired before accessing DBImpl::versions_ in all but one place: DBImpl::GetApproximateSizes. This change requires mutex_ to be held before accessing versions_. PiperOrigin-RevId: 248390814 --- db/db_impl.cc | 17 ++++++----------- db/db_impl.h | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index 067c67d95d..94b5d4c35c 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -893,10 +893,11 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) { compact->smallest_snapshot = snapshots_.oldest()->sequence_number(); } + Iterator* input = versions_->MakeInputIterator(compact->compaction); + // Release mutex while we're actually doing the compaction work mutex_.Unlock(); - Iterator* input = versions_->MakeInputIterator(compact->compaction); input->SeekToFirst(); Status status; ParsedInternalKey ikey; @@ -1433,12 +1434,9 @@ bool DBImpl::GetProperty(const Slice& property, std::string* value) { void DBImpl::GetApproximateSizes(const Range* range, int n, uint64_t* sizes) { // TODO(opt): better implementation - Version* v; - { - MutexLock l(&mutex_); - versions_->current()->Ref(); - v = versions_->current(); - } + MutexLock l(&mutex_); + Version* v = versions_->current(); + v->Ref(); for (int i = 0; i < n; i++) { // Convert user_key into a corresponding internal key. @@ -1449,10 +1447,7 @@ void DBImpl::GetApproximateSizes(const Range* range, int n, uint64_t* sizes) { sizes[i] = (limit >= start ? limit - start : 0); } - { - MutexLock l(&mutex_); - v->Unref(); - } + v->Unref(); } // Default implementations of convenience methods that subclasses of DB diff --git a/db/db_impl.h b/db/db_impl.h index a3f1ed1664..685735c733 100644 --- a/db/db_impl.h +++ b/db/db_impl.h @@ -197,7 +197,7 @@ class DBImpl : public DB { ManualCompaction* manual_compaction_ GUARDED_BY(mutex_); - VersionSet* const versions_; + VersionSet* const versions_ GUARDED_BY(mutex_); // Have we encountered a background error in paranoid mode? Status bg_error_ GUARDED_BY(mutex_);