From c809f2d6a712d4ac8ae6da07f0f262b1382cd380 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 (cherry picked from commit 50919813a15d9c29c182062f88885890c55eb76e) --- 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 2c0ff2e383607..01e436cdcf446 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2727,7 +2727,7 @@ class BlueStoreRepairer 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 09fd4d3a6c691..e3444dfa55b32 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) {