From: Jeegn Chen Date: Thu, 18 Apr 2019 04:04:02 +0000 (+0800) Subject: filestore: assure sufficient leaves in pre-split X-Git-Tag: v13.2.7~158^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e335669be7833e26125cbf6ec7faf99afa097f77;p=ceph.git filestore: assure sufficient leaves in pre-split Fixes: http://tracker.ceph.com/issues/39390 Signed-off-by: Jeegn Chen (cherry picked from commit 4e530a14b43b4a4767152e72bc5398bf4d532967) --- diff --git a/src/os/filestore/HashIndex.cc b/src/os/filestore/HashIndex.cc index 50bdf3cd2bc2..7ec2c4e09100 100644 --- a/src/os/filestore/HashIndex.cc +++ b/src/os/filestore/HashIndex.cc @@ -587,10 +587,11 @@ int HashIndex::pre_split_folder(uint32_t pg_num, uint64_t expected_num_objs) const uint32_t subs = (1 << split_bits); // Calculate how many levels we create starting from here int level = 0; - leavies /= subs; - while (leavies > 1) { + int level_limit = MAX_HASH_LEVEL - dump_num - 1; + uint64_t actual_leaves = subs; + while (actual_leaves < leavies && level < level_limit) { ++level; - leavies = leavies >> 4; + actual_leaves <<= 4; } for (uint32_t i = 0; i < subs; ++i) { ceph_assert(split_bits <= 4); // otherwise BAD_SHIFT