From: songbaisen Date: Mon, 25 Apr 2016 02:34:42 +0000 (+0800) Subject: crush: When consider rule size use the correct method. X-Git-Tag: v10.2.4~75^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7d92e2ea1855a21f9a444c716c590e90dcb9f978;p=ceph.git crush: When consider rule size use the correct method. Signed-off-by: song baisen (cherry picked from commit 4cf4791ea1200528ccc0d65b3d4a0fbc234c5df0) --- diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index 1f9c8789d90..9615d9e8d30 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -1094,6 +1094,32 @@ public: for (int i=0; imax_rules; i++) { + if (crush->rules[i] && + crush->rules[i]->mask.ruleset == ruleset && + crush->rules[i]->mask.type == type) { + + if (crush->rules[i]->mask.min_size <= size && + crush->rules[i]->mask.max_size >= size) { + return true; + } else if (size < crush->rules[i]->mask.min_size) { + ss << "pool size is smaller than the crush rule min size"; + return false; + } else { + ss << "pool size is bigger than the crush rule max size"; + return false; + } + } + } + + return false; + } int read_from_file(const char *fn) { bufferlist bl; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index da9cd6735a0..796a4b560d6 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -4793,18 +4793,11 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, dout(10) << " prepare_pool_size returns " << r << dendl; return r; } - const int64_t minsize = osdmap.crush->get_rule_mask_min_size(crush_ruleset); - if ((int64_t)size < minsize) { - *ss << "pool size " << size << " is smaller than crush ruleset name " - << crush_ruleset_name << " min size " << minsize; - return -EINVAL; - } - const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(crush_ruleset); - if ((int64_t)size > maxsize) { - *ss << "pool size " << size << " is bigger than crush ruleset name " - << crush_ruleset_name << " max size " << maxsize; + + if (!osdmap.crush->check_crush_rule(crush_ruleset, pool_type, size, *ss)) { return -EINVAL; } + uint32_t stripe_width = 0; r = prepare_pool_stripe_width(pool_type, erasure_code_profile, &stripe_width, ss); if (r) { @@ -5148,17 +5141,8 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, ss << "crush ruleset " << n << " does not exist"; return -ENOENT; } - const int64_t poolsize = p.get_size(); - const int64_t minsize = osdmap.crush->get_rule_mask_min_size(n); - if (poolsize < minsize) { - ss << "pool size " << poolsize << " is smaller than crush ruleset " - << n << " min size " << minsize; - return -EINVAL; - } - const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(n); - if (poolsize > maxsize) { - ss << "pool size " << poolsize << " is bigger than crush ruleset " - << n << " max size " << maxsize; + + if (!osdmap.crush->check_crush_rule(n, p.get_type(), p.get_size(), ss)) { return -EINVAL; } p.crush_ruleset = n;