]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/bloom_filter: add a few assertions and checks for bit_table_ == NULL 693/head
authorSage Weil <sage@inktank.com>
Sun, 6 Oct 2013 17:28:20 +0000 (10:28 -0700)
committerSage Weil <sage@inktank.com>
Sun, 6 Oct 2013 17:28:20 +0000 (10:28 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
src/common/bloom_filter.hpp
src/test/common/test_bloom_filter.cc

index 3e55687774b31e0fc51122ecdc37efb4e173f61c..93787a89a6099cf736136da2759265bf8b6c26d7 100644 (file)
@@ -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;
index 71d3de97d2a55e8b1e2526cda016c0427f9cd035..cfd41305caa2f322ec8e8d28d9c206f7116a9cb5 100644 (file)
@@ -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);