diff --git a/db/version_set.cc b/db/version_set.cc index 84fe95a9b535..6e5f0c2c4ec9 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -3339,11 +3339,12 @@ void VersionStorageInfo::GenerateLevelFilesBrief() { void VersionStorageInfo::PrepareForVersionAppend( const ImmutableOptions& immutable_options, - const MutableCFOptions& mutable_cf_options) { + const MutableCFOptions& mutable_cf_options, uint32_t max_compation_job) { ComputeCompensatedSizes(); UpdateNumNonEmptyLevels(); CalculateBaseBytes(immutable_options, mutable_cf_options); - UpdateFilesByCompactionPri(immutable_options, mutable_cf_options); + UpdateFilesByCompactionPri(immutable_options, mutable_cf_options, + max_compation_job); GenerateFileIndexer(); GenerateLevelFilesBrief(); GenerateLevel0NonOverlapping(); @@ -3361,7 +3362,9 @@ void Version::PrepareAppend(const ReadOptions& read_options, UpdateAccumulatedStats(read_options); } - storage_info_.PrepareForVersionAppend(cfd_->ioptions(), mutable_cf_options_); + int max_compation_job = env_->GetBackgroundThreads(Env::Priority::LOW); + storage_info_.PrepareForVersionAppend(cfd_->ioptions(), mutable_cf_options_, + max_compation_job); } bool Version::MaybeInitializeFileMetaData(const ReadOptions& read_options, @@ -4208,8 +4211,8 @@ namespace { void SortFileByOverlappingRatio( const InternalKeyComparator& icmp, const std::vector& files, const std::vector& next_level_files, SystemClock* clock, - int level, int num_non_empty_levels, uint64_t ttl, - std::vector* temp) { + int level, int num_non_empty_levels, uint64_t ttl, std::vector* temp, + uint32_t max_compaction_job) { std::unordered_map file_to_order; auto next_level_it = next_level_files.begin(); @@ -4250,9 +4253,10 @@ void SortFileByOverlappingRatio( ttl_boost_score; } - size_t num_to_sort = temp->size() > VersionStorageInfo::kNumberFilesToSort - ? VersionStorageInfo::kNumberFilesToSort - : temp->size(); + size_t num_to_sort = + (max_compaction_job > temp->size() || max_compaction_job == 0) + ? temp->size() + : max_compaction_job; std::partial_sort( temp->begin(), temp->begin() + num_to_sort, temp->end(), @@ -4332,7 +4336,8 @@ void SortFileByRoundRobin(const InternalKeyComparator& icmp, } // anonymous namespace void VersionStorageInfo::UpdateFilesByCompactionPri( - const ImmutableOptions& ioptions, const MutableCFOptions& options) { + const ImmutableOptions& ioptions, const MutableCFOptions& options, + uint32_t max_compaction_job) { if (compaction_style_ == kCompactionStyleNone || compaction_style_ == kCompactionStyleFIFO || compaction_style_ == kCompactionStyleUniversal) { @@ -4379,7 +4384,8 @@ void VersionStorageInfo::UpdateFilesByCompactionPri( case kMinOverlappingRatio: SortFileByOverlappingRatio(*internal_comparator_, files_[level], files_[level + 1], ioptions.clock, level, - num_non_empty_levels_, options.ttl, &temp); + num_non_empty_levels_, options.ttl, &temp, + max_compaction_job); break; case kRoundRobin: SortFileByRoundRobin(*internal_comparator_, &compact_cursor_, diff --git a/db/version_set.h b/db/version_set.h index 365d2838183d..917c8c07e8ce 100644 --- a/db/version_set.h +++ b/db/version_set.h @@ -184,7 +184,8 @@ class VersionStorageInfo { void AddBlobFile(std::shared_ptr blob_file_meta); void PrepareForVersionAppend(const ImmutableOptions& immutable_options, - const MutableCFOptions& mutable_cf_options); + const MutableCFOptions& mutable_cf_options, + uint32_t max_compation_job = 0); // REQUIRES: PrepareForVersionAppend has been called void SetFinalized(); @@ -648,7 +649,8 @@ class VersionStorageInfo { void CalculateBaseBytes(const ImmutableOptions& ioptions, const MutableCFOptions& options); void UpdateFilesByCompactionPri(const ImmutableOptions& immutable_options, - const MutableCFOptions& mutable_cf_options); + const MutableCFOptions& mutable_cf_options, + uint32_t max_compaction_job); void GenerateFileIndexer() { file_indexer_.UpdateIndex(&arena_, num_non_empty_levels_, files_);