diff --git a/db/c.cc b/db/c.cc index a3883c9bf..72274e68f 100644 --- a/db/c.cc +++ b/db/c.cc @@ -3840,7 +3840,8 @@ void rocksdb_filterpolicy_destroy(rocksdb_filterpolicy_t* filter) { delete filter; } -rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom_format(int bits_per_key, bool original_format) { +rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom_format( + double bits_per_key, bool original_format) { // Make a rocksdb_filterpolicy_t, but override all of its methods so // they delegate to a NewBloomFilterPolicy() instead of user // supplied C functions. @@ -3875,16 +3876,17 @@ rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom_format(int bits_per_ke return wrapper; } -rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom_full(int bits_per_key) { +rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom_full( + double bits_per_key) { return rocksdb_filterpolicy_create_bloom_format(bits_per_key, false); } -rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom(int bits_per_key) { +rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom(double bits_per_key) { return rocksdb_filterpolicy_create_bloom_format(bits_per_key, true); } rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_ribbon_format( - int bloom_equivalent_bits_per_key) { + double bloom_equivalent_bits_per_key, int bloom_before_level) { // Make a rocksdb_filterpolicy_t, but override all of its methods so // they delegate to a NewRibbonFilterPolicy() instead of user // supplied C functions. @@ -3911,7 +3913,8 @@ rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_ribbon_format( static void DoNothing(void*) {} }; Wrapper* wrapper = new Wrapper; - wrapper->rep_ = NewRibbonFilterPolicy(bloom_equivalent_bits_per_key); + wrapper->rep_ = + NewRibbonFilterPolicy(bloom_equivalent_bits_per_key, bloom_before_level); wrapper->state_ = nullptr; wrapper->delete_filter_ = nullptr; wrapper->destructor_ = &Wrapper::DoNothing; @@ -3919,9 +3922,15 @@ rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_ribbon_format( } rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_ribbon( - int bloom_equivalent_bits_per_key) { + double bloom_equivalent_bits_per_key) { return rocksdb_filterpolicy_create_ribbon_format( - bloom_equivalent_bits_per_key); + bloom_equivalent_bits_per_key, /*bloom_before_level = disabled*/ -1); +} + +rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_ribbon_hybrid( + double bloom_equivalent_bits_per_key, int bloom_before_level) { + return rocksdb_filterpolicy_create_ribbon_format( + bloom_equivalent_bits_per_key, bloom_before_level); } rocksdb_mergeoperator_t* rocksdb_mergeoperator_create( diff --git a/db/c_test.c b/db/c_test.c index eb94eb864..bbc4e9db9 100644 --- a/db/c_test.c +++ b/db/c_test.c @@ -1043,21 +1043,25 @@ int main(int argc, char** argv) { } StartPhase("filter"); - for (run = 0; run <= 3; run++) { - // First run uses custom filter - // Second run uses old block-based bloom filter - // Third run uses full bloom filter + for (run = 0; run <= 4; run++) { + // run=0 uses custom filter + // run=1 uses old block-based bloom filter + // run=2 run uses full bloom filter + // run=3 uses Ribbon + // run=4 uses Ribbon-Bloom hybrid configuration CheckNoError(err); rocksdb_filterpolicy_t* policy; if (run == 0) { policy = rocksdb_filterpolicy_create(NULL, FilterDestroy, FilterCreate, FilterKeyMatch, NULL, FilterName); } else if (run == 1) { - policy = rocksdb_filterpolicy_create_bloom(8); + policy = rocksdb_filterpolicy_create_bloom(8.0); } else if (run == 2) { - policy = rocksdb_filterpolicy_create_bloom_full(8); + policy = rocksdb_filterpolicy_create_bloom_full(8.0); + } else if (run == 3) { + policy = rocksdb_filterpolicy_create_ribbon(8.0); } else { - policy = rocksdb_filterpolicy_create_ribbon(8); + policy = rocksdb_filterpolicy_create_ribbon_hybrid(8.0, 1); } rocksdb_block_based_options_set_filter_policy(table_options, policy); @@ -1123,7 +1127,7 @@ int main(int argc, char** argv) { } else if (run == 1) { // Essentially a fingerprint of the block-based Bloom schema CheckCondition(hits == 241); - } else if (run == 2) { + } else if (run == 2 || run == 4) { // Essentially a fingerprint of full Bloom schema, format_version=5 CheckCondition(hits == 188); } else { diff --git a/include/rocksdb/c.h b/include/rocksdb/c.h index 6e4d70288..c8ee0c939 100644 --- a/include/rocksdb/c.h +++ b/include/rocksdb/c.h @@ -1599,11 +1599,14 @@ extern ROCKSDB_LIBRARY_API void rocksdb_filterpolicy_destroy( rocksdb_filterpolicy_t*); extern ROCKSDB_LIBRARY_API rocksdb_filterpolicy_t* -rocksdb_filterpolicy_create_bloom(int bits_per_key); +rocksdb_filterpolicy_create_bloom(double bits_per_key); extern ROCKSDB_LIBRARY_API rocksdb_filterpolicy_t* -rocksdb_filterpolicy_create_bloom_full(int bits_per_key); +rocksdb_filterpolicy_create_bloom_full(double bits_per_key); extern ROCKSDB_LIBRARY_API rocksdb_filterpolicy_t* -rocksdb_filterpolicy_create_ribbon(int bloom_equivalent_bits_per_key); +rocksdb_filterpolicy_create_ribbon(double bloom_equivalent_bits_per_key); +extern ROCKSDB_LIBRARY_API rocksdb_filterpolicy_t* +rocksdb_filterpolicy_create_ribbon_hybrid(double bloom_equivalent_bits_per_key, + int bloom_before_level); /* Merge Operator */