From: Sage Weil Date: Tue, 28 Feb 2017 19:37:04 +0000 (-0600) Subject: crush/CrushWrapper: optimize find_rule when rules are uniform X-Git-Tag: v12.1.0~27^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1c57e2e2a45bbd94ad4c86c833c79bcc6976fb96;p=ceph.git crush/CrushWrapper: optimize find_rule when rules are uniform On finalize, set a flag indicating whether our rules are uniform. If so, find_rule() is trivial--it just verifies the rule exists. Signed-off-by: Sage Weil --- diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index f2c47a99074..959682ec149 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -62,6 +62,9 @@ public: private: struct crush_map *crush; + + bool have_uniform_rules = false; + /* reverse maps */ mutable bool have_rmaps; mutable std::map type_rmap, name_rmap, rule_name_rmap; @@ -1166,6 +1169,7 @@ public: void finalize() { assert(crush); crush_finalize(crush); + have_uniform_rules = !has_legacy_rulesets(); } int update_device_class(CephContext *cct, int id, const string& class_name, const string& name); @@ -1207,7 +1211,14 @@ public: int find_rule(int ruleset, int type, int size) const { if (!crush) return -1; - return crush_find_rule(crush, ruleset, type, size); + if (!have_uniform_rules) { + return crush_find_rule(crush, ruleset, type, size); + } else { + if (ruleset < (int)crush->max_rules && + crush->rules[ruleset]) + return ruleset; + return -1; + } } bool ruleset_exists(int const ruleset) const {