]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crush/CrushWrapper: optimize find_rule when rules are uniform
authorSage Weil <sage@redhat.com>
Tue, 28 Feb 2017 19:37:04 +0000 (13:37 -0600)
committerSage Weil <sage@redhat.com>
Mon, 19 Jun 2017 23:09:06 +0000 (19:09 -0400)
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 <sage@redhat.com>
src/crush/CrushWrapper.h

index f2c47a9907475847dbc4cc1df4a0c3253e2f3926..959682ec14987a5c8d4fe2437a9a98a63a3647ec 100644 (file)
@@ -62,6 +62,9 @@ public:
 
 private:
   struct crush_map *crush;
+
+  bool have_uniform_rules = false;
+
   /* reverse maps */
   mutable bool have_rmaps;
   mutable std::map<string, int> 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 {