From: Igor Fedotov Date: Thu, 16 Aug 2018 11:51:06 +0000 (+0300) Subject: os/bluestore: fix assertion in StupidAllocator::get_fragmentation X-Git-Tag: v12.2.13~4^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F32523%2Fhead;p=ceph.git os/bluestore: fix assertion in StupidAllocator::get_fragmentation One might face an assertion (assert(intervals <= max_intervals)) in StupidAllocator::get_fragmentation method for clusters created by early Luminous releases and before. The root cause is that block volume size wasn't aligned with min_alloc_size and hence we missed that last fraction interval during max_interval calculation. Fixes: https://tracker.ceph.com/issues/43297 Note: This was a clean cherry-pick from master, but p2roundup was introduced since mimic release, use P2ROUNDUP instead Signed-off-by: Igor Fedotov (cherry picked from commit a60b2316ce0bed28c468043cff4cab5e61b1a694) Signed-off-by: Lei Liu --- diff --git a/src/os/bluestore/StupidAllocator.cc b/src/os/bluestore/StupidAllocator.cc index 4ea171e8598..d174de471ad 100644 --- a/src/os/bluestore/StupidAllocator.cc +++ b/src/os/bluestore/StupidAllocator.cc @@ -258,7 +258,7 @@ double StupidAllocator::get_fragmentation(uint64_t alloc_unit) uint64_t intervals = 0; { std::lock_guard l(lock); - max_intervals = num_free / alloc_unit; + max_intervals = P2ROUNDUP(num_free, alloc_unit) / alloc_unit; for (unsigned bin = 0; bin < free.size(); ++bin) { intervals += free[bin].num_intervals(); }