diff --git a/db/compaction/compaction_picker_level.cc b/db/compaction/compaction_picker_level.cc index 132c5a72a191..55ded6f72d66 100644 --- a/db/compaction/compaction_picker_level.cc +++ b/db/compaction/compaction_picker_level.cc @@ -902,6 +902,9 @@ bool LevelCompactionBuilder::PickIntraL0Compaction() { start_level_inputs_.clear(); const std::vector& level_files = vstorage_->LevelFiles(0 /* level */); + if (mutable_cf_options_.disable_intra_l0_compaction == true) { + return false; + } if (level_files.size() < static_cast( mutable_cf_options_.level0_file_num_compaction_trigger + 2) || diff --git a/db/db_impl/db_impl.h b/db/db_impl/db_impl.h index da1879688e56..7f5bb149a20f 100644 --- a/db/db_impl/db_impl.h +++ b/db/db_impl/db_impl.h @@ -452,6 +452,8 @@ class DBImpl : public DB { Status EnableAutoCompaction( const std::vector& column_family_handles) override; + Status EnableIntraL0Compaction( + const std::vector& column_family_handles) override; void EnableManualCompaction() override; void DisableManualCompaction() override; diff --git a/db/db_impl/db_impl_compaction_flush.cc b/db/db_impl/db_impl_compaction_flush.cc index 5e883874715e..5bccc5943c78 100644 --- a/db/db_impl/db_impl_compaction_flush.cc +++ b/db/db_impl/db_impl_compaction_flush.cc @@ -2793,7 +2793,19 @@ Status DBImpl::EnableAutoCompaction( return s; } +Status DBImpl::EnableIntraL0Compaction( + const std::vector& column_family_handles) { + Status s; + for (auto cf_ptr : column_family_handles) { + Status status = + this->SetOptions(cf_ptr, {{"disable_intra_l0_compaction", "false"}}); + if (!status.ok()) { + s = status; + } + } + return s; +} // NOTE: Calling DisableManualCompaction() may overwrite the // user-provided canceled variable in CompactRangeOptions void DBImpl::DisableManualCompaction() { diff --git a/include/rocksdb/db.h b/include/rocksdb/db.h index 0b9c506e5ce3..7b85d3dae6ee 100644 --- a/include/rocksdb/db.h +++ b/include/rocksdb/db.h @@ -1692,6 +1692,8 @@ class DB { virtual Status EnableAutoCompaction( const std::vector& column_family_handles) = 0; + virtual Status EnableIntraL0Compaction( + const std::vector& column_family_handles) = 0; // After this function call, CompactRange() or CompactFiles() will not // run compactions and fail. Calling this function will tell outstanding // manual compactions to abort and will wait for them to finish or abort diff --git a/include/rocksdb/options.h b/include/rocksdb/options.h index e932af5628c7..d08f77eb9394 100644 --- a/include/rocksdb/options.h +++ b/include/rocksdb/options.h @@ -313,6 +313,9 @@ struct ColumnFamilyOptions : public AdvancedColumnFamilyOptions { // Dynamically changeable through SetOptions() API bool disable_auto_compactions = false; + // Disable Intra Level 0 Compaction for low write amplification. + bool disable_intra_l0_compaction = false; + // This is a factory that provides TableFactory objects. // Default: a block-based table factory that provides a default // implementation of TableBuilder and TableReader with default diff --git a/include/rocksdb/utilities/stackable_db.h b/include/rocksdb/utilities/stackable_db.h index 0710c713de0b..b6df07da2ee3 100644 --- a/include/rocksdb/utilities/stackable_db.h +++ b/include/rocksdb/utilities/stackable_db.h @@ -369,6 +369,11 @@ class StackableDB : public DB { return db_->EnableAutoCompaction(column_family_handles); } + Status EnableIntraL0Compaction( + const std::vector& column_family_handles) override { + return db_->EnableIntraL0Compaction(column_family_handles); + } + void EnableManualCompaction() override { return db_->EnableManualCompaction(); } diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 5aad46fa4926..6ebddb504bb7 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -2972,6 +2972,21 @@ void Java_org_rocksdb_RocksDB_enableAutoCompaction(JNIEnv* env, jclass, db->EnableAutoCompaction(cf_handles); } +void Java_org_rocksdb_RocksDB_enableIntraL0Compaction(JNIEnv* env, jclass, + jlong jdb_handle, + jlongArray jcf_handles) { + auto* db = reinterpret_cast(jdb_handle); + jboolean has_exception = JNI_FALSE; + const std::vector cf_handles = + ROCKSDB_NAMESPACE::JniUtil::fromJPointers< + ROCKSDB_NAMESPACE::ColumnFamilyHandle>(env, jcf_handles, + &has_exception); + if (has_exception == JNI_TRUE) { + // exception occurred + return; + } + db->EnableIntraL0Compaction(cf_handles); +} /* * Class: org_rocksdb_RocksDB * Method: numberLevels diff --git a/options/cf_options.cc b/options/cf_options.cc index f0e9e26b43b5..88674b95dbb0 100644 --- a/options/cf_options.cc +++ b/options/cf_options.cc @@ -366,6 +366,10 @@ static std::unordered_map {offsetof(struct MutableCFOptions, disable_auto_compactions), OptionType::kBoolean, OptionVerificationType::kNormal, OptionTypeFlags::kMutable}}, + {"disable_intra_l0_compaction", + {offsetof(struct MutableCFOptions, disable_intra_l0_compaction), + OptionType::kBoolean, OptionVerificationType::kNormal, + OptionTypeFlags::kMutable}}, {"table_factory", {offsetof(struct MutableCFOptions, table_factory), OptionType::kCustomizable, OptionVerificationType::kByName, diff --git a/options/cf_options.h b/options/cf_options.h index 539ddf494f75..e171237e2ff9 100644 --- a/options/cf_options.h +++ b/options/cf_options.h @@ -120,6 +120,7 @@ struct MutableCFOptions { experimental_mempurge_threshold( options.experimental_mempurge_threshold), disable_auto_compactions(options.disable_auto_compactions), + disable_intra_l0_compaction(options.disable_intra_l0_compaction), table_factory(options.table_factory), soft_pending_compaction_bytes_limit( options.soft_pending_compaction_bytes_limit), @@ -298,6 +299,8 @@ struct MutableCFOptions { // Compaction related options bool disable_auto_compactions; + bool disable_intra_l0_compaction; + std::shared_ptr table_factory; uint64_t soft_pending_compaction_bytes_limit; uint64_t hard_pending_compaction_bytes_limit; diff --git a/options/options.cc b/options/options.cc index d9f64f93d235..364bb3e81411 100644 --- a/options/options.cc +++ b/options/options.cc @@ -310,6 +310,8 @@ void ColumnFamilyOptions::Dump(Logger* log) const { hard_pending_compaction_bytes_limit); ROCKS_LOG_HEADER(log, " Options.disable_auto_compactions: %d", disable_auto_compactions); + ROCKS_LOG_HEADER(log, " Options.disable_intra_l0_compaction: %d", + disable_intra_l0_compaction); const auto& it_compaction_style = compaction_style_to_string.find(compaction_style); diff --git a/options/options_helper.cc b/options/options_helper.cc index efc91aa9f2f8..25f9b658d03f 100644 --- a/options/options_helper.cc +++ b/options/options_helper.cc @@ -239,6 +239,7 @@ void UpdateColumnFamilyOptions(const MutableCFOptions& moptions, // Compaction related options cf_opts->disable_auto_compactions = moptions.disable_auto_compactions; + cf_opts->disable_intra_l0_compaction = moptions.disable_intra_l0_compaction; cf_opts->table_factory = moptions.table_factory; cf_opts->soft_pending_compaction_bytes_limit = moptions.soft_pending_compaction_bytes_limit;