summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-10-06 10:28:20 -0700
committerSage Weil <sage@inktank.com>2013-10-06 10:28:20 -0700
commit0cae3a13fa2fd94ae9f58e0c73bc4d0e8fd0992f (patch)
treeab435e03b86604818b2d56c5a1bba28a5a2f5deb
parentcf34adb99b456db845295bfca2b1fb310d873f89 (diff)
downloadceph-0cae3a13fa2fd94ae9f58e0c73bc4d0e8fd0992f.tar.gz
common/bloom_filter: add a few assertions and checks for bit_table_ == NULL
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/common/bloom_filter.hpp22
-rw-r--r--src/test/common/test_bloom_filter.cc8
2 files changed, 27 insertions, 3 deletions
diff --git a/src/common/bloom_filter.hpp b/src/common/bloom_filter.hpp
index 3e55687774b..93787a89a60 100644
--- a/src/common/bloom_filter.hpp
+++ b/src/common/bloom_filter.hpp
@@ -101,8 +101,12 @@ public:
void init() {
generate_unique_salt();
- bit_table_ = new cell_type[table_size_];
- std::fill_n(bit_table_, table_size_, 0x00);
+ if (table_size_) {
+ bit_table_ = new cell_type[table_size_];
+ std::fill_n(bit_table_, table_size_, 0x00);
+ } else {
+ bit_table_ = NULL;
+ }
}
bloom_filter(const bloom_filter& filter)
@@ -137,7 +141,8 @@ public:
inline void clear()
{
- std::fill_n(bit_table_, table_size_, 0x00);
+ if (bit_table_)
+ std::fill_n(bit_table_, table_size_, 0x00);
insert_count_ = 0;
}
@@ -151,6 +156,7 @@ public:
* @param val integer value to insert
*/
inline void insert(uint32_t val) {
+ assert(bit_table_);
std::size_t bit_index = 0;
std::size_t bit = 0;
for (std::size_t i = 0; i < salt_.size(); ++i)
@@ -163,6 +169,7 @@ public:
inline void insert(const unsigned char* key_begin, const std::size_t& length)
{
+ assert(bit_table_);
std::size_t bit_index = 0;
std::size_t bit = 0;
for (std::size_t i = 0; i < salt_.size(); ++i)
@@ -212,6 +219,8 @@ public:
*/
inline virtual bool contains(uint32_t val) const
{
+ if (!bit_table_)
+ return false;
std::size_t bit_index = 0;
std::size_t bit = 0;
for (std::size_t i = 0; i < salt_.size(); ++i)
@@ -227,6 +236,8 @@ public:
inline virtual bool contains(const unsigned char* key_begin, const std::size_t length) const
{
+ if (!bit_table_)
+ return false;
std::size_t bit_index = 0;
std::size_t bit = 0;
for (std::size_t i = 0; i < salt_.size(); ++i)
@@ -305,6 +316,8 @@ public:
*/
inline double density() const
{
+ if (!bit_table_)
+ return 0.0;
size_t set = 0;
uint8_t *p = bit_table_;
size_t left = table_size_;
@@ -605,6 +618,9 @@ public:
inline bool compress(const double& target_ratio)
{
+ if (!bit_table_)
+ return false;
+
if ((0.0 >= target_ratio) || (target_ratio >= 1.0))
{
return false;
diff --git a/src/test/common/test_bloom_filter.cc b/src/test/common/test_bloom_filter.cc
index 71d3de97d2a..cfd41305caa 100644
--- a/src/test/common/test_bloom_filter.cc
+++ b/src/test/common/test_bloom_filter.cc
@@ -23,6 +23,14 @@ TEST(BloomFilter, Basic) {
ASSERT_TRUE(bf.contains("bar"));
}
+TEST(BloomFilter, Empty) {
+ bloom_filter bf;
+ for (int i=0; i<100; ++i) {
+ ASSERT_FALSE(bf.contains(i));
+ ASSERT_FALSE(bf.contains(stringify(i)));
+ }
+}
+
TEST(BloomFilter, Sweep) {
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
std::cout.precision(5);