1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
8 import org
.junit
.ClassRule
;
10 import org
.rocksdb
.test
.RemoveEmptyValueCompactionFilterFactory
;
12 import java
.util
.ArrayList
;
13 import java
.util
.List
;
14 import java
.util
.Properties
;
15 import java
.util
.Random
;
17 import static org
.assertj
.core
.api
.Assertions
.assertThat
;
19 public class ColumnFamilyOptionsTest
{
22 public static final RocksNativeLibraryResource ROCKS_NATIVE_LIBRARY_RESOURCE
=
23 new RocksNativeLibraryResource();
25 public static final Random rand
= PlatformRandomHelper
.
26 getPlatformSpecificRandomFactory();
29 public void copyConstructor() {
30 ColumnFamilyOptions origOpts
= new ColumnFamilyOptions();
31 origOpts
.setNumLevels(rand
.nextInt(8));
32 origOpts
.setTargetFileSizeMultiplier(rand
.nextInt(100));
33 origOpts
.setLevel0StopWritesTrigger(rand
.nextInt(50));
34 ColumnFamilyOptions copyOpts
= new ColumnFamilyOptions(origOpts
);
35 assertThat(origOpts
.numLevels()).isEqualTo(copyOpts
.numLevels());
36 assertThat(origOpts
.targetFileSizeMultiplier()).isEqualTo(copyOpts
.targetFileSizeMultiplier());
37 assertThat(origOpts
.level0StopWritesTrigger()).isEqualTo(copyOpts
.level0StopWritesTrigger());
41 public void getColumnFamilyOptionsFromProps() {
42 Properties properties
= new Properties();
43 properties
.put("write_buffer_size", "112");
44 properties
.put("max_write_buffer_number", "13");
46 try (final ColumnFamilyOptions opt
= ColumnFamilyOptions
.
47 getColumnFamilyOptionsFromProps(properties
)) {
48 // setup sample properties
49 assertThat(opt
).isNotNull();
50 assertThat(String
.valueOf(opt
.writeBufferSize())).
51 isEqualTo(properties
.get("write_buffer_size"));
52 assertThat(String
.valueOf(opt
.maxWriteBufferNumber())).
53 isEqualTo(properties
.get("max_write_buffer_number"));
58 public void failColumnFamilyOptionsFromPropsWithIllegalValue() {
59 // setup sample properties
60 final Properties properties
= new Properties();
61 properties
.put("tomato", "1024");
62 properties
.put("burger", "2");
64 try (final ColumnFamilyOptions opt
=
65 ColumnFamilyOptions
.getColumnFamilyOptionsFromProps(properties
)) {
66 assertThat(opt
).isNull();
70 @Test(expected
= IllegalArgumentException
.class)
71 public void failColumnFamilyOptionsFromPropsWithNullValue() {
72 try (final ColumnFamilyOptions opt
=
73 ColumnFamilyOptions
.getColumnFamilyOptionsFromProps(null)) {
77 @Test(expected
= IllegalArgumentException
.class)
78 public void failColumnFamilyOptionsFromPropsWithEmptyProps() {
79 try (final ColumnFamilyOptions opt
=
80 ColumnFamilyOptions
.getColumnFamilyOptionsFromProps(
86 public void writeBufferSize() throws RocksDBException
{
87 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
88 final long longValue
= rand
.nextLong();
89 opt
.setWriteBufferSize(longValue
);
90 assertThat(opt
.writeBufferSize()).isEqualTo(longValue
);
95 public void maxWriteBufferNumber() {
96 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
97 final int intValue
= rand
.nextInt();
98 opt
.setMaxWriteBufferNumber(intValue
);
99 assertThat(opt
.maxWriteBufferNumber()).isEqualTo(intValue
);
104 public void minWriteBufferNumberToMerge() {
105 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
106 final int intValue
= rand
.nextInt();
107 opt
.setMinWriteBufferNumberToMerge(intValue
);
108 assertThat(opt
.minWriteBufferNumberToMerge()).isEqualTo(intValue
);
113 public void numLevels() {
114 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
115 final int intValue
= rand
.nextInt();
116 opt
.setNumLevels(intValue
);
117 assertThat(opt
.numLevels()).isEqualTo(intValue
);
122 public void levelZeroFileNumCompactionTrigger() {
123 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
124 final int intValue
= rand
.nextInt();
125 opt
.setLevelZeroFileNumCompactionTrigger(intValue
);
126 assertThat(opt
.levelZeroFileNumCompactionTrigger()).isEqualTo(intValue
);
131 public void levelZeroSlowdownWritesTrigger() {
132 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
133 final int intValue
= rand
.nextInt();
134 opt
.setLevelZeroSlowdownWritesTrigger(intValue
);
135 assertThat(opt
.levelZeroSlowdownWritesTrigger()).isEqualTo(intValue
);
140 public void levelZeroStopWritesTrigger() {
141 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
142 final int intValue
= rand
.nextInt();
143 opt
.setLevelZeroStopWritesTrigger(intValue
);
144 assertThat(opt
.levelZeroStopWritesTrigger()).isEqualTo(intValue
);
149 public void targetFileSizeBase() {
150 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
151 final long longValue
= rand
.nextLong();
152 opt
.setTargetFileSizeBase(longValue
);
153 assertThat(opt
.targetFileSizeBase()).isEqualTo(longValue
);
158 public void targetFileSizeMultiplier() {
159 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
160 final int intValue
= rand
.nextInt();
161 opt
.setTargetFileSizeMultiplier(intValue
);
162 assertThat(opt
.targetFileSizeMultiplier()).isEqualTo(intValue
);
167 public void maxBytesForLevelBase() {
168 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
169 final long longValue
= rand
.nextLong();
170 opt
.setMaxBytesForLevelBase(longValue
);
171 assertThat(opt
.maxBytesForLevelBase()).isEqualTo(longValue
);
176 public void levelCompactionDynamicLevelBytes() {
177 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
178 final boolean boolValue
= rand
.nextBoolean();
179 opt
.setLevelCompactionDynamicLevelBytes(boolValue
);
180 assertThat(opt
.levelCompactionDynamicLevelBytes())
181 .isEqualTo(boolValue
);
186 public void maxBytesForLevelMultiplier() {
187 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
188 final double doubleValue
= rand
.nextDouble();
189 opt
.setMaxBytesForLevelMultiplier(doubleValue
);
190 assertThat(opt
.maxBytesForLevelMultiplier()).isEqualTo(doubleValue
);
195 public void maxBytesForLevelMultiplierAdditional() {
196 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
197 final int intValue1
= rand
.nextInt();
198 final int intValue2
= rand
.nextInt();
199 final int[] ints
= new int[]{intValue1
, intValue2
};
200 opt
.setMaxBytesForLevelMultiplierAdditional(ints
);
201 assertThat(opt
.maxBytesForLevelMultiplierAdditional()).isEqualTo(ints
);
206 public void maxCompactionBytes() {
207 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
208 final long longValue
= rand
.nextLong();
209 opt
.setMaxCompactionBytes(longValue
);
210 assertThat(opt
.maxCompactionBytes()).isEqualTo(longValue
);
215 public void softPendingCompactionBytesLimit() {
216 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
217 final long longValue
= rand
.nextLong();
218 opt
.setSoftPendingCompactionBytesLimit(longValue
);
219 assertThat(opt
.softPendingCompactionBytesLimit()).isEqualTo(longValue
);
224 public void hardPendingCompactionBytesLimit() {
225 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
226 final long longValue
= rand
.nextLong();
227 opt
.setHardPendingCompactionBytesLimit(longValue
);
228 assertThat(opt
.hardPendingCompactionBytesLimit()).isEqualTo(longValue
);
233 public void level0FileNumCompactionTrigger() {
234 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
235 final int intValue
= rand
.nextInt();
236 opt
.setLevel0FileNumCompactionTrigger(intValue
);
237 assertThat(opt
.level0FileNumCompactionTrigger()).isEqualTo(intValue
);
242 public void level0SlowdownWritesTrigger() {
243 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
244 final int intValue
= rand
.nextInt();
245 opt
.setLevel0SlowdownWritesTrigger(intValue
);
246 assertThat(opt
.level0SlowdownWritesTrigger()).isEqualTo(intValue
);
251 public void level0StopWritesTrigger() {
252 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
253 final int intValue
= rand
.nextInt();
254 opt
.setLevel0StopWritesTrigger(intValue
);
255 assertThat(opt
.level0StopWritesTrigger()).isEqualTo(intValue
);
260 public void arenaBlockSize() throws RocksDBException
{
261 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
262 final long longValue
= rand
.nextLong();
263 opt
.setArenaBlockSize(longValue
);
264 assertThat(opt
.arenaBlockSize()).isEqualTo(longValue
);
269 public void disableAutoCompactions() {
270 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
271 final boolean boolValue
= rand
.nextBoolean();
272 opt
.setDisableAutoCompactions(boolValue
);
273 assertThat(opt
.disableAutoCompactions()).isEqualTo(boolValue
);
278 public void maxSequentialSkipInIterations() {
279 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
280 final long longValue
= rand
.nextLong();
281 opt
.setMaxSequentialSkipInIterations(longValue
);
282 assertThat(opt
.maxSequentialSkipInIterations()).isEqualTo(longValue
);
287 public void inplaceUpdateSupport() {
288 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
289 final boolean boolValue
= rand
.nextBoolean();
290 opt
.setInplaceUpdateSupport(boolValue
);
291 assertThat(opt
.inplaceUpdateSupport()).isEqualTo(boolValue
);
296 public void inplaceUpdateNumLocks() throws RocksDBException
{
297 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
298 final long longValue
= rand
.nextLong();
299 opt
.setInplaceUpdateNumLocks(longValue
);
300 assertThat(opt
.inplaceUpdateNumLocks()).isEqualTo(longValue
);
305 public void memtablePrefixBloomSizeRatio() {
306 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
307 final double doubleValue
= rand
.nextDouble();
308 opt
.setMemtablePrefixBloomSizeRatio(doubleValue
);
309 assertThat(opt
.memtablePrefixBloomSizeRatio()).isEqualTo(doubleValue
);
314 public void memtableHugePageSize() {
315 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
316 final long longValue
= rand
.nextLong();
317 opt
.setMemtableHugePageSize(longValue
);
318 assertThat(opt
.memtableHugePageSize()).isEqualTo(longValue
);
323 public void bloomLocality() {
324 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
325 final int intValue
= rand
.nextInt();
326 opt
.setBloomLocality(intValue
);
327 assertThat(opt
.bloomLocality()).isEqualTo(intValue
);
332 public void maxSuccessiveMerges() throws RocksDBException
{
333 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
334 final long longValue
= rand
.nextLong();
335 opt
.setMaxSuccessiveMerges(longValue
);
336 assertThat(opt
.maxSuccessiveMerges()).isEqualTo(longValue
);
341 public void optimizeFiltersForHits() {
342 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
343 final boolean aBoolean
= rand
.nextBoolean();
344 opt
.setOptimizeFiltersForHits(aBoolean
);
345 assertThat(opt
.optimizeFiltersForHits()).isEqualTo(aBoolean
);
350 public void memTable() throws RocksDBException
{
351 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
352 opt
.setMemTableConfig(new HashLinkedListMemTableConfig());
353 assertThat(opt
.memTableFactoryName()).
354 isEqualTo("HashLinkedListRepFactory");
359 public void comparator() throws RocksDBException
{
360 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
361 opt
.setComparator(BuiltinComparator
.BYTEWISE_COMPARATOR
);
366 public void linkageOfPrepMethods() {
367 try (final ColumnFamilyOptions options
= new ColumnFamilyOptions()) {
368 options
.optimizeUniversalStyleCompaction();
369 options
.optimizeUniversalStyleCompaction(4000);
370 options
.optimizeLevelStyleCompaction();
371 options
.optimizeLevelStyleCompaction(3000);
372 options
.optimizeForPointLookup(10);
373 options
.optimizeForSmallDb();
378 public void shouldSetTestPrefixExtractor() {
379 try (final ColumnFamilyOptions options
= new ColumnFamilyOptions()) {
380 options
.useFixedLengthPrefixExtractor(100);
381 options
.useFixedLengthPrefixExtractor(10);
386 public void shouldSetTestCappedPrefixExtractor() {
387 try (final ColumnFamilyOptions options
= new ColumnFamilyOptions()) {
388 options
.useCappedPrefixExtractor(100);
389 options
.useCappedPrefixExtractor(10);
394 public void compressionTypes() {
395 try (final ColumnFamilyOptions columnFamilyOptions
396 = new ColumnFamilyOptions()) {
397 for (final CompressionType compressionType
:
398 CompressionType
.values()) {
399 columnFamilyOptions
.setCompressionType(compressionType
);
400 assertThat(columnFamilyOptions
.compressionType()).
401 isEqualTo(compressionType
);
402 assertThat(CompressionType
.valueOf("NO_COMPRESSION")).
403 isEqualTo(CompressionType
.NO_COMPRESSION
);
409 public void compressionPerLevel() {
410 try (final ColumnFamilyOptions columnFamilyOptions
411 = new ColumnFamilyOptions()) {
412 assertThat(columnFamilyOptions
.compressionPerLevel()).isEmpty();
413 List
<CompressionType
> compressionTypeList
= new ArrayList
<>();
414 for (int i
= 0; i
< columnFamilyOptions
.numLevels(); i
++) {
415 compressionTypeList
.add(CompressionType
.NO_COMPRESSION
);
417 columnFamilyOptions
.setCompressionPerLevel(compressionTypeList
);
418 compressionTypeList
= columnFamilyOptions
.compressionPerLevel();
419 for (CompressionType compressionType
: compressionTypeList
) {
420 assertThat(compressionType
).isEqualTo(
421 CompressionType
.NO_COMPRESSION
);
427 public void differentCompressionsPerLevel() {
428 try (final ColumnFamilyOptions columnFamilyOptions
429 = new ColumnFamilyOptions()) {
430 columnFamilyOptions
.setNumLevels(3);
432 assertThat(columnFamilyOptions
.compressionPerLevel()).isEmpty();
433 List
<CompressionType
> compressionTypeList
= new ArrayList
<>();
435 compressionTypeList
.add(CompressionType
.BZLIB2_COMPRESSION
);
436 compressionTypeList
.add(CompressionType
.SNAPPY_COMPRESSION
);
437 compressionTypeList
.add(CompressionType
.LZ4_COMPRESSION
);
439 columnFamilyOptions
.setCompressionPerLevel(compressionTypeList
);
440 compressionTypeList
= columnFamilyOptions
.compressionPerLevel();
442 assertThat(compressionTypeList
.size()).isEqualTo(3);
443 assertThat(compressionTypeList
).
445 CompressionType
.BZLIB2_COMPRESSION
,
446 CompressionType
.SNAPPY_COMPRESSION
,
447 CompressionType
.LZ4_COMPRESSION
);
453 public void bottommostCompressionType() {
454 try (final ColumnFamilyOptions columnFamilyOptions
455 = new ColumnFamilyOptions()) {
456 assertThat(columnFamilyOptions
.bottommostCompressionType())
457 .isEqualTo(CompressionType
.DISABLE_COMPRESSION_OPTION
);
459 for (final CompressionType compressionType
: CompressionType
.values()) {
460 columnFamilyOptions
.setBottommostCompressionType(compressionType
);
461 assertThat(columnFamilyOptions
.bottommostCompressionType())
462 .isEqualTo(compressionType
);
468 public void bottommostCompressionOptions() {
469 try (final ColumnFamilyOptions columnFamilyOptions
=
470 new ColumnFamilyOptions();
471 final CompressionOptions bottommostCompressionOptions
=
472 new CompressionOptions()
473 .setMaxDictBytes(123)) {
475 columnFamilyOptions
.setBottommostCompressionOptions(
476 bottommostCompressionOptions
);
477 assertThat(columnFamilyOptions
.bottommostCompressionOptions())
478 .isEqualTo(bottommostCompressionOptions
);
479 assertThat(columnFamilyOptions
.bottommostCompressionOptions()
480 .maxDictBytes()).isEqualTo(123);
485 public void compressionOptions() {
486 try (final ColumnFamilyOptions columnFamilyOptions
487 = new ColumnFamilyOptions();
488 final CompressionOptions compressionOptions
= new CompressionOptions()
489 .setMaxDictBytes(123)) {
491 columnFamilyOptions
.setCompressionOptions(compressionOptions
);
492 assertThat(columnFamilyOptions
.compressionOptions())
493 .isEqualTo(compressionOptions
);
494 assertThat(columnFamilyOptions
.compressionOptions().maxDictBytes())
500 public void compactionStyles() {
501 try (final ColumnFamilyOptions columnFamilyOptions
502 = new ColumnFamilyOptions()) {
503 for (final CompactionStyle compactionStyle
:
504 CompactionStyle
.values()) {
505 columnFamilyOptions
.setCompactionStyle(compactionStyle
);
506 assertThat(columnFamilyOptions
.compactionStyle()).
507 isEqualTo(compactionStyle
);
508 assertThat(CompactionStyle
.valueOf("FIFO")).
509 isEqualTo(CompactionStyle
.FIFO
);
515 public void maxTableFilesSizeFIFO() {
516 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
517 long longValue
= rand
.nextLong();
518 // Size has to be positive
519 longValue
= (longValue
< 0) ?
-longValue
: longValue
;
520 longValue
= (longValue
== 0) ? longValue
+ 1 : longValue
;
521 opt
.setMaxTableFilesSizeFIFO(longValue
);
522 assertThat(opt
.maxTableFilesSizeFIFO()).
523 isEqualTo(longValue
);
528 public void maxWriteBufferNumberToMaintain() {
529 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
530 int intValue
= rand
.nextInt();
531 // Size has to be positive
532 intValue
= (intValue
< 0) ?
-intValue
: intValue
;
533 intValue
= (intValue
== 0) ? intValue
+ 1 : intValue
;
534 opt
.setMaxWriteBufferNumberToMaintain(intValue
);
535 assertThat(opt
.maxWriteBufferNumberToMaintain()).
541 public void compactionPriorities() {
542 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
543 for (final CompactionPriority compactionPriority
:
544 CompactionPriority
.values()) {
545 opt
.setCompactionPriority(compactionPriority
);
546 assertThat(opt
.compactionPriority()).
547 isEqualTo(compactionPriority
);
553 public void reportBgIoStats() {
554 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
555 final boolean booleanValue
= true;
556 opt
.setReportBgIoStats(booleanValue
);
557 assertThat(opt
.reportBgIoStats()).
558 isEqualTo(booleanValue
);
564 try (final ColumnFamilyOptions options
= new ColumnFamilyOptions()) {
565 options
.setTtl(1000 * 60);
566 assertThat(options
.ttl()).
567 isEqualTo(1000 * 60);
572 public void compactionOptionsUniversal() {
573 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions();
574 final CompactionOptionsUniversal optUni
= new CompactionOptionsUniversal()
575 .setCompressionSizePercent(7)) {
576 opt
.setCompactionOptionsUniversal(optUni
);
577 assertThat(opt
.compactionOptionsUniversal()).
579 assertThat(opt
.compactionOptionsUniversal().compressionSizePercent())
585 public void compactionOptionsFIFO() {
586 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions();
587 final CompactionOptionsFIFO optFifo
= new CompactionOptionsFIFO()
588 .setMaxTableFilesSize(2000)) {
589 opt
.setCompactionOptionsFIFO(optFifo
);
590 assertThat(opt
.compactionOptionsFIFO()).
592 assertThat(opt
.compactionOptionsFIFO().maxTableFilesSize())
598 public void forceConsistencyChecks() {
599 try (final ColumnFamilyOptions opt
= new ColumnFamilyOptions()) {
600 final boolean booleanValue
= true;
601 opt
.setForceConsistencyChecks(booleanValue
);
602 assertThat(opt
.forceConsistencyChecks()).
603 isEqualTo(booleanValue
);
608 public void compactionFilter() {
609 try(final ColumnFamilyOptions options
= new ColumnFamilyOptions();
610 final RemoveEmptyValueCompactionFilter cf
= new RemoveEmptyValueCompactionFilter()) {
611 options
.setCompactionFilter(cf
);
612 assertThat(options
.compactionFilter()).isEqualTo(cf
);
617 public void compactionFilterFactory() {
618 try(final ColumnFamilyOptions options
= new ColumnFamilyOptions();
619 final RemoveEmptyValueCompactionFilterFactory cff
= new RemoveEmptyValueCompactionFilterFactory()) {
620 options
.setCompactionFilterFactory(cff
);
621 assertThat(options
.compactionFilterFactory()).isEqualTo(cff
);