Browse Source

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
master
Chris Mumford 5 years ago
parent
commit
c00e177f36
2 changed files with 7 additions and 12 deletions
  1. +6
    -11
      db/db_impl.cc
  2. +1
    -1
      db/db_impl.h

+ 6
- 11
db/db_impl.cc View File

@ -893,10 +893,11 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) {
compact->smallest_snapshot = snapshots_.oldest()->sequence_number(); compact->smallest_snapshot = snapshots_.oldest()->sequence_number();
} }
Iterator* input = versions_->MakeInputIterator(compact->compaction);
// Release mutex while we're actually doing the compaction work // Release mutex while we're actually doing the compaction work
mutex_.Unlock(); mutex_.Unlock();
Iterator* input = versions_->MakeInputIterator(compact->compaction);
input->SeekToFirst(); input->SeekToFirst();
Status status; Status status;
ParsedInternalKey ikey; 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) { void DBImpl::GetApproximateSizes(const Range* range, int n, uint64_t* sizes) {
// TODO(opt): better implementation // 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++) { for (int i = 0; i < n; i++) {
// Convert user_key into a corresponding internal key. // 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); sizes[i] = (limit >= start ? limit - start : 0);
} }
{
MutexLock l(&mutex_);
v->Unref();
}
v->Unref();
} }
// Default implementations of convenience methods that subclasses of DB // Default implementations of convenience methods that subclasses of DB

+ 1
- 1
db/db_impl.h View File

@ -197,7 +197,7 @@ class DBImpl : public DB {
ManualCompaction* manual_compaction_ GUARDED_BY(mutex_); ManualCompaction* manual_compaction_ GUARDED_BY(mutex_);
VersionSet* const versions_;
VersionSet* const versions_ GUARDED_BY(mutex_);
// Have we encountered a background error in paranoid mode? // Have we encountered a background error in paranoid mode?
Status bg_error_ GUARDED_BY(mutex_); Status bg_error_ GUARDED_BY(mutex_);

Loading…
Cancel
Save