]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Refactor ErasureCodeLrc::create_ruleset 2398/head
authorXiaoxi Chen <xiaoxi.chen@intel.com>
Thu, 4 Sep 2014 15:47:51 +0000 (23:47 +0800)
committerXiaoxi Chen <xiaoxi.chen@intel.com>
Fri, 5 Sep 2014 01:21:51 +0000 (09:21 +0800)
Refactor ErasureCodeLrc::create_ruleset
1.Use CrushWrapper instead of crush C-api.
2.Make ruleset_id == rule_id, consist as the behavior in
  CrushWrapper::add_simple_ruleset().

Signed-off-by: Xiaoxi Chen <xiaoxi.chen@intel.com>
src/erasure-code/lrc/ErasureCodeLrc.cc

index 249f9f7a5ac0e68c7acca364242a2119d45e2c64..218c283dedb1559ffef601e5e4aee499bd42e2c3 100644 (file)
@@ -55,23 +55,26 @@ int ErasureCodeLrc::create_ruleset(const string &name,
   int root = crush.get_item_id(ruleset_root);
 
   int ruleset = 0;
-  for (int i = 0; i < crush.get_max_rules(); i++) {
-    if (crush.rule_exists(i) &&
-       crush.get_rule_mask_ruleset(i) >= ruleset) {
-      ruleset = crush.get_rule_mask_ruleset(i) + 1;
-    }
+  int rno = 0;
+  for (rno = 0; rno < crush.get_max_rules(); rno++) {
+    if (!crush.rule_exists(rno) && !crush.ruleset_exists(rno))
+       break;
   }
+  ruleset = rno;
 
   int steps = 3 + ruleset_steps.size();
   int min_rep = 3;
   int max_rep = 30;
-  crush_rule *rule = crush_make_rule(steps, ruleset,
-                                    pg_pool_t::TYPE_ERASURE,
-                                    min_rep, max_rep);
-  assert(rule);
+  int ret;
+  ret = crush.add_rule(steps, ruleset, pg_pool_t::TYPE_ERASURE,
+                 min_rep, max_rep, rno);
+  assert(ret == rno);
   int step = 0;
-  crush_rule_set_step(rule, step++, CRUSH_RULE_SET_CHOOSELEAF_TRIES, 5, 0);
-  crush_rule_set_step(rule, step++, CRUSH_RULE_TAKE, root, 0);
+
+  ret = crush.set_rule_step(rno, step++, CRUSH_RULE_SET_CHOOSELEAF_TRIES, 5, 0);
+  assert(ret == 0);
+  ret = crush.set_rule_step(rno, step++, CRUSH_RULE_TAKE, root, 0);
+  assert(ret == 0);
   // [ [ "choose", "rack", 2 ],
   //   [ "chooseleaf", "host", 5 ] ]
   for (vector<Step>::const_iterator i = ruleset_steps.begin();
@@ -84,12 +87,12 @@ int ErasureCodeLrc::create_ruleset(const string &name,
       *ss << "unknown crush type " << i->type;
       return -EINVAL;
     }
-    crush_rule_set_step(rule, step++, op, i->n, type);
+    ret = crush.set_rule_step(rno, step++, op, i->n, type);
+    assert(ret == 0);
   }
-  crush_rule_set_step(rule, step++, CRUSH_RULE_EMIT, 0, 0);
-  int rno = crush_add_rule(crush.crush, rule, -1);
+  ret = crush.set_rule_step(rno, step++, CRUSH_RULE_EMIT, 0, 0);
+  assert(ret == 0);
   crush.set_rule_name(rno, name);
-
   return ruleset;
 }