From e335669be7833e26125cbf6ec7faf99afa097f77 Mon Sep 17 00:00:00 2001 From: Jeegn Chen Date: Thu, 18 Apr 2019 12:04:02 +0800 Subject: [PATCH] filestore: assure sufficient leaves in pre-split Fixes: http://tracker.ceph.com/issues/39390 Signed-off-by: Jeegn Chen (cherry picked from commit 4e530a14b43b4a4767152e72bc5398bf4d532967) --- src/os/filestore/HashIndex.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 -- 2.47.3