Skip to content

Commit e57ca68

Browse files
committed
feat: max_dict_bytes, zstd_max_train_bytes
1 parent cc2bb3c commit e57ca68

6 files changed

Lines changed: 65 additions & 8 deletions

File tree

kvrocks.conf

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -937,6 +937,19 @@ rocksdb.compression snappy
937937
# compression library as mentioned above)
938938
rocksdb.compression_level 32767
939939

940+
# Maximum per-SST dictionary size for block compression. Set to 0 to disable
941+
# dictionary compression.
942+
#
943+
# Default: 0
944+
rocksdb.max_dict_bytes 0
945+
946+
# Maximum amount of training data used by the ZSTD dictionary trainer. This is
947+
# most useful when rocksdb.compression is set to zstd and rocksdb.max_dict_bytes
948+
# is non-zero.
949+
#
950+
# Default: 0
951+
rocksdb.zstd_max_train_bytes 0
952+
940953
# If non-zero, we perform bigger reads when doing compaction. If you're
941954
# running RocksDB on spinning disks, you should set this to at least 2MB.
942955
# That way RocksDB's compaction is doing sequential instead of random reads.

src/config/config.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,10 @@ Config::Config() {
251251
/* rocksdb options */
252252
{"rocksdb.compression", false,
253253
new EnumField<rocksdb::CompressionType>(&rocks_db.compression, compression_types,
254-
rocksdb::CompressionType::kNoCompression)},
254+
rocksdb::CompressionType::kSnappyCompression)},
255255
{"rocksdb.compression_level", true, new IntField(&rocks_db.compression_level, 32767, INT_MIN, INT_MAX)},
256+
{"rocksdb.max_dict_bytes", true, new UInt32Field(&rocks_db.max_dict_bytes, 0, 0, UINT32_MAX)},
257+
{"rocksdb.zstd_max_train_bytes", true, new UInt32Field(&rocks_db.zstd_max_train_bytes, 0, 0, UINT32_MAX)},
256258
{"rocksdb.compression_start_level", false,
257259
new IntField(&rocks_db.compression_start_level, 2, 0, KVROCKS_MAX_LSM_LEVEL - 1)},
258260
{"rocksdb.block_size", true, new IntField(&rocks_db.block_size, 16384, 0, INT_MAX)},

src/config/config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ struct Config {
236236
rocksdb::CompressionType compression;
237237
int compression_start_level;
238238
int compression_level;
239+
uint32_t max_dict_bytes;
240+
uint32_t zstd_max_train_bytes;
239241
bool disable_auto_compactions;
240242
bool enable_blob_files;
241243
int min_blob_size;

src/storage/storage.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ rocksdb::Options Storage::InitRocksDBOptions() {
178178
options.write_buffer_size = config_->rocks_db.write_buffer_size * MiB;
179179
options.num_levels = KVROCKS_MAX_LSM_LEVEL;
180180
options.compression_opts.level = config_->rocks_db.compression_level;
181+
options.compression_opts.max_dict_bytes = config_->rocks_db.max_dict_bytes;
182+
options.compression_opts.zstd_max_train_bytes = config_->rocks_db.zstd_max_train_bytes;
181183
options.compression_per_level.resize(options.num_levels);
182184
options.wal_compression = config_->rocks_db.wal_compression;
183185
for (int i = 0; i < options.num_levels; ++i) {

tests/cppunit/config_test.cc

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ TEST(Config, GetAndSet) {
134134
{"rocksdb.row_cache_size", "100"},
135135
{"rocksdb.rate_limiter_auto_tuned", "yes"},
136136
{"rocksdb.compression_level", "32767"},
137+
{"rocksdb.max_dict_bytes", "16384"},
138+
{"rocksdb.zstd_max_train_bytes", "262144"},
137139
{"rocksdb.wal_compression", "no"},
138140
{"histogram-bucket-boundaries", "10,100,1000,10000"},
139141

@@ -149,9 +151,12 @@ TEST(Config, GetRenameCommand) {
149151
unlink(path);
150152

151153
std::ofstream output_file(path, std::ios::out);
152-
output_file << "rename-command KEYS KEYS_NEW" << "\n";
153-
output_file << "rename-command GET GET_NEW" << "\n";
154-
output_file << "rename-command SET SET_NEW" << "\n";
154+
output_file << "rename-command KEYS KEYS_NEW"
155+
<< "\n";
156+
output_file << "rename-command GET GET_NEW"
157+
<< "\n";
158+
output_file << "rename-command SET SET_NEW"
159+
<< "\n";
155160
output_file.close();
156161
redis::CommandTable::Reset();
157162
Config config;
@@ -171,9 +176,12 @@ TEST(Config, Rewrite) {
171176
unlink(path);
172177

173178
std::ofstream output_file(path, std::ios::out);
174-
output_file << "rename-command KEYS KEYS_NEW" << "\n";
175-
output_file << "rename-command GET GET_NEW" << "\n";
176-
output_file << "rename-command SET SET_NEW" << "\n";
179+
output_file << "rename-command KEYS KEYS_NEW"
180+
<< "\n";
181+
output_file << "rename-command GET GET_NEW"
182+
<< "\n";
183+
output_file << "rename-command SET SET_NEW"
184+
<< "\n";
177185
output_file.close();
178186

179187
redis::CommandTable::Reset();
@@ -189,6 +197,32 @@ TEST(Config, Rewrite) {
189197
unlink(path);
190198
}
191199

200+
TEST(Config, LoadRocksDBDictionaryCompressionOptions) {
201+
const char *path = "test.conf";
202+
unlink(path);
203+
204+
std::ofstream output_file(path, std::ios::out);
205+
output_file << "rocksdb.max_dict_bytes 16384"
206+
<< "\n";
207+
output_file << "rocksdb.zstd_max_train_bytes 262144"
208+
<< "\n";
209+
output_file.close();
210+
211+
Config config;
212+
ASSERT_TRUE(config.Load(CLIOptions(path)).IsOK());
213+
ASSERT_EQ(config.rocks_db.max_dict_bytes, 16384U);
214+
ASSERT_EQ(config.rocks_db.zstd_max_train_bytes, 262144U);
215+
216+
ASSERT_TRUE(config.Rewrite({}).IsOK());
217+
218+
Config rewritten_config;
219+
ASSERT_TRUE(rewritten_config.Load(CLIOptions(path)).IsOK());
220+
ASSERT_EQ(rewritten_config.rocks_db.max_dict_bytes, 16384U);
221+
ASSERT_EQ(rewritten_config.rocks_db.zstd_max_train_bytes, 262144U);
222+
223+
unlink(path);
224+
}
225+
192226
TEST(Config, ParseConfigLine) {
193227
ASSERT_EQ(*ParseConfigLine(""), ConfigKV{});
194228
ASSERT_EQ(*ParseConfigLine("# hello"), ConfigKV{});

tests/gocase/unit/config/config_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,14 @@ func TestConfigSetCompression(t *testing.T) {
123123
require.NoError(t, rdb.Do(ctx, "SET", "foo", "bar").Err())
124124

125125
configKey := "rocksdb.compression"
126+
vals, err := rdb.ConfigGet(ctx, configKey).Result()
127+
require.NoError(t, err)
128+
require.EqualValues(t, "snappy", vals[configKey])
129+
126130
supportedCompressions := []string{"no", "snappy", "zlib", "lz4", "zstd"}
127131
for _, compression := range supportedCompressions {
128132
require.NoError(t, rdb.ConfigSet(ctx, configKey, compression).Err())
129-
vals, err := rdb.ConfigGet(ctx, configKey).Result()
133+
vals, err = rdb.ConfigGet(ctx, configKey).Result()
130134
require.NoError(t, err)
131135
require.EqualValues(t, compression, vals[configKey])
132136
}

0 commit comments

Comments
 (0)