* The deprecated 'crush_ruleset' property has finally been removed; please use
'crush_rule' instead for the 'osd pool get ...' and 'osd pool set ..' commands.
+
+* The 'osd pool default crush replicated ruleset' option has been
+ removed and replaced by the 'osd pool default crush rule' option.
+ By default it is -1, which means the mon will pick the first type
+ replicated rule in the CRUSH map for replicated pools. Erasure
+ coded pools have rules that are automatically created for them if they are
+ not specified at pool creation time.
#include "log/SubsystemMap.h"
#include "common/config_obs.h"
-enum {
- CEPH_DEFAULT_CRUSH_REPLICATED_RULESET,
- CEPH_DEFAULT_CRUSH_ERASURE_RULESET,
-};
-
#define OSD_REP_PRIMARY 0
#define OSD_REP_SPLAY 1
#define OSD_REP_CHAIN 2
OPTION(osd_pool_use_gmt_hitset, OPT_BOOL, true) // try to use gmt for hitset archive names if all osds in cluster support it.
OPTION(osd_crush_update_on_start, OPT_BOOL, true)
OPTION(osd_crush_initial_weight, OPT_DOUBLE, -1) // if >=0, the initial weight is for newly added osds.
-OPTION(osd_pool_default_crush_rule, OPT_INT, -1) // deprecated for osd_pool_default_crush_replicated_ruleset
-OPTION(osd_pool_default_crush_replicated_ruleset, OPT_INT, CEPH_DEFAULT_CRUSH_REPLICATED_RULESET)
+OPTION(osd_pool_default_crush_rule, OPT_INT, -1)
OPTION(osd_pool_erasure_code_stripe_unit, OPT_U32, 4096) // in bytes
OPTION(osd_pool_default_size, OPT_INT, 3)
OPTION(osd_pool_default_min_size, OPT_INT, 0) // 0 means no specific default; ceph will use size-size/2
// fixme
}
-int CrushWrapper::_get_osd_pool_default_crush_replicated_ruleset(CephContext *cct,
- bool quiet)
-{
- 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;
- ldout(cct, 0) << "osd_pool_default_crush_rule = "
- << cct->_conf-> osd_pool_default_crush_rule << " overrides "
- << "osd_pool_default_crush_replicated_ruleset = "
- << cct->_conf->osd_pool_default_crush_replicated_ruleset
- << dendl;
- }
-
- return crush_ruleset;
-}
-
/**
* Determine the default CRUSH ruleset ID to be used with
* newly created replicated pools.
*/
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) {
+ int crush_ruleset = cct->_conf->osd_pool_default_crush_rule;
+ if (crush_ruleset < 0) {
crush_ruleset = find_first_ruleset(pg_pool_t::TYPE_REPLICATED);
} else if (!ruleset_exists(crush_ruleset)) {
crush_ruleset = -1; // match find_first_ruleset() retval
}
-
return crush_ruleset;
}
void dump_tree(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);
+ int crush_ruleset = crush.get_osd_pool_default_crush_replicated_ruleset(cct);
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_at("replicated_ruleset", root, failure_domain,
"firstn", pg_pool_t::TYPE_REPLICATED,
from restful.decorators import auth
-class CrushRuleset(RestController):
- @expose(template='json')
- @auth
- def get(self, **kwargs):
- """
- Show crush rulesets
- """
- rules = module.instance.get('osd_map_crush')['rules']
- nodes = module.instance.get('osd_map_tree')['nodes']
-
- ruleset = defaultdict(list)
- for rule in rules:
- rule['osd_count'] = len(common.crush_rule_osds(nodes, rule))
- ruleset[rule['ruleset']].append(rule)
-
- return ruleset
-
-
-
class CrushRule(RestController):
@expose(template='json')
@auth
return rules
-
-
class Crush(RestController):
rule = CrushRule()
- ruleset = CrushRuleset()
# Valid values for the 'var' argument to 'ceph osd pool set'
POOL_PROPERTIES_1 = [
'size', 'min_size', 'crash_replay_interval', 'pg_num',
- 'crush_ruleset', 'hashpspool',
+ 'crush_rule', 'hashpspool',
]
POOL_PROPERTIES_2 = [
osds_by_pool = {}
for pool_id, pool in pools.items():
pool_osds = None
- for rule in [r for r in crush_rules if r['ruleset'] == pool['crush_ruleset']]:
+ for rule in [r for r in crush_rules if r['rule_id'] == pool['crush_rule']]:
if rule['min_size'] <= pool['size'] <= rule['max_size']:
pool_osds = common.crush_rule_osds(self.get('osd_map_tree')['nodes'], rule)
done
}
-function TEST_default_deprectated_0() {
- local dir=$1
- # explicitly set the default crush rule
- local expected=66
- 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
-}
-
-function TEST_default_deprectated_1() {
- local dir=$1
- # explicitly set the default crush rule using deprecated option
- local expected=55
- 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
-}
-
-function TEST_default_deprectated_2() {
- local dir=$1
- local expected=77
- local unexpected=33
- run_mon $dir a \
- --osd_pool_default_crush_rule $expected \
- --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
-}
-
# Before http://tracker.ceph.com/issues/8307 the invalid profile was created
function TEST_erasure_invalid_profile() {
local dir=$1
grep "doesn't exist" || return 1
}
-function TEST_replicated_pool_with_non_existent_default_ruleset_0() {
- local dir=$1
- run_mon $dir a || return 1
- # change the default crush rule
- ceph tell mon.a injectargs -- \
- --osd_pool_default_crush_replicated_ruleset 66 || return 1
- ceph osd pool create mypool 12 12 replicated 2>&1 | \
- grep "No suitable CRUSH rule exists" || 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
-}
-
-function TEST_replicated_pool_with_non_existent_default_ruleset_1() {
- local dir=$1
- run_mon $dir a || return 1
- # change the default crush rule using deprecated option
- ceph tell mon.a injectargs -- \
- --osd_pool_default_crush_rule 55 || return 1
- ceph osd pool create mypool 12 12 replicated 2>&1 | \
- grep "No suitable CRUSH rule exists" || 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
-}
-
-function TEST_replicated_pool_with_non_existent_default_ruleset_2() {
- local dir=$1
- run_mon $dir a || return 1
- ceph tell mon.a injectargs -- \
- --osd_pool_default_crush_rule 77 \
- --osd_pool_default_crush_replicated_ruleset 33 || return 1
- ceph osd pool create mypool 12 12 replicated 2>&1 | \
- grep "No suitable CRUSH rule exists" || 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
-}
-
function TEST_erasure_code_pool_lrc() {
local dir=$1
run_mon $dir a || return 1