}
}
-int CrushWrapper::add_simple_ruleset(string name, string root_name,
- string failure_domain_name,
- string mode,
- int rule_type,
- ostream *err)
+int CrushWrapper::add_simple_ruleset_at(string name, string root_name,
+ string failure_domain_name,
+ string mode, int rule_type,
+ int rno, ostream *err)
{
if (rule_exists(name)) {
if (err)
*err << "rule " << name << " exists";
return -EEXIST;
}
+ if (rno >= 0) {
+ if (rule_exists(rno)) {
+ if (err)
+ *err << "rule with ruleno " << rno << " exists";
+ return -EEXIST;
+ }
+ if (ruleset_exists(rno)) {
+ if (err)
+ *err << "ruleset " << rno << " exists";
+ return -EEXIST;
+ }
+ } else {
+ for (rno = 0; rno < get_max_rules(); rno++) {
+ if (!rule_exists(rno) && !ruleset_exists(rno))
+ break;
+ }
+ }
if (!name_exists(root_name)) {
if (err)
*err << "root item " << root_name << " does not exist";
return -EINVAL;
}
- int rno = -1;
- for (rno = 0; rno < get_max_rules(); rno++) {
- if (!rule_exists(rno) && !ruleset_exists(rno))
- break;
- }
int steps = 3;
if (mode == "indep")
steps = 5;
return rno;
}
+int CrushWrapper::add_simple_ruleset(string name, string root_name,
+ string failure_domain_name,
+ string mode, int rule_type,
+ ostream *err)
+{
+ return add_simple_ruleset_at(name, root_name, failure_domain_name, mode,
+ rule_type, -1, err);
+}
+
int CrushWrapper::get_rule_weight_osd_map(unsigned ruleno, map<int,float> *pmap)
{
if (ruleno >= crush->max_rules)
// fixme
}
-/**
- * Determine the default CRUSH ruleset ID to be used with
- * newly created replicated pools.
- *
- * @returns a ruleset ID (>=0) or an error (<0)
- */
-int CrushWrapper::get_osd_pool_default_crush_replicated_ruleset(CephContext *cct)
+int CrushWrapper::_get_osd_pool_default_crush_replicated_ruleset(CephContext *cct,
+ bool quiet)
{
- int crush_ruleset = cct->_conf->osd_pool_default_crush_replicated_ruleset;
- if (cct->_conf->osd_pool_default_crush_rule != -1) {
+ int crush_ruleset = cct->_conf->osd_pool_default_crush_rule;
+ if (crush_ruleset == -1) {
+ crush_ruleset = cct->_conf->osd_pool_default_crush_replicated_ruleset;
+ } else if (!quiet) {
ldout(cct, 0) << "osd_pool_default_crush_rule is deprecated "
<< "use osd_pool_default_crush_replicated_ruleset instead"
<< dendl;
<< "osd_pool_default_crush_replicated_ruleset = "
<< cct->_conf->osd_pool_default_crush_replicated_ruleset
<< dendl;
- crush_ruleset = cct->_conf->osd_pool_default_crush_rule;
}
+ return crush_ruleset;
+}
+
+/**
+ * Determine the default CRUSH ruleset ID to be used with
+ * newly created replicated pools.
+ *
+ * @returns a ruleset ID (>=0) or -1 if no suitable ruleset found
+ */
+int CrushWrapper::get_osd_pool_default_crush_replicated_ruleset(CephContext *cct)
+{
+ int crush_ruleset = _get_osd_pool_default_crush_replicated_ruleset(cct,
+ false);
if (crush_ruleset == CEPH_DEFAULT_CRUSH_REPLICATED_RULESET) {
crush_ruleset = find_first_ruleset(pg_pool_t::TYPE_REPLICATED);
}
int add_simple_ruleset(string name, string root_name, string failure_domain_type,
string mode, int rule_type, ostream *err = 0);
+ /**
+ * @param rno ruleset id to use, -1 to pick the lowest available
+ */
+ int add_simple_ruleset_at(string name, string root_name,
+ string failure_domain_type, string mode,
+ int rule_type, int rno, ostream *err = 0);
int remove_rule(int ruleno);
void dump_tree(ostream *out, Formatter *f) const;
static void generate_test_instances(list<CrushWrapper*>& o);
+ int _get_osd_pool_default_crush_replicated_ruleset(CephContext *cct,
+ bool quiet);
int get_osd_pool_default_crush_replicated_ruleset(CephContext *cct);
static bool is_valid_crush_name(const string& s);
const string& root,
ostream *ss)
{
+ int crush_ruleset =
+ crush._get_osd_pool_default_crush_replicated_ruleset(cct, true);
string failure_domain =
crush.get_type_name(cct->_conf->osd_crush_chooseleaf_type);
+ if (crush_ruleset == CEPH_DEFAULT_CRUSH_REPLICATED_RULESET)
+ crush_ruleset = -1; // create ruleset 0 by default
+
int r;
- r = crush.add_simple_ruleset("replicated_ruleset", root, failure_domain,
- "firstn", pg_pool_t::TYPE_REPLICATED, ss);
+ r = crush.add_simple_ruleset_at("replicated_ruleset", root, failure_domain,
+ "firstn", pg_pool_t::TYPE_REPLICATED,
+ crush_ruleset, ss);
if (r < 0)
return r;
// do not add an erasure rule by default or else we will implicitly
run_mon $dir a \
--osd_pool_default_crush_replicated_ruleset $expected || return 1
./ceph osd pool get rbd crush_ruleset | grep 'ruleset: '$expected || return 1
+ ./ceph osd crush rule dump replicated_ruleset | grep '"ruleset": '$expected || return 1
CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1
! grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1
}
run_mon $dir a \
--osd_pool_default_crush_rule $expected || return 1
./ceph osd pool get rbd crush_ruleset | grep 'ruleset: '$expected || return 1
+ ./ceph osd crush rule dump replicated_ruleset | grep '"ruleset": '$expected || return 1
CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1
grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1
}
--osd_pool_default_crush_replicated_ruleset $unexpected || return 1
./ceph osd pool get rbd crush_ruleset | grep 'ruleset: '$expected || return 1
! ./ceph --format json osd dump | grep '"crush_ruleset":'$unexpected || return 1
+ ./ceph osd crush rule dump replicated_ruleset | grep '"ruleset": '$expected || return 1
CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1
grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1
}