Skip to content

Commit e12d755

Browse files
authored
[ISSUE #10344] Parameterize RocksDB CQ size amplification
1 parent a705dbc commit e12d755

3 files changed

Lines changed: 45 additions & 7 deletions

File tree

store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,8 @@ public class MessageStoreConfig {
505505

506506
private String rocksdbCompressionType = CompressionType.LZ4_COMPRESSION.getLibraryName();
507507

508+
private int rocksdbMaxSizeAmplificationPercent = 25;
509+
508510
private long popRocksdbBlockCacheSize = 256 * SizeUnit.MB;
509511

510512
private long popRocksdbWriteBufferSize = 32 * SizeUnit.MB;
@@ -535,6 +537,14 @@ public void setRocksdbCompressionType(String compressionType) {
535537
this.rocksdbCompressionType = compressionType;
536538
}
537539

540+
public int getRocksdbMaxSizeAmplificationPercent() {
541+
return rocksdbMaxSizeAmplificationPercent;
542+
}
543+
544+
public void setRocksdbMaxSizeAmplificationPercent(int rocksdbMaxSizeAmplificationPercent) {
545+
this.rocksdbMaxSizeAmplificationPercent = rocksdbMaxSizeAmplificationPercent;
546+
}
547+
538548
public long getPopRocksdbBlockCacheSize() {
539549
return popRocksdbBlockCacheSize;
540550
}

store/src/main/java/org/apache/rocketmq/store/rocksdb/RocksDBOptionsFactory.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.rocketmq.common.config.ConfigHelper;
2020
import org.apache.rocketmq.store.MessageStore;
21+
import org.apache.rocketmq.store.config.MessageStoreConfig;
2122
import org.rocksdb.BlockBasedTableConfig;
2223
import org.rocksdb.BloomFilter;
2324
import org.rocksdb.ColumnFamilyOptions;
@@ -57,19 +58,18 @@ public static ColumnFamilyOptions createCQCFOptions(final MessageStore messageSt
5758
setBlockCache(new LRUCache(1024 * SizeUnit.MB, 8, false)).
5859
setWholeKeyFiltering(true);
5960

61+
MessageStoreConfig messageStoreConfig = messageStore.getMessageStoreConfig();
6062
ColumnFamilyOptions columnFamilyOptions = new ColumnFamilyOptions();
61-
CompactionOptionsUniversal compactionOption = new CompactionOptionsUniversal();
62-
compactionOption.setSizeRatio(100).
63-
setMaxSizeAmplificationPercent(25).
63+
CompactionOptionsUniversal compactionOption = new CompactionOptionsUniversal().
64+
setSizeRatio(100).
65+
setMaxSizeAmplificationPercent(messageStoreConfig.getRocksdbMaxSizeAmplificationPercent()).
6466
setAllowTrivialMove(true).
6567
setMinMergeWidth(2).
6668
setMaxMergeWidth(Integer.MAX_VALUE).
6769
setStopStyle(CompactionStopStyle.CompactionStopStyleTotalSize).
6870
setCompressionSizePercent(-1);
69-
String bottomMostCompressionTypeOpt = messageStore.getMessageStoreConfig()
70-
.getBottomMostCompressionTypeForConsumeQueueStore();
71-
String compressionTypeOpt = messageStore.getMessageStoreConfig()
72-
.getRocksdbCompressionType();
71+
String bottomMostCompressionTypeOpt = messageStoreConfig.getBottomMostCompressionTypeForConsumeQueueStore();
72+
String compressionTypeOpt = messageStoreConfig.getRocksdbCompressionType();
7373
CompressionType bottomMostCompressionType = CompressionType.getCompressionType(bottomMostCompressionTypeOpt);
7474
CompressionType compressionType = CompressionType.getCompressionType(compressionTypeOpt);
7575
return columnFamilyOptions.setMaxWriteBufferNumber(4).

store/src/test/java/org/apache/rocketmq/store/rocksdb/RocksDBOptionsFactoryTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,46 @@
1717

1818
package org.apache.rocketmq.store.rocksdb;
1919

20+
import org.apache.rocketmq.store.MessageStore;
2021
import org.apache.rocketmq.store.config.MessageStoreConfig;
2122
import org.junit.Assert;
23+
import org.junit.BeforeClass;
2224
import org.junit.Test;
25+
import org.rocksdb.ColumnFamilyOptions;
26+
import org.rocksdb.CompactionOptionsUniversal;
2327
import org.rocksdb.CompressionType;
28+
import org.rocksdb.RocksDB;
29+
30+
import static org.mockito.Mockito.mock;
31+
import static org.mockito.Mockito.when;
2432

2533
public class RocksDBOptionsFactoryTest {
2634

35+
@BeforeClass
36+
public static void loadRocksDB() {
37+
RocksDB.loadLibrary();
38+
}
39+
2740
@Test
2841
public void testBottomMostCompressionType() {
2942
MessageStoreConfig config = new MessageStoreConfig();
3043
Assert.assertEquals(CompressionType.ZSTD_COMPRESSION,
3144
CompressionType.getCompressionType(config.getBottomMostCompressionTypeForConsumeQueueStore()));
3245
Assert.assertEquals(CompressionType.LZ4_COMPRESSION, CompressionType.getCompressionType("lz4"));
3346
}
47+
48+
@Test
49+
public void testConsumeQueueUniversalCompactionMaxSizeAmplificationPercent() {
50+
MessageStoreConfig config = new MessageStoreConfig();
51+
config.setRocksdbMaxSizeAmplificationPercent(50);
52+
MessageStore messageStore = mock(MessageStore.class);
53+
when(messageStore.getMessageStoreConfig()).thenReturn(config);
54+
55+
ConsumeQueueCompactionFilterFactory compactionFilterFactory = new ConsumeQueueCompactionFilterFactory(() -> 0);
56+
try (ColumnFamilyOptions options = RocksDBOptionsFactory.createCQCFOptions(messageStore, compactionFilterFactory);
57+
CompactionOptionsUniversal compactionOptions = options.compactionOptionsUniversal()) {
58+
Assert.assertEquals(50, compactionOptions.maxSizeAmplificationPercent());
59+
}
60+
}
61+
3462
}

0 commit comments

Comments
 (0)