]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: fix bloom filter num entry miscalculation in the repairer 24076/head
authorIgor Fedotov <ifedotov@suse.com>
Thu, 13 Sep 2018 13:22:39 +0000 (16:22 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Thu, 13 Sep 2018 14:24:26 +0000 (17:24 +0300)
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 <ifedotov@suse.com>
src/os/bluestore/BlueStore.h
src/test/objectstore/test_bluestore_types.cc

index bf65f6efb5dc1ab6eb383f4c3681b9712ebf664d..baaf6f5f569ecd8d045a67a0d1ef4d437ad88490 100644 (file)
@@ -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,
index 284bd2fa88fb6d7349fc6c70663828c15a2b3d8e..9b4b39772f806db53f99b36a2828232ba6af0dc1 100644 (file)
@@ -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) {