From 1c57e2e2a45bbd94ad4c86c833c79bcc6976fb96 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 28 Feb 2017 13:37:04 -0600 Subject: [PATCH] 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 --- src/crush/CrushWrapper.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 { -- 2.47.3