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
;
9 import org
.junit
.Ignore
;
10 import org
.junit
.Rule
;
11 import org
.junit
.Test
;
12 import org
.junit
.rules
.TemporaryFolder
;
14 import java
.nio
.charset
.StandardCharsets
;
16 import static org
.assertj
.core
.api
.Assertions
.assertThat
;
18 public class BlockBasedTableConfigTest
{
21 public static final RocksMemoryResource rocksMemoryResource
=
22 new RocksMemoryResource();
24 @Rule public TemporaryFolder dbFolder
= new TemporaryFolder();
27 public void cacheIndexAndFilterBlocks() {
28 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
29 blockBasedTableConfig
.setCacheIndexAndFilterBlocks(true);
30 assertThat(blockBasedTableConfig
.cacheIndexAndFilterBlocks()).
36 public void cacheIndexAndFilterBlocksWithHighPriority() {
37 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
38 blockBasedTableConfig
.setCacheIndexAndFilterBlocksWithHighPriority(true);
39 assertThat(blockBasedTableConfig
.cacheIndexAndFilterBlocksWithHighPriority()).
44 public void pinL0FilterAndIndexBlocksInCache() {
45 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
46 blockBasedTableConfig
.setPinL0FilterAndIndexBlocksInCache(true);
47 assertThat(blockBasedTableConfig
.pinL0FilterAndIndexBlocksInCache()).
52 public void pinTopLevelIndexAndFilter() {
53 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
54 blockBasedTableConfig
.setPinTopLevelIndexAndFilter(false);
55 assertThat(blockBasedTableConfig
.pinTopLevelIndexAndFilter()).
60 public void indexType() {
61 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
62 assertThat(IndexType
.values().length
).isEqualTo(3);
63 blockBasedTableConfig
.setIndexType(IndexType
.kHashSearch
);
64 assertThat(blockBasedTableConfig
.indexType().equals(
65 IndexType
.kHashSearch
));
66 assertThat(IndexType
.valueOf("kBinarySearch")).isNotNull();
67 blockBasedTableConfig
.setIndexType(IndexType
.valueOf("kBinarySearch"));
68 assertThat(blockBasedTableConfig
.indexType().equals(
69 IndexType
.kBinarySearch
));
73 public void dataBlockIndexType() {
74 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
75 blockBasedTableConfig
.setDataBlockIndexType(DataBlockIndexType
.kDataBlockBinaryAndHash
);
76 assertThat(blockBasedTableConfig
.dataBlockIndexType().equals(
77 DataBlockIndexType
.kDataBlockBinaryAndHash
));
78 blockBasedTableConfig
.setDataBlockIndexType(DataBlockIndexType
.kDataBlockBinarySearch
);
79 assertThat(blockBasedTableConfig
.dataBlockIndexType().equals(
80 DataBlockIndexType
.kDataBlockBinarySearch
));
84 public void checksumType() {
85 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
86 assertThat(ChecksumType
.values().length
).isEqualTo(3);
87 assertThat(ChecksumType
.valueOf("kxxHash")).
88 isEqualTo(ChecksumType
.kxxHash
);
89 blockBasedTableConfig
.setChecksumType(ChecksumType
.kNoChecksum
);
90 blockBasedTableConfig
.setChecksumType(ChecksumType
.kxxHash
);
91 assertThat(blockBasedTableConfig
.checksumType().equals(
92 ChecksumType
.kxxHash
));
96 public void noBlockCache() {
97 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
98 blockBasedTableConfig
.setNoBlockCache(true);
99 assertThat(blockBasedTableConfig
.noBlockCache()).isTrue();
103 public void blockCache() {
105 final Cache cache
= new LRUCache(17 * 1024 * 1024);
106 final Options options
= new Options().setTableFormatConfig(
107 new BlockBasedTableConfig().setBlockCache(cache
))) {
108 assertThat(options
.tableFactoryName()).isEqualTo("BlockBasedTable");
113 public void blockCacheIntegration() throws RocksDBException
{
114 try (final Cache cache
= new LRUCache(8 * 1024 * 1024);
115 final Statistics statistics
= new Statistics()) {
116 for (int shard
= 0; shard
< 8; shard
++) {
117 try (final Options options
=
119 .setCreateIfMissing(true)
120 .setStatistics(statistics
)
121 .setTableFormatConfig(new BlockBasedTableConfig().setBlockCache(cache
));
123 RocksDB
.open(options
, dbFolder
.getRoot().getAbsolutePath() + "/" + shard
)) {
124 final byte[] key
= "some-key".getBytes(StandardCharsets
.UTF_8
);
125 final byte[] value
= "some-value".getBytes(StandardCharsets
.UTF_8
);
128 db
.flush(new FlushOptions());
131 assertThat(statistics
.getTickerCount(TickerType
.BLOCK_CACHE_ADD
)).isEqualTo(shard
+ 1);
138 public void persistentCache() throws RocksDBException
{
139 try (final DBOptions dbOptions
= new DBOptions().
140 setInfoLogLevel(InfoLogLevel
.INFO_LEVEL
).
141 setCreateIfMissing(true);
142 final Logger logger
= new Logger(dbOptions
) {
144 protected void log(final InfoLogLevel infoLogLevel
, final String logMsg
) {
145 System
.out
.println(infoLogLevel
.name() + ": " + logMsg
);
148 try (final PersistentCache persistentCache
=
149 new PersistentCache(Env
.getDefault(), dbFolder
.getRoot().getPath(), 1024 * 1024 * 100, logger
, false);
150 final Options options
= new Options().setTableFormatConfig(
151 new BlockBasedTableConfig().setPersistentCache(persistentCache
))) {
152 assertThat(options
.tableFactoryName()).isEqualTo("BlockBasedTable");
158 public void blockCacheCompressed() {
159 try (final Cache cache
= new LRUCache(17 * 1024 * 1024);
160 final Options options
= new Options().setTableFormatConfig(
161 new BlockBasedTableConfig().setBlockCacheCompressed(cache
))) {
162 assertThat(options
.tableFactoryName()).isEqualTo("BlockBasedTable");
166 @Ignore("See issue: https://github.com/facebook/rocksdb/issues/4822")
168 public void blockCacheCompressedIntegration() throws RocksDBException
{
169 final byte[] key1
= "some-key1".getBytes(StandardCharsets
.UTF_8
);
170 final byte[] key2
= "some-key1".getBytes(StandardCharsets
.UTF_8
);
171 final byte[] key3
= "some-key1".getBytes(StandardCharsets
.UTF_8
);
172 final byte[] key4
= "some-key1".getBytes(StandardCharsets
.UTF_8
);
173 final byte[] value
= "some-value".getBytes(StandardCharsets
.UTF_8
);
175 try (final Cache compressedCache
= new LRUCache(8 * 1024 * 1024);
176 final Statistics statistics
= new Statistics()) {
178 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig()
179 .setNoBlockCache(true)
181 .setBlockCacheCompressed(compressedCache
)
182 .setFormatVersion(4);
184 try (final Options options
= new Options()
185 .setCreateIfMissing(true)
186 .setStatistics(statistics
)
187 .setTableFormatConfig(blockBasedTableConfig
)) {
189 for (int shard
= 0; shard
< 8; shard
++) {
190 try (final FlushOptions flushOptions
= new FlushOptions();
191 final WriteOptions writeOptions
= new WriteOptions();
192 final ReadOptions readOptions
= new ReadOptions();
194 RocksDB
.open(options
, dbFolder
.getRoot().getAbsolutePath() + "/" + shard
)) {
196 db
.put(writeOptions
, key1
, value
);
197 db
.put(writeOptions
, key2
, value
);
198 db
.put(writeOptions
, key3
, value
);
199 db
.put(writeOptions
, key4
, value
);
200 db
.flush(flushOptions
);
202 db
.get(readOptions
, key1
);
203 db
.get(readOptions
, key2
);
204 db
.get(readOptions
, key3
);
205 db
.get(readOptions
, key4
);
207 assertThat(statistics
.getTickerCount(TickerType
.BLOCK_CACHE_COMPRESSED_ADD
)).isEqualTo(shard
+ 1);
215 public void blockSize() {
216 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
217 blockBasedTableConfig
.setBlockSize(10);
218 assertThat(blockBasedTableConfig
.blockSize()).isEqualTo(10);
222 public void blockSizeDeviation() {
223 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
224 blockBasedTableConfig
.setBlockSizeDeviation(12);
225 assertThat(blockBasedTableConfig
.blockSizeDeviation()).
230 public void blockRestartInterval() {
231 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
232 blockBasedTableConfig
.setBlockRestartInterval(15);
233 assertThat(blockBasedTableConfig
.blockRestartInterval()).
238 public void indexBlockRestartInterval() {
239 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
240 blockBasedTableConfig
.setIndexBlockRestartInterval(15);
241 assertThat(blockBasedTableConfig
.indexBlockRestartInterval()).
246 public void metadataBlockSize() {
247 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
248 blockBasedTableConfig
.setMetadataBlockSize(1024);
249 assertThat(blockBasedTableConfig
.metadataBlockSize()).
254 public void partitionFilters() {
255 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
256 blockBasedTableConfig
.setPartitionFilters(true);
257 assertThat(blockBasedTableConfig
.partitionFilters()).
262 public void useDeltaEncoding() {
263 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
264 blockBasedTableConfig
.setUseDeltaEncoding(false);
265 assertThat(blockBasedTableConfig
.useDeltaEncoding()).
270 public void blockBasedTableWithFilterPolicy() {
271 try(final Options options
= new Options()
272 .setTableFormatConfig(new BlockBasedTableConfig()
273 .setFilterPolicy(new BloomFilter(10)))) {
274 assertThat(options
.tableFactoryName()).
275 isEqualTo("BlockBasedTable");
280 public void blockBasedTableWithoutFilterPolicy() {
281 try(final Options options
= new Options().setTableFormatConfig(
282 new BlockBasedTableConfig().setFilterPolicy(null))) {
283 assertThat(options
.tableFactoryName()).
284 isEqualTo("BlockBasedTable");
289 public void wholeKeyFiltering() {
290 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
291 blockBasedTableConfig
.setWholeKeyFiltering(false);
292 assertThat(blockBasedTableConfig
.wholeKeyFiltering()).
297 public void verifyCompression() {
298 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
299 blockBasedTableConfig
.setVerifyCompression(true);
300 assertThat(blockBasedTableConfig
.verifyCompression()).
305 public void readAmpBytesPerBit() {
306 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
307 blockBasedTableConfig
.setReadAmpBytesPerBit(2);
308 assertThat(blockBasedTableConfig
.readAmpBytesPerBit()).
313 public void formatVersion() {
314 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
315 for (int version
= 0; version
< 5; version
++) {
316 blockBasedTableConfig
.setFormatVersion(version
);
317 assertThat(blockBasedTableConfig
.formatVersion()).isEqualTo(version
);
321 @Test(expected
= AssertionError
.class)
322 public void formatVersionFailNegative() {
323 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
324 blockBasedTableConfig
.setFormatVersion(-1);
327 @Test(expected
= AssertionError
.class)
328 public void formatVersionFailIllegalVersion() {
329 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
330 blockBasedTableConfig
.setFormatVersion(99);
334 public void enableIndexCompression() {
335 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
336 blockBasedTableConfig
.setEnableIndexCompression(false);
337 assertThat(blockBasedTableConfig
.enableIndexCompression()).
342 public void blockAlign() {
343 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
344 blockBasedTableConfig
.setBlockAlign(true);
345 assertThat(blockBasedTableConfig
.blockAlign()).
351 public void hashIndexAllowCollision() {
352 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
353 blockBasedTableConfig
.setHashIndexAllowCollision(false);
354 assertThat(blockBasedTableConfig
.hashIndexAllowCollision()).
355 isTrue(); // NOTE: setHashIndexAllowCollision should do nothing!
360 public void blockCacheSize() {
361 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
362 blockBasedTableConfig
.setBlockCacheSize(8 * 1024);
363 assertThat(blockBasedTableConfig
.blockCacheSize()).
369 public void blockCacheNumShardBits() {
370 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
371 blockBasedTableConfig
.setCacheNumShardBits(5);
372 assertThat(blockBasedTableConfig
.cacheNumShardBits()).
378 public void blockCacheCompressedSize() {
379 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
380 blockBasedTableConfig
.setBlockCacheCompressedSize(40);
381 assertThat(blockBasedTableConfig
.blockCacheCompressedSize()).
387 public void blockCacheCompressedNumShardBits() {
388 final BlockBasedTableConfig blockBasedTableConfig
= new BlockBasedTableConfig();
389 blockBasedTableConfig
.setBlockCacheCompressedNumShardBits(4);
390 assertThat(blockBasedTableConfig
.blockCacheCompressedNumShardBits()).