Skip to content

Commit

Permalink
crush: simplify osd_pool_default_crush_rule config
Browse files Browse the repository at this point in the history
Make an incompat change here with a release note since
this only affects pool creation, a rare event, and folks
who have customized their configs (also rare).

Keep it simple: a config sets the default rule, or else we pick
the first TYPE_REPLICATED pool in the crush map.

Signed-off-by: Sage Weil <[email protected]>
  • Loading branch information
liewegas committed Jun 19, 2017
1 parent 6f1a594 commit 80e3b73
Show file tree
Hide file tree
Showing 10 changed files with 13 additions and 136 deletions.
7 changes: 7 additions & 0 deletions PendingReleaseNotes
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,10 @@

* 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.
5 changes: 0 additions & 5 deletions src/common/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,6 @@
#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
Expand Down
3 changes: 1 addition & 2 deletions src/common/config_opts.h
Original file line number Diff line number Diff line change
Expand Up @@ -690,8 +690,7 @@ OPTION(osd_crush_chooseleaf_type, OPT_INT, 1) // 1 = host
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
Expand Down
26 changes: 2 additions & 24 deletions src/crush/CrushWrapper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2389,26 +2389,6 @@ void CrushWrapper::generate_test_instances(list<CrushWrapper*>& o)
// 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.
Expand All @@ -2417,14 +2397,12 @@ int CrushWrapper::_get_osd_pool_default_crush_replicated_ruleset(CephContext *cc
*/
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;
}

Expand Down
2 changes: 0 additions & 2 deletions src/crush/CrushWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -1357,8 +1357,6 @@ class CrushWrapper {
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);
Expand Down
6 changes: 1 addition & 5 deletions src/osd/OSDMap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3459,14 +3459,10 @@ int OSDMap::build_simple_crush_rulesets(CephContext *cct,
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,
Expand Down
22 changes: 0 additions & 22 deletions src/pybind/mgr/restful/api/crush.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,6 @@
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
Expand All @@ -41,8 +22,5 @@ def get(self, **kwargs):

return rules



class Crush(RestController):
rule = CrushRule()
ruleset = CrushRuleset()
2 changes: 1 addition & 1 deletion src/pybind/mgr/restful/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# 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 = [
Expand Down
2 changes: 1 addition & 1 deletion src/pybind/mgr/restful/module.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ def get_osd_pools(self):
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)

Expand Down
74 changes: 0 additions & 74 deletions src/test/mon/osd-pool-create.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,44 +35,6 @@ function run() {
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
Expand Down Expand Up @@ -190,42 +152,6 @@ function TEST_replicated_pool_with_ruleset() {
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
Expand Down

0 comments on commit 80e3b73

Please sign in to comment.