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 <ifedotov@suse.com>
(cherry picked from commit
a60b2316ce0bed28c468043cff4cab5e61b1a694)
Signed-off-by: Lei Liu <liulei3@360.cn>
uint64_t intervals = 0;
{
std::lock_guard<std::mutex> 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();
}