crush.set_type_name(1, "domain");
crush.set_type_name(2, "pool");
+ int npools = 3;
+
int minrep = g_conf.osd_min_rep;
int ndom = MAX(g_conf.osd_max_rep, g_conf.osd_max_raid_width);
if (num_osd >= ndom*3 &&
// rules
// replication
- for (int pool=0; pool<1; pool++) {
+ for (int pool=0; pool<npools; pool++) {
// size minrep..ndom
crush_rule *rule = crush_make_rule(4, pool, CEPH_PG_TYPE_REP, minrep, ndom);
crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, rootid, 0);
crush_rule_set_step(rule, 1, CRUSH_RULE_CHOOSE_FIRSTN, CRUSH_CHOOSE_N, 1); // choose N domains
crush_rule_set_step(rule, 2, CRUSH_RULE_CHOOSE_FIRSTN, 1, 0); // and 1 device in each
crush_rule_set_step(rule, 3, CRUSH_RULE_EMIT, 0, 0);
- crush_add_rule(crush.crush, rule, -1);
+ int rno = crush_add_rule(crush.crush, rule, -1);
+ crush.set_rule_name(rno, get_pool_name(pool));
}
// raid
- for (int pool=0; pool<1; pool++) {
- crush_rule *rule = crush_make_rule(4, pool, CEPH_PG_TYPE_RAID4, g_conf.osd_min_raid_width, g_conf.osd_max_raid_width);
- crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, rootid, 0);
- crush_rule_set_step(rule, 1, CRUSH_RULE_CHOOSE_INDEP, CRUSH_CHOOSE_N, 1);
- crush_rule_set_step(rule, 2, CRUSH_RULE_CHOOSE_INDEP, 1, 0);
- crush_rule_set_step(rule, 3, CRUSH_RULE_EMIT, 0, 0);
- crush_add_rule(crush.crush, rule, -1);
- }
+ if (g_conf.osd_min_raid_width <= g_conf.osd_max_raid_width)
+ for (int pool=0; pool<npools; pool++) {
+ crush_rule *rule = crush_make_rule(4, pool, CEPH_PG_TYPE_RAID4, g_conf.osd_min_raid_width, g_conf.osd_max_raid_width);
+ crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, rootid, 0);
+ crush_rule_set_step(rule, 1, CRUSH_RULE_CHOOSE_INDEP, CRUSH_CHOOSE_N, 1);
+ crush_rule_set_step(rule, 2, CRUSH_RULE_CHOOSE_INDEP, 1, 0);
+ crush_rule_set_step(rule, 3, CRUSH_RULE_EMIT, 0, 0);
+ crush_add_rule(crush.crush, rule, -1);
+ }
} else {
// one bucket
crush.set_item_name(rootid, "root");
// replication
- for (int pool=0; pool<1; pool++) {
+ for (int pool=0; pool<npools; pool++) {
crush_rule *rule = crush_make_rule(3, pool, CEPH_PG_TYPE_REP, g_conf.osd_min_rep, g_conf.osd_max_rep);
crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, rootid, 0);
crush_rule_set_step(rule, 1, CRUSH_RULE_CHOOSE_FIRSTN, CRUSH_CHOOSE_N, 0);
crush_rule_set_step(rule, 2, CRUSH_RULE_EMIT, 0, 0);
- crush_add_rule(crush.crush, rule, -1);
+ int rno = crush_add_rule(crush.crush, rule, -1);
+ crush.set_rule_name(rno, get_pool_name(pool));
}
// raid4
- for (int pool=0; pool<1; pool++) {
- crush_rule *rule = crush_make_rule(3, pool, CEPH_PG_TYPE_RAID4, g_conf.osd_min_raid_width, g_conf.osd_max_raid_width);
- crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, rootid, 0);
- crush_rule_set_step(rule, 1, CRUSH_RULE_CHOOSE_INDEP, CRUSH_CHOOSE_N, 0);
- crush_rule_set_step(rule, 2, CRUSH_RULE_EMIT, 0, 0);
- crush_add_rule(crush.crush, rule, -1);
- }
+ if (g_conf.osd_min_raid_width <= g_conf.osd_max_raid_width)
+ for (int pool=0; pool<npools; pool++) {
+ crush_rule *rule = crush_make_rule(3, pool, CEPH_PG_TYPE_RAID4, g_conf.osd_min_raid_width, g_conf.osd_max_raid_width);
+ crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, rootid, 0);
+ crush_rule_set_step(rule, 1, CRUSH_RULE_CHOOSE_INDEP, CRUSH_CHOOSE_N, 0);
+ crush_rule_set_step(rule, 2, CRUSH_RULE_EMIT, 0, 0);
+ crush_add_rule(crush.crush, rule, -1);
+ }
}
crush.finalize();