Fix calling GetCurrentMutableCFOptions in CompactionJob::ProcessKeyValueCompaction()

Summary: GetCurrentMutableCFOptions() can only be called when DB mutex is held so we cannot call it in CompactionJob::ProcessKeyValueCompaction() since it's not holding the db mutex

Test Plan: make check -j64

Reviewers: sdong, andrewkr

Reviewed By: andrewkr

Subscribers: andrewkr, dhruba

Differential Revision: https://reviews.facebook.net/D57471
main
Islam AbdelRahman 9 years ago
parent 4ea6e051ee
commit 21441c09bd
  1. 2
      db/column_family.h
  2. 7
      db/compaction_job.cc

@ -209,7 +209,7 @@ class ColumnFamilyData {
const ImmutableCFOptions* ioptions() const { return &ioptions_; } const ImmutableCFOptions* ioptions() const { return &ioptions_; }
// REQUIRES: DB mutex held // REQUIRES: DB mutex held
// This returns the MutableCFOptions used by current SuperVersion // This returns the MutableCFOptions used by current SuperVersion
// You shoul use this API to reference MutableCFOptions most of the time. // You should use this API to reference MutableCFOptions most of the time.
const MutableCFOptions* GetCurrentMutableCFOptions() const { const MutableCFOptions* GetCurrentMutableCFOptions() const {
return &(super_version_->mutable_cf_options); return &(super_version_->mutable_cf_options);
} }

@ -669,6 +669,8 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
} }
ColumnFamilyData* cfd = sub_compact->compaction->column_family_data(); ColumnFamilyData* cfd = sub_compact->compaction->column_family_data();
const MutableCFOptions* mutable_cf_options =
sub_compact->compaction->mutable_cf_options();
// To build compression dictionary, we sample the first output file, assuming // To build compression dictionary, we sample the first output file, assuming
// it'll reach the maximum length, and then use the dictionary for compressing // it'll reach the maximum length, and then use the dictionary for compressing
@ -680,9 +682,8 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
cfd->ioptions()->compression_opts.max_dict_bytes > 0) { cfd->ioptions()->compression_opts.max_dict_bytes > 0) {
const size_t kMaxSamples = const size_t kMaxSamples =
cfd->ioptions()->compression_opts.max_dict_bytes >> kSampleLenShift; cfd->ioptions()->compression_opts.max_dict_bytes >> kSampleLenShift;
const size_t kOutFileLen = const size_t kOutFileLen = mutable_cf_options->MaxFileSizeForLevel(
cfd->GetCurrentMutableCFOptions()->MaxFileSizeForLevel( compact_->compaction->output_level());
compact_->compaction->output_level());
if (kOutFileLen != port::kMaxSizet) { if (kOutFileLen != port::kMaxSizet) {
const size_t kOutFileNumSamples = kOutFileLen >> kSampleLenShift; const size_t kOutFileNumSamples = kOutFileLen >> kSampleLenShift;
Random64 generator{versions_->NewFileNumber()}; Random64 generator{versions_->NewFileNumber()};

Loading…
Cancel
Save