diff --git a/deps/oblib/src/lib/container/ob_bitmap.cpp b/deps/oblib/src/lib/container/ob_bitmap.cpp index 3d41f48415..940f26600d 100644 --- a/deps/oblib/src/lib/container/ob_bitmap.cpp +++ b/deps/oblib/src/lib/container/ob_bitmap.cpp @@ -140,10 +140,12 @@ int ObBitmap::load_blocks_from_array(size_type *block_data, size_type num_bits) walk_ptr = walk_ptr->next_; } // Set bits in the same block after @valid_bits_ to false - size_type inner_pos = valid_bits_; - walk_ptr = find_block(valid_bits_, inner_pos); - for (size_type i = bit_index(inner_pos); i < BITS_PER_BLOCK; ++i) { - walk_ptr->bits_[block_index(inner_pos)] &= ~bit_mask(i); + if (0 != (valid_bits_ & BLOCK_MOD_MASK)) { + size_type inner_pos = valid_bits_; + walk_ptr = find_block(valid_bits_, inner_pos); + for (size_type i = bit_index(inner_pos); i < BITS_PER_BLOCK; ++i) { + walk_ptr->bits_[block_index(inner_pos)] &= ~bit_mask(i); + } } } } diff --git a/deps/oblib/unittest/lib/container/test_bitmap.cpp b/deps/oblib/unittest/lib/container/test_bitmap.cpp index 918219a93b..48cd2be353 100644 --- a/deps/oblib/unittest/lib/container/test_bitmap.cpp +++ b/deps/oblib/unittest/lib/container/test_bitmap.cpp @@ -142,6 +142,15 @@ TEST_F(TestObBitmap, load_from_array) EXPECT_EQ(OB_SUCCESS, bitmap.load_blocks_from_array(data, 64 * 5)); EXPECT_EQ(64 * 5, bitmap.size()); EXPECT_EQ(3 * 5, bitmap.popcnt()); + + bitmap.expand_size(4096); + ObBitmap::size_type data2[64]; + for (int64_t i = 0; i < 64; i++) { + data2[i] = 7; + } + EXPECT_EQ(OB_SUCCESS, bitmap.load_blocks_from_array(data2, 64 * 64)); + EXPECT_EQ(64 * 64, bitmap.size()); + EXPECT_EQ(3 * 64, bitmap.popcnt()); } } // end of namespace unittest