From 50919813a15d9c29c182062f88885890c55eb76e Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Thu, 13 Sep 2018 16:22:39 +0300 Subject: [PATCH] os/bluestore: fix bloom filter num entry miscalculation in the repairer This could cause an assertion due to an access to uninitialized bloom filter. This happened when detecting errors involving physical extents close to the end of a large partition. E.g. it was observed in http://tracker.ceph.com/issues/25001 while trying to repair an OSD. Fixes: https://tracker.ceph.com/issues/35971 Signed-off-by: Igor Fedotov --- src/os/bluestore/BlueStore.h | 2 +- src/test/objectstore/test_bluestore_types.cc | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index bf65f6efb5dc1..baaf6f5f569ec 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2882,7 +2882,7 @@ public: granularity = round_up_to(granularity, min_alloc_size); } - uint64_t entries = p2roundup(total, granularity) / granularity; + uint64_t entries = round_up_to(total, granularity) / granularity; collections_bfs.resize(entries, bloom_filter(BLOOM_FILTER_SALT_COUNT, BLOOM_FILTER_TABLE_SIZE, diff --git a/src/test/objectstore/test_bluestore_types.cc b/src/test/objectstore/test_bluestore_types.cc index 284bd2fa88fb6..9b4b39772f806 100644 --- a/src/test/objectstore/test_bluestore_types.cc +++ b/src/test/objectstore/test_bluestore_types.cc @@ -1529,6 +1529,17 @@ TEST(BlueStoreRepairer, StoreSpaceTracker) ASSERT_EQ(3u, bmap.filter_out(extents)); ASSERT_TRUE(bmap.is_used(cid)); ASSERT_TRUE(bmap.is_used(hoid)); + + BlueStoreRepairer::StoreSpaceTracker bmap2; + bmap2.init((uint64_t)0x3223b1d1000, 0x10000); + ASSERT_EQ(bmap2.granularity, 0x1a0000); + ASSERT_EQ(bmap2.collections_bfs.size(), 0x1edae4); + ASSERT_EQ(bmap2.objects_bfs.size(), 0x1edae4); + bmap2.set_used(0x3223b190000, 0x10000, cid, hoid); + ASSERT_TRUE(bmap2.is_used(cid, 0x3223b190000)); + ASSERT_TRUE(bmap2.is_used(hoid, 0x3223b190000)); + ASSERT_TRUE(bmap2.is_used(cid, 0x3223b19f000)); + ASSERT_TRUE(bmap2.is_used(hoid, 0x3223b19ffff)); } int main(int argc, char **argv) { -- 2.39.5