From: Igor Fedotov Date: Thu, 13 Sep 2018 13:22:39 +0000 (+0300) Subject: os/bluestore: fix bloom filter num entry miscalculation in the repairer X-Git-Tag: v13.2.3~156^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c809f2d6a712d4ac8ae6da07f0f262b1382cd380;p=ceph.git 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 (cherry picked from commit 50919813a15d9c29c182062f88885890c55eb76e) --- diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 2c0ff2e38360..01e436cdcf44 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2727,7 +2727,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 09fd4d3a6c69..e3444dfa55b3 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(bmap.filter_out(extents), 3); 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) {