Skip to content

Commit

Permalink
jni: expose memtable_whole_key_filtering option (#9394)
Browse files Browse the repository at this point in the history
Summary:
refer to: https://github.com/facebook/rocksdb/wiki/Prefix-Seek#configure-prefix-bloom-filter

Pull Request resolved: facebook/rocksdb#9394

Reviewed By: mrambacher

Differential Revision: D33671533

Pulled By: ajkr

fbshipit-source-id: d90db1712efdd5dd65020329867381d6b3cf2626
  • Loading branch information
javeme authored and facebook-github-bot committed Feb 5, 2022
1 parent afc280f commit 83ff350
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 14 deletions.
6 changes: 3 additions & 3 deletions include/rocksdb/advanced_options.h
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ struct AdvancedColumnFamilyOptions {
//
// If this value is larger than 0.25, it is sanitized to 0.25.
//
// Default: 0 (disable)
// Default: 0 (disabled)
//
// Dynamically changeable through SetOptions() API
double memtable_prefix_bloom_size_ratio = 0.0;
Expand All @@ -386,7 +386,7 @@ struct AdvancedColumnFamilyOptions {
// if memtable_prefix_bloom_size_ratio is not 0. Enabling whole key filtering
// can potentially reduce CPU usage for point-look-ups.
//
// Default: false (disable)
// Default: false (disabled)
//
// Dynamically changeable through SetOptions() API
bool memtable_whole_key_filtering = false;
Expand Down Expand Up @@ -421,7 +421,7 @@ struct AdvancedColumnFamilyOptions {
// example would be updating the same key over and over again, in which case
// the prefix can be the key itself.
//
// Default: nullptr (disable)
// Default: nullptr (disabled)
std::shared_ptr<const SliceTransform>
memtable_insert_with_hint_prefix_extractor = nullptr;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,7 @@ private void prepareOptions(Options options) throws RocksDBException {
options.setMinWriteBufferNumberToMerge(
(Integer)flags_.get(Flag.min_write_buffer_number_to_merge));
options.setMemtablePrefixBloomSizeRatio((Double) flags_.get(Flag.memtable_bloom_size_ratio));
options.setMemtableWholeKeyFiltering((Boolean) flags_.get(Flag.memtable_whole_key_filtering));
options.setNumLevels(
(Integer)flags_.get(Flag.num_levels));
options.setTargetFileSizeBase(
Expand Down Expand Up @@ -1190,6 +1191,12 @@ public Object parseValue(String value) {
return Double.parseDouble(value);
}
},
memtable_whole_key_filtering(false, "Enable whole key bloom filter in memtable.") {
@Override
public Object parseValue(String value) {
return parseBoolean(value);
}
},
cache_numshardbits(-1,"Number of shards for the block cache\n" +
"\tis 2 ** cache_numshardbits. Negative means use default settings.\n" +
"\tThis is applied only if FLAGS_cache_size is non-negative.") {
Expand Down
46 changes: 46 additions & 0 deletions java/rocksjni/options.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3124,6 +3124,29 @@ void Java_org_rocksdb_Options_setMemtablePrefixBloomSizeRatio(
static_cast<double>(jmemtable_prefix_bloom_size_ratio);
}

/*
* Class: org_rocksdb_Options
* Method: memtableWholeKeyFiltering
* Signature: (J)Z
*/
jboolean Java_org_rocksdb_Options_memtableWholeKeyFiltering(JNIEnv*, jobject,
jlong jhandle) {
return reinterpret_cast<ROCKSDB_NAMESPACE::Options*>(jhandle)
->memtable_whole_key_filtering;
}

/*
* Class: org_rocksdb_Options
* Method: setMemtableWholeKeyFiltering
* Signature: (JZ)V
*/
void Java_org_rocksdb_Options_setMemtableWholeKeyFiltering(
JNIEnv*, jobject, jlong jhandle, jboolean jmemtable_whole_key_filtering) {
reinterpret_cast<ROCKSDB_NAMESPACE::Options*>(jhandle)
->memtable_whole_key_filtering =
static_cast<bool>(jmemtable_whole_key_filtering);
}

/*
* Class: org_rocksdb_Options
* Method: bloomLocality
Expand Down Expand Up @@ -4909,6 +4932,29 @@ void Java_org_rocksdb_ColumnFamilyOptions_setMemtablePrefixBloomSizeRatio(
static_cast<double>(jmemtable_prefix_bloom_size_ratio);
}

/*
* Class: org_rocksdb_ColumnFamilyOptions
* Method: memtableWholeKeyFiltering
* Signature: (J)Z
*/
jboolean Java_org_rocksdb_ColumnFamilyOptions_memtableWholeKeyFiltering(
JNIEnv*, jobject, jlong jhandle) {
return reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyOptions*>(jhandle)
->memtable_whole_key_filtering;
}

/*
* Class: org_rocksdb_ColumnFamilyOptions
* Method: setMemtableWholeKeyFiltering
* Signature: (JZ)V
*/
void Java_org_rocksdb_ColumnFamilyOptions_setMemtableWholeKeyFiltering(
JNIEnv*, jobject, jlong jhandle, jboolean jmemtable_whole_key_filtering) {
reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyOptions*>(jhandle)
->memtable_whole_key_filtering =
static_cast<bool>(jmemtable_whole_key_filtering);
}

/*
* Class: org_rocksdb_ColumnFamilyOptions
* Method: bloomLocality
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,10 @@ T setInplaceUpdateNumLocks(
* write_buffer_size * memtable_prefix_bloom_size_ratio.
* If it is larger than 0.25, it is santinized to 0.25.
*
* Default: 0 (disable)
* Default: 0 (disabled)
*
* @param memtablePrefixBloomSizeRatio The ratio
* @param memtablePrefixBloomSizeRatio the ratio of memtable used by the
* bloom filter, 0 means no bloom filter
* @return the reference to the current options.
*/
T setMemtablePrefixBloomSizeRatio(
Expand All @@ -74,12 +75,32 @@ T setMemtablePrefixBloomSizeRatio(
* write_buffer_size * memtable_prefix_bloom_size_ratio.
* If it is larger than 0.25, it is santinized to 0.25.
*
* Default: 0 (disable)
* Default: 0 (disabled)
*
* @return the ratio
* @return the ratio of memtable used by the bloom filter
*/
double memtablePrefixBloomSizeRatio();

/**
* Enable whole key bloom filter in memtable. Note this will only take effect
* if memtable_prefix_bloom_size_ratio is not 0. Enabling whole key filtering
* can potentially reduce CPU usage for point-look-ups.
*
* Default: false (disabled)
*
* @param memtableWholeKeyFiltering true if whole key bloom filter is enabled
* in memtable
* @return the reference to the current options.
*/
T setMemtableWholeKeyFiltering(boolean memtableWholeKeyFiltering);

/**
* Returns whether whole key bloom filter is enabled in memtable
*
* @return true if whole key bloom filter is enabled in memtable
*/
boolean memtableWholeKeyFiltering();

/**
* Page size for huge page TLB for bloom in memtable. If &le; 0, not allocate
* from huge page TLB but from malloc.
Expand Down Expand Up @@ -546,7 +567,7 @@ T setReportBgIoStats(
* Dynamically changeable through
* {@link RocksDB#setOptions(ColumnFamilyHandle, MutableColumnFamilyOptions)}.
*
* @return true iff blob files are enabled
* @return true if blob files are enabled
*/
boolean enableBlobFiles();

Expand Down Expand Up @@ -656,7 +677,7 @@ T setReportBgIoStats(
*
* Default: false
*
* @return true iff blob garbage collection is currently enabled.
* @return true if blob garbage collection is currently enabled.
*/
boolean enableBlobGarbageCollection();

Expand Down
13 changes: 13 additions & 0 deletions java/src/main/java/org/rocksdb/ColumnFamilyOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,17 @@ public double memtablePrefixBloomSizeRatio() {
return memtablePrefixBloomSizeRatio(nativeHandle_);
}

@Override
public ColumnFamilyOptions setMemtableWholeKeyFiltering(final boolean memtableWholeKeyFiltering) {
setMemtableWholeKeyFiltering(nativeHandle_, memtableWholeKeyFiltering);
return this;
}

@Override
public boolean memtableWholeKeyFiltering() {
return memtableWholeKeyFiltering(nativeHandle_);
}

@Override
public ColumnFamilyOptions setBloomLocality(int bloomLocality) {
setBloomLocality(nativeHandle_, bloomLocality);
Expand Down Expand Up @@ -1319,6 +1330,8 @@ private native void setInplaceUpdateNumLocks(
private native void setMemtablePrefixBloomSizeRatio(
long handle, double memtablePrefixBloomSizeRatio);
private native double memtablePrefixBloomSizeRatio(long handle);
private native void setMemtableWholeKeyFiltering(long handle, boolean memtableWholeKeyFiltering);
private native boolean memtableWholeKeyFiltering(long handle);
private native void setBloomLocality(
long handle, int bloomLocality);
private native int bloomLocality(long handle);
Expand Down
12 changes: 12 additions & 0 deletions java/src/main/java/org/rocksdb/MutableColumnFamilyOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public enum MemtableOption implements MutableColumnFamilyOptionKey {
write_buffer_size(ValueType.LONG),
arena_block_size(ValueType.LONG),
memtable_prefix_bloom_size_ratio(ValueType.DOUBLE),
memtable_whole_key_filtering(ValueType.BOOLEAN),
@Deprecated memtable_prefix_bloom_bits(ValueType.INT),
@Deprecated memtable_prefix_bloom_probes(ValueType.INT),
memtable_huge_page_size(ValueType.LONG),
Expand Down Expand Up @@ -226,6 +227,17 @@ public double memtablePrefixBloomSizeRatio() {
return getDouble(MemtableOption.memtable_prefix_bloom_size_ratio);
}

@Override
public MutableColumnFamilyOptionsBuilder setMemtableWholeKeyFiltering(
final boolean memtableWholeKeyFiltering) {
return setBoolean(MemtableOption.memtable_whole_key_filtering, memtableWholeKeyFiltering);
}

@Override
public boolean memtableWholeKeyFiltering() {
return getBoolean(MemtableOption.memtable_whole_key_filtering);
}

@Override
public MutableColumnFamilyOptionsBuilder setMemtableHugePageSize(
final long memtableHugePageSize) {
Expand Down
13 changes: 13 additions & 0 deletions java/src/main/java/org/rocksdb/Options.java
Original file line number Diff line number Diff line change
Expand Up @@ -1638,6 +1638,17 @@ public Options setMemtablePrefixBloomSizeRatio(final double memtablePrefixBloomS
return this;
}

@Override
public boolean memtableWholeKeyFiltering() {
return memtableWholeKeyFiltering(nativeHandle_);
}

@Override
public Options setMemtableWholeKeyFiltering(final boolean memtableWholeKeyFiltering) {
setMemtableWholeKeyFiltering(nativeHandle_, memtableWholeKeyFiltering);
return this;
}

@Override
public int bloomLocality() {
return bloomLocality(nativeHandle_);
Expand Down Expand Up @@ -2405,6 +2416,8 @@ private native void setInplaceUpdateNumLocks(
private native void setMemtablePrefixBloomSizeRatio(
long handle, double memtablePrefixBloomSizeRatio);
private native double memtablePrefixBloomSizeRatio(long handle);
private native void setMemtableWholeKeyFiltering(long handle, boolean memtableWholeKeyFiltering);
private native boolean memtableWholeKeyFiltering(long handle);
private native void setBloomLocality(
long handle, int bloomLocality);
private native int bloomLocality(long handle);
Expand Down
9 changes: 9 additions & 0 deletions java/src/test/java/org/rocksdb/ColumnFamilyOptionsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,15 @@ public void memtablePrefixBloomSizeRatio() {
}
}

@Test
public void memtableWholeKeyFiltering() {
try (final ColumnFamilyOptions opt = new ColumnFamilyOptions()) {
final boolean booleanValue = rand.nextBoolean();
opt.setMemtableWholeKeyFiltering(booleanValue);
assertThat(opt.memtableWholeKeyFiltering()).isEqualTo(booleanValue);
}
}

@Test
public void memtableHugePageSize() {
try (final ColumnFamilyOptions opt = new ColumnFamilyOptions()) {
Expand Down
20 changes: 15 additions & 5 deletions java/src/test/java/org/rocksdb/MutableOptionsGetSetTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public void testGetMutableBlobOptionsAfterCreate() throws RocksDBException {
.setBlobGarbageCollectionForceThreshold(0.80)
.setArenaBlockSize(42)
.setMemtablePrefixBloomSizeRatio(0.17)
.setMemtableWholeKeyFiltering(false)
.setMemtableHugePageSize(3)
.setMaxSuccessiveMerges(4)
.setMaxWriteBufferNumber(12)
Expand All @@ -70,6 +71,7 @@ public void testGetMutableBlobOptionsAfterCreate() throws RocksDBException {
.setEnableBlobFiles(false)
.setArenaBlockSize(42)
.setMemtablePrefixBloomSizeRatio(0.236)
.setMemtableWholeKeyFiltering(true)
.setMemtableHugePageSize(8)
.setMaxSuccessiveMerges(12)
.setMaxWriteBufferNumber(22)
Expand Down Expand Up @@ -104,8 +106,9 @@ public void testGetMutableBlobOptionsAfterCreate() throws RocksDBException {
assertThat(builder1.blobGarbageCollectionForceThreshold()).isEqualTo(0.80);
assertThat(builder1.minBlobSize()).isEqualTo(minBlobSize);
assertThat(builder1.arenaBlockSize()).isEqualTo(42);
assertThat(builder1.memtableHugePageSize()).isEqualTo(3);
assertThat(builder1.memtablePrefixBloomSizeRatio()).isEqualTo(0.17);
assertThat(builder1.memtableWholeKeyFiltering()).isEqualTo(false);
assertThat(builder1.memtableHugePageSize()).isEqualTo(3);
assertThat(builder1.maxSuccessiveMerges()).isEqualTo(4);
assertThat(builder1.maxWriteBufferNumber()).isEqualTo(12);
assertThat(builder1.inplaceUpdateNumLocks()).isEqualTo(16);
Expand All @@ -127,8 +130,9 @@ public void testGetMutableBlobOptionsAfterCreate() throws RocksDBException {
assertThat(builder2.enableBlobFiles()).isEqualTo(false);
assertThat(builder2.minBlobSize()).isEqualTo(minBlobSize);
assertThat(builder2.arenaBlockSize()).isEqualTo(42);
assertThat(builder2.memtableHugePageSize()).isEqualTo(8);
assertThat(builder2.memtablePrefixBloomSizeRatio()).isEqualTo(0.236);
assertThat(builder2.memtableWholeKeyFiltering()).isEqualTo(true);
assertThat(builder2.memtableHugePageSize()).isEqualTo(8);
assertThat(builder2.maxSuccessiveMerges()).isEqualTo(12);
assertThat(builder2.maxWriteBufferNumber()).isEqualTo(22);
assertThat(builder2.inplaceUpdateNumLocks()).isEqualTo(160);
Expand Down Expand Up @@ -192,6 +196,7 @@ public void testGetMutableBlobOptionsAfterSetCF() throws RocksDBException {
.setBlobGarbageCollectionForceThreshold(0.80)
.setArenaBlockSize(42)
.setMemtablePrefixBloomSizeRatio(0.17)
.setMemtableWholeKeyFiltering(false)
.setMemtableHugePageSize(3)
.setMaxSuccessiveMerges(4)
.setMaxWriteBufferNumber(12)
Expand All @@ -215,8 +220,9 @@ public void testGetMutableBlobOptionsAfterSetCF() throws RocksDBException {
assertThat(builder1.blobGarbageCollectionForceThreshold()).isEqualTo(0.80);
assertThat(builder1.minBlobSize()).isEqualTo(minBlobSize);
assertThat(builder1.arenaBlockSize()).isEqualTo(42);
assertThat(builder1.memtableHugePageSize()).isEqualTo(3);
assertThat(builder1.memtablePrefixBloomSizeRatio()).isEqualTo(0.17);
assertThat(builder1.memtableWholeKeyFiltering()).isEqualTo(false);
assertThat(builder1.memtableHugePageSize()).isEqualTo(3);
assertThat(builder1.maxSuccessiveMerges()).isEqualTo(4);
assertThat(builder1.maxWriteBufferNumber()).isEqualTo(12);
assertThat(builder1.inplaceUpdateNumLocks()).isEqualTo(16);
Expand All @@ -237,6 +243,7 @@ public void testGetMutableBlobOptionsAfterSetCF() throws RocksDBException {
.setEnableBlobFiles(false)
.setArenaBlockSize(42)
.setMemtablePrefixBloomSizeRatio(0.236)
.setMemtableWholeKeyFiltering(true)
.setMemtableHugePageSize(8)
.setMaxSuccessiveMerges(12)
.setMaxWriteBufferNumber(22)
Expand All @@ -258,8 +265,9 @@ public void testGetMutableBlobOptionsAfterSetCF() throws RocksDBException {
assertThat(builder2.enableBlobFiles()).isEqualTo(false);
assertThat(builder2.minBlobSize()).isEqualTo(minBlobSize);
assertThat(builder2.arenaBlockSize()).isEqualTo(42);
assertThat(builder2.memtableHugePageSize()).isEqualTo(8);
assertThat(builder2.memtablePrefixBloomSizeRatio()).isEqualTo(0.236);
assertThat(builder2.memtableWholeKeyFiltering()).isEqualTo(true);
assertThat(builder2.memtableHugePageSize()).isEqualTo(8);
assertThat(builder2.maxSuccessiveMerges()).isEqualTo(12);
assertThat(builder2.maxWriteBufferNumber()).isEqualTo(22);
assertThat(builder2.inplaceUpdateNumLocks()).isEqualTo(160);
Expand Down Expand Up @@ -306,6 +314,7 @@ public void testGetMutableBlobOptionsAfterSet() throws RocksDBException {
.setBlobGarbageCollectionForceThreshold(0.80)
.setArenaBlockSize(42)
.setMemtablePrefixBloomSizeRatio(0.17)
.setMemtableWholeKeyFiltering(false)
.setMemtableHugePageSize(3)
.setMaxSuccessiveMerges(4)
.setMaxWriteBufferNumber(12)
Expand All @@ -328,8 +337,9 @@ public void testGetMutableBlobOptionsAfterSet() throws RocksDBException {
assertThat(builder1.blobGarbageCollectionForceThreshold()).isEqualTo(0.80);
assertThat(builder1.minBlobSize()).isEqualTo(minBlobSize);
assertThat(builder1.arenaBlockSize()).isEqualTo(42);
assertThat(builder1.memtableHugePageSize()).isEqualTo(3);
assertThat(builder1.memtablePrefixBloomSizeRatio()).isEqualTo(0.17);
assertThat(builder1.memtableWholeKeyFiltering()).isEqualTo(false);
assertThat(builder1.memtableHugePageSize()).isEqualTo(3);
assertThat(builder1.maxSuccessiveMerges()).isEqualTo(4);
assertThat(builder1.maxWriteBufferNumber()).isEqualTo(12);
assertThat(builder1.inplaceUpdateNumLocks()).isEqualTo(16);
Expand Down
9 changes: 9 additions & 0 deletions java/src/test/java/org/rocksdb/OptionsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,15 @@ public void memtablePrefixBloomSizeRatio() {
}
}

@Test
public void memtableWholeKeyFiltering() {
try (final Options opt = new Options()) {
final boolean booleanValue = rand.nextBoolean();
opt.setMemtableWholeKeyFiltering(booleanValue);
assertThat(opt.memtableWholeKeyFiltering()).isEqualTo(booleanValue);
}
}

@Test
public void memtableHugePageSize() {
try (final Options opt = new Options()) {
Expand Down

0 comments on commit 83ff350

Please sign in to comment.