start = 3;
}
- int ruleset = int_node(i->children[start]);
+ int ruleno = int_node(i->children[start]);
string tname = string_node(i->children[start+2]);
int type;
int steps = i->children.size() - start - 8;
//err << "num steps " << steps << std::endl;
-
- int ruleno = crush.add_rule(steps, ruleset, type, minsize, maxsize, -1);
+
+ if (crush.rule_exists(ruleno)) {
+ err << "rule " << ruleno << " already exists" << std::endl;
+ return -1;
+ }
+ int r = crush.add_rule(ruleno, steps, type, minsize, maxsize);
+ if (r != ruleno) {
+ err << "unable to add rule id " << ruleno << " for rule '" << rname
+ << "'" << std::endl;
+ return -1;
+ }
if (rname.length()) {
crush.set_rule_name(ruleno, rname.c_str());
rule_id[rname] = ruleno;
int get_rule_weight_osd_map(unsigned ruleno, map<int,float> *pmap);
/* modifiers */
- int add_rule(int len, int ruleset, int type, int minsize, int maxsize, int ruleno) {
+
+ int add_rule(int ruleno, int len, int type, int minsize, int maxsize) {
if (!crush) return -ENOENT;
- crush_rule *n = crush_make_rule(len, ruleset, type, minsize, maxsize);
+ crush_rule *n = crush_make_rule(len, ruleno, type, minsize, maxsize);
assert(n);
ruleno = crush_add_rule(crush, n, ruleno);
return ruleno;
root = crush.class_bucket[root][c];
}
- int rule = 0;
int rno = 0;
for (rno = 0; rno < crush.get_max_rules(); rno++) {
if (!crush.rule_exists(rno) && !crush.ruleset_exists(rno))
break;
}
- rule = rno;
int steps = 4 + rule_steps.size();
int min_rep = 3;
int max_rep = get_chunk_count();
int ret;
- ret = crush.add_rule(steps, rule, pg_pool_t::TYPE_ERASURE,
- min_rep, max_rep, rno);
+ ret = crush.add_rule(rno, steps, pg_pool_t::TYPE_ERASURE,
+ min_rep, max_rep);
assert(ret == rno);
int step = 0;
ret = crush.set_rule_step(rno, step++, CRUSH_RULE_EMIT, 0, 0);
assert(ret == 0);
crush.set_rule_name(rno, name);
- return rule;
+ return rno;
}
int ErasureCodeLrc::layers_description(const ErasureCodeProfile &profile,
- $ crushtool -c "$TESTDIR/check-overlapped-rules.crushmap.txt" -o "$TESTDIR/check-overlapped-rules.crushmap"
$ crushtool -i "$TESTDIR/check-overlapped-rules.crushmap" --check
overlapped rules in ruleset 0: rule-r0, rule-r1, rule-r2
overlapped rules in ruleset 0: rule-r0, rule-r2, rule-r3
overlapped rules in ruleset 0: rule-r0, rule-r3
- $ rm -f "$TESTDIR/check-overlapped-rules.crushmap"
+ $ crushtool -c "$TESTDIR/check-overlapped-rules.crushmap.txt" -o "$TESTDIR/check-overlapped-rules.crushmap.new"
+ rule 0 already exists
+ [1]
// choose + choose
{
cout << "take + choose + choose + choose + emit" << std::endl;
- int rule = c.add_rule(5, 2, 0, 1, 10, 2);
+ int rule = c.add_rule(2, 5, 0, 1, 10);
ASSERT_EQ(2, rule);
c.set_rule_step_take(rule, 0, bno);
c.set_rule_step_choose_indep(rule, 1, 2, 2);
}
int ret;
int ruleno = 0;
- int rule = 0;
- ruleno = rule;
- ret = c->add_rule(4, rule, 123, 1, 20, ruleno);
+ ret = c->add_rule(ruleno, 4, 123, 1, 20);
assert(ret == ruleno);
ret = c->set_rule_step(ruleno, 0, CRUSH_RULE_SET_CHOOSELEAF_TRIES, 10, 0);
assert(ret == 0);