This is an automated email from the ASF dual-hosted git repository.

hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new e00fcf10 feat(config): allow to config the rocksdb's max compaction 
bytes (#2802)
e00fcf10 is described below

commit e00fcf10621f242f6de4bf4602d79da8b9cfcc10
Author: hulk <[email protected]>
AuthorDate: Mon Feb 24 23:44:58 2025 +0800

    feat(config): allow to config the rocksdb's max compaction bytes (#2802)
---
 kvrocks.conf                            |  6 ++++++
 src/config/config.cc                    |  2 ++
 src/config/config.h                     |  1 +
 src/storage/storage.cc                  |  1 +
 tests/gocase/unit/config/config_test.go | 24 ++++++++++++++++++++++++
 5 files changed, 34 insertions(+)

diff --git a/kvrocks.conf b/kvrocks.conf
index 0d78d794..2d230b9f 100644
--- a/kvrocks.conf
+++ b/kvrocks.conf
@@ -1046,5 +1046,11 @@ rocksdb.partition_filters yes
 # Default: 0
 # rocksdb.write_options.write_batch_max_bytes 0
 
+# RocksDB will try to limit number of bytes in one compaction to be lower than 
this threshold.
+# If set to 0, it will be sanitized to [25 * target_file_size_base]
+#
+# Default: 0
+rocksdb.max_compaction_bytes 0
+
 ################################ NAMESPACE 
#####################################
 # namespace.test change.me
diff --git a/src/config/config.cc b/src/config/config.cc
index bc1518b3..8728fabe 100644
--- a/src/config/config.cc
+++ b/src/config/config.cc
@@ -299,6 +299,7 @@ Config::Config() {
       {"rocksdb.rate_limiter_auto_tuned", true, new 
YesNoField(&rocks_db.rate_limiter_auto_tuned, true)},
       {"rocksdb.avoid_unnecessary_blocking_io", true, new 
YesNoField(&rocks_db.avoid_unnecessary_blocking_io, true)},
       {"rocksdb.partition_filters", true, new 
YesNoField(&rocks_db.partition_filters, true)},
+      {"rocksdb.max_compaction_bytes", false, new 
Int64Field(&rocks_db.max_compaction_bytes, 0, 0, INT64_MAX)},
 
       /* rocksdb write options */
       {"rocksdb.write_options.sync", true, new 
YesNoField(&rocks_db.write_options.sync, false)},
@@ -734,6 +735,7 @@ void Config::initFieldCallback() {
       {"rocksdb.compaction_readahead_size", set_db_option_cb},
       {"rocksdb.max_background_jobs", set_db_option_cb},
 
+      {"rocksdb.max_compaction_bytes", set_cf_option_cb},
       {"rocksdb.max_write_buffer_number", set_cf_option_cb},
       {"rocksdb.level0_slowdown_writes_trigger", set_cf_option_cb},
       {"rocksdb.level0_stop_writes_trigger", set_cf_option_cb},
diff --git a/src/config/config.h b/src/config/config.h
index 3a9a7db4..6323b3b0 100644
--- a/src/config/config.h
+++ b/src/config/config.h
@@ -223,6 +223,7 @@ struct Config {
     bool rate_limiter_auto_tuned;
     bool avoid_unnecessary_blocking_io = true;
     bool partition_filters;
+    int64_t max_compaction_bytes;
 
     struct WriteOptions {
       bool sync;
diff --git a/src/storage/storage.cc b/src/storage/storage.cc
index adbe131a..e6bc881c 100644
--- a/src/storage/storage.cc
+++ b/src/storage/storage.cc
@@ -221,6 +221,7 @@ rocksdb::Options Storage::InitRocksDBOptions() {
   options.max_bytes_for_level_multiplier = 
config_->rocks_db.max_bytes_for_level_multiplier;
   options.level_compaction_dynamic_level_bytes = 
config_->rocks_db.level_compaction_dynamic_level_bytes;
   options.max_background_jobs = config_->rocks_db.max_background_jobs;
+  options.max_compaction_bytes = 
static_cast<uint64_t>(config_->rocks_db.max_compaction_bytes);
 
   // avoid blocking io on iteration
   // see https://github.com/facebook/rocksdb/wiki/IO#avoid-blocking-io
diff --git a/tests/gocase/unit/config/config_test.go 
b/tests/gocase/unit/config/config_test.go
index 827cd291..4d463618 100644
--- a/tests/gocase/unit/config/config_test.go
+++ b/tests/gocase/unit/config/config_test.go
@@ -347,3 +347,27 @@ func TestGetConfigSkipBlockCacheDeallocationOnClose(t 
*testing.T) {
        val = rdb.ConfigGet(ctx, "skip-block-cache-deallocation-on-close").Val()
        require.EqualValues(t, "no", 
val["skip-block-cache-deallocation-on-close"])
 }
+
+func TestConfigRocksDBOptions(t *testing.T) {
+       t.Parallel()
+       srv := util.StartServer(t, map[string]string{})
+       defer srv.Close()
+
+       rdb := srv.NewClient()
+       defer func() { require.NoError(t, rdb.Close()) }()
+
+       t.Run("Get and Set rocksdb.max_compaction_bytes", func(t *testing.T) {
+               ctx := context.Background()
+               parameter := "rocksdb.max_compaction_bytes"
+               result, err := rdb.ConfigGet(ctx, parameter).Result()
+               require.NoError(t, err)
+               require.EqualValues(t, "0", result[parameter])
+
+               util.ErrorRegexp(t, rdb.ConfigSet(ctx, parameter, "-1").Err(), 
".*out of numeric range")
+
+               require.NoError(t, rdb.ConfigSet(ctx, parameter, 
"1073741824").Err())
+               result, err = rdb.ConfigGet(ctx, parameter).Result()
+               require.NoError(t, err)
+               require.EqualValues(t, "1073741824", result[parameter])
+       })
+}

Reply via email to