+#include "osd/osd_types.h"
#include "common/debug.h"
#include "common/Formatter.h"
#include "common/errno.h"
// 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 crush_ruleset = cct->_conf->osd_pool_default_crush_replicated_ruleset;
<< dendl;
crush_ruleset = cct->_conf->osd_pool_default_crush_rule;
}
+
+ if (crush_ruleset == CEPH_DEFAULT_CRUSH_REPLICATED_RULESET) {
+ crush_ruleset = find_first_ruleset(pg_pool_t::TYPE_REPLICATED);
+ }
+
return crush_ruleset;
}
if (!crush) return -1;
return crush_find_rule(crush, ruleset, type, size);
}
+
+ bool ruleset_exists(int const ruleset) const {
+ for (size_t i = 0; i < crush->max_rules; ++i) {
+ if (crush->rules[i]->mask.ruleset == ruleset) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Return the lowest numbered ruleset of type `type`
+ *
+ * @returns a ruleset ID, or -1 if no matching rulesets found.
+ */
+ int find_first_ruleset(int type) const {
+ int result = -1;
+
+ for (size_t i = 0; i < crush->max_rules; ++i) {
+ if (crush->rules[i]
+ && crush->rules[i]->mask.type == type
+ && (crush->rules[i]->mask.ruleset < result || result == -1)) {
+ result = crush->rules[i]->mask.ruleset;
+ }
+ }
+
+ return result;
+ }
+
void do_rule(int rule, int x, vector<int>& out, int maxout,
const vector<__u32>& weight) const {
Mutex::Locker l(mapper_lock);
void dump_tree(const vector<__u32>& w, ostream *out, Formatter *f) const;
static void generate_test_instances(list<CrushWrapper*>& o);
- static int get_osd_pool_default_crush_replicated_ruleset(CephContext *cct);
+ int get_osd_pool_default_crush_replicated_ruleset(CephContext *cct);
static bool is_valid_crush_name(const string& s);
static bool is_valid_crush_loc(CephContext *cct,
if (*crush_ruleset < 0) {
switch (pool_type) {
case pg_pool_t::TYPE_REPLICATED:
- *crush_ruleset =
- CrushWrapper::get_osd_pool_default_crush_replicated_ruleset(g_ceph_context);
+ *crush_ruleset = osdmap.crush->get_osd_pool_default_crush_replicated_ruleset(g_ceph_context);
+ if (*crush_ruleset < 0) {
+ // Errors may happen e.g. if no valid ruleset is available
+ ss << "No suitable CRUSH ruleset exists";
+ return *crush_ruleset;
+ }
break;
case pg_pool_t::TYPE_ERASURE:
{
return -EINVAL;
break;
}
+ } else {
+ if (!osdmap.crush->ruleset_exists(*crush_ruleset)) {
+ ss << "CRUSH ruleset " << *crush_ruleset << " not found";
+ return -ENOENT;
+ }
}
return 0;
pool_names.push_back("metadata");
pool_names.push_back("rbd");
+ stringstream ss;
+ int r;
+ if (nosd >= 0)
+ r = build_simple_crush_map(cct, *crush, nosd, &ss);
+ else
+ r = build_simple_crush_map_from_conf(cct, *crush, &ss);
+
int poolbase = get_max_osd() ? get_max_osd() : 1;
+ int const default_replicated_ruleset = crush->get_osd_pool_default_crush_replicated_ruleset(cct);
+ assert(default_replicated_ruleset >= 0);
+
for (vector<string>::iterator p = pool_names.begin();
p != pool_names.end(); ++p) {
int64_t pool = ++pool_max;
pools[pool].flags |= pg_pool_t::FLAG_HASHPSPOOL;
pools[pool].size = cct->_conf->osd_pool_default_size;
pools[pool].min_size = cct->_conf->get_osd_pool_default_min_size();
- pools[pool].crush_ruleset =
- CrushWrapper::get_osd_pool_default_crush_replicated_ruleset(cct);
+ pools[pool].crush_ruleset = default_replicated_ruleset;
pools[pool].object_hash = CEPH_STR_HASH_RJENKINS;
pools[pool].set_pg_num(poolbase << pg_bits);
pools[pool].set_pgp_num(poolbase << pgp_bits);
name_pool[*p] = pool;
}
- stringstream ss;
- int r;
- if (nosd >= 0)
- r = build_simple_crush_map(cct, *crush, nosd, &ss);
- else
- r = build_simple_crush_map_from_conf(cct, *crush, &ss);
-
if (r < 0)
lderr(cct) << ss.str() << dendl;
osdmaptool: osdmap file 'myosdmap'
default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 0
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 0
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 0
$ osdmaptool --print myosdmap | grep 'pool 0'
osdmaptool: osdmap file 'myosdmap'
pool 0 'data' replicated size 3 min_size 2 crush_ruleset 55 object_hash rjenkins pg_num 192 pgp_num 192 last_change 0 flags hashpspool crash_replay_interval 45 stripe_width 0
osdmaptool: osdmap file 'myosdmap'
default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 66
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 66
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 66
$ osdmaptool --print myosdmap | grep 'pool 0'
osdmaptool: osdmap file 'myosdmap'
pool 0 'data' replicated size 3 min_size 2 crush_ruleset 55 object_hash rjenkins pg_num 192 pgp_num 192 last_change 0 flags hashpspool crash_replay_interval 45 stripe_width 0
osdmaptool: osdmap file 'om'
default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 0
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 0
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 0
$ osdmaptool --print om | grep 'pool 0'
osdmaptool: osdmap file 'om'
pool 0 'data' replicated size 3 min_size 2 crush_ruleset 55 object_hash rjenkins pg_num 15296 pgp_num 15296 last_change 0 flags hashpspool crash_replay_interval 45 stripe_width 0
osdmaptool: osdmap file 'om'
default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 66
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 66
- default_crush_rule is deprecated use osd_pool_default_crush_replicated_ruleset instead
- default_crush_rule = 55 overrides osd_pool_default_crush_replicated_ruleset = 66
$ osdmaptool --print om | grep 'pool 0'
osdmaptool: osdmap file 'om'
pool 0 'data' replicated size 3 min_size 2 crush_ruleset 55 object_hash rjenkins pg_num 15296 pgp_num 15296 last_change 0 flags hashpspool crash_replay_interval 45 stripe_width 0