diff --git a/java/RocksDBSample.java b/java/RocksDBSample.java index 940b4bd40..57e9aa6e7 100644 --- a/java/RocksDBSample.java +++ b/java/RocksDBSample.java @@ -38,7 +38,8 @@ public class RocksDBSample { .setMaxWriteBufferNumber(3) .setDisableSeekCompaction(true) .setBlockSize(64 * SizeUnit.KB) - .setMaxBackgroundCompactions(10); + .setMaxBackgroundCompactions(10) + .createBloomFilter(10); Statistics stats = options.statisticsPtr(); assert(options.createIfMissing() == true); diff --git a/java/org/rocksdb/Options.java b/java/org/rocksdb/Options.java index 287ef29fa..95081eb75 100644 --- a/java/org/rocksdb/Options.java +++ b/java/org/rocksdb/Options.java @@ -143,6 +143,28 @@ public class Options { assert(isInitialized()); return blockSize(nativeHandle_); } + + /** + * Filters are stored in rocksdb and are consulted automatically + * by rocksdb to decide whether or not to read some + * information from disk. In many cases, a filter can cut down the + * number of disk seeks form a handful to a single disk seek per + * DB::Get() call. + * + * This function a new filter policy that uses a bloom filter + * with approximately the specified number of bits per key. + * A good value for bitsPerKey is 10, which yields a filter + * with ~ 1% false positive rate. + * + * @param Bits per key for bloom filter. + * @return the instance of the current Options. + * @see RocksDB.open() + */ + public Options createBloomFilter(int bitsPerKey) { + assert(isInitialized()); + createBloomFilter0(nativeHandle_, bitsPerKey); + return this; + } /* * Disable compaction triggered by seek. @@ -1237,6 +1259,8 @@ public class Options { private native void useFixedLengthPrefixExtractor( long handle, int prefixLength); + + private native void createBloomFilter0(long handle, int bitsPerKey); long nativeHandle_; long cacheSize_; diff --git a/java/rocksjni/options.cc b/java/rocksjni/options.cc index 99b6b605e..f11f6961b 100644 --- a/java/rocksjni/options.cc +++ b/java/rocksjni/options.cc @@ -21,6 +21,7 @@ #include "rocksdb/memtablerep.h" #include "rocksdb/table.h" #include "rocksdb/slice_transform.h" +#include "rocksdb/filter_policy.h" /* * Class: org_rocksdb_Options @@ -119,6 +120,23 @@ jlong Java_org_rocksdb_Options_statisticsPtr( return reinterpret_cast(st); } +/* + * Class: org_rocksdb_Options + * Method: createBloomFilter0 + * Signature: (JI)V + */ +void Java_org_rocksdb_Options_createBloomFilter0( + JNIEnv* env, jobject jobj, jlong jhandle, jint jbits_per_key) { + rocksdb::Options* opt = reinterpret_cast(jhandle); + + // Delete previously allocated pointer + if(opt->filter_policy) { + delete opt->filter_policy; + } + + opt->filter_policy = rocksdb::NewBloomFilterPolicy(jbits_per_key); +} + /* * Class: org_rocksdb_Options * Method: maxWriteBufferNumber