57f3032285
Summary: There's no technological impediment to allowing the Bloom filter bits/key to be non-integer (fractional/decimal) values, and it provides finer control over the memory vs. accuracy trade-off. This is especially handy in using the format_version=5 Bloom filter in place of the old one, because bits_per_key=9.55 provides the same accuracy as the old bits_per_key=10. This change not only requires refining the logic for choosing the best num_probes for a given bits/key setting, it revealed a flaw in that logic. As bits/key gets higher, the best num_probes for a cache-local Bloom filter is closer to bpk / 2 than to bpk * 0.69, the best choice for a standard Bloom filter. For example, at 16 bits per key, the best num_probes is 9 (FP rate = 0.0843%) not 11 (FP rate = 0.0884%). This change fixes and refines that logic (for the format_version=5 Bloom filter only, just in case) based on empirical tests to find accuracy inflection points between each num_probes. Although bits_per_key is now specified as a double, the new Bloom filter converts/rounds this to "millibits / key" for predictable/precise internal computations. Just in case of unforeseen compatibility issues, we round to the nearest whole number bits / key for the legacy Bloom filter, so as not to unlock new behaviors for it. Pull Request resolved: https://github.com/facebook/rocksdb/pull/6092 Test Plan: unit tests included Differential Revision: D18711313 Pulled By: pdillinger fbshipit-source-id: 1aa73295f152a995328cb846ef9157ae8a05522a
43 lines
1.4 KiB
C++
43 lines
1.4 KiB
C++
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
//
|
|
// This file implements the "bridge" between Java and C++ for
|
|
// rocksdb::FilterPolicy.
|
|
|
|
#include <jni.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string>
|
|
|
|
#include "include/org_rocksdb_BloomFilter.h"
|
|
#include "include/org_rocksdb_Filter.h"
|
|
#include "rocksdb/filter_policy.h"
|
|
#include "rocksjni/portal.h"
|
|
|
|
/*
|
|
* Class: org_rocksdb_BloomFilter
|
|
* Method: createBloomFilter
|
|
* Signature: (DZ)J
|
|
*/
|
|
jlong Java_org_rocksdb_BloomFilter_createNewBloomFilter(
|
|
JNIEnv* /*env*/, jclass /*jcls*/, jdouble bits_per_key,
|
|
jboolean use_block_base_builder) {
|
|
auto* sptr_filter = new std::shared_ptr<const rocksdb::FilterPolicy>(
|
|
rocksdb::NewBloomFilterPolicy(bits_per_key, use_block_base_builder));
|
|
return reinterpret_cast<jlong>(sptr_filter);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_Filter
|
|
* Method: disposeInternal
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_Filter_disposeInternal(JNIEnv* /*env*/, jobject /*jobj*/,
|
|
jlong jhandle) {
|
|
auto* handle =
|
|
reinterpret_cast<std::shared_ptr<const rocksdb::FilterPolicy>*>(jhandle);
|
|
delete handle; // delete std::shared_ptr
|
|
}
|