diff --git a/be/src/olap/rowset/segment_v2/bloom_filter.h b/be/src/olap/rowset/segment_v2/bloom_filter.h index 6c6ba4d78883cd..d744301f49b892 100644 --- a/be/src/olap/rowset/segment_v2/bloom_filter.h +++ b/be/src/olap/rowset/segment_v2/bloom_filter.h @@ -72,6 +72,7 @@ class BloomFilter { _size = _num_bytes + 1; // reserve last byte for null flag _data = new char[_size]; + memset(_data, 0, _size); _has_null = (bool*)(_data + _num_bytes); *_has_null = false; return Status::OK(); diff --git a/be/test/olap/rowset/segment_v2/block_bloom_filter_test.cpp b/be/test/olap/rowset/segment_v2/block_bloom_filter_test.cpp index 63601ab610dc15..28e5e77333179b 100644 --- a/be/test/olap/rowset/segment_v2/block_bloom_filter_test.cpp +++ b/be/test/olap/rowset/segment_v2/block_bloom_filter_test.cpp @@ -103,27 +103,43 @@ TEST_F(BlockBloomFilterTest, SP) { ASSERT_TRUE(st.ok()); ASSERT_TRUE(bf2->size() > 0); - int num = 1024; - int32_t values[1024]; - for (int32_t i = 0; i < 1024; ++i) { + int num = _expected_num; + int32_t values[num]; + for (int32_t i = 0; i < num; ++i) { values[i] = i * 10 + 1; - } - for (int i = 0; i < num; ++i) { bf->add_bytes((char*)&values[i], sizeof(int32_t)); } - int32_t values2[1024]; - for (int32_t i = 0; i < 1024; ++i) { + int32_t values2[num]; + for (int32_t i = 0; i < num; ++i) { values2[i] = 15360 + i * 10 + 1; + bf2->add_bytes((char*)&values2[i], sizeof(int32_t)); } + // true test for (int i = 0; i < num; ++i) { - bf2->add_bytes((char*)&values2[i], sizeof(int32_t)); + ASSERT_TRUE(bf->test_bytes((char*)&values[i], 4)); + ASSERT_TRUE(bf2->test_bytes((char*)&values2[i], 4)); } - int32_t to_check = 101; - ASSERT_TRUE(bf->test_bytes((char*)&to_check, 4)); - ASSERT_FALSE(bf2->test_bytes((char*)&to_check, 4)); + // false test + int false_count1 = 0; + int false_count2 = 0; + for (int i = 0; i < num; ++i) { + int32_t to_check1 = values[i]; + for (int j = 1; j < 10; ++j) { + ++to_check1; + false_count1 += bf->test_bytes((char*)&to_check1, 4); + } + + int32_t to_check2 = values2[i]; + for (int j = 1; j < 10; ++j) { + ++to_check2; + false_count2 += bf2->test_bytes((char*)&to_check2, 4); + } + } + ASSERT_LE((double)false_count1 / (num * 9), _fpp); + ASSERT_LE((double)false_count2 / (num * 9), _fpp); } // Test for slice