From: Sage Weil Date: Fri, 28 Apr 2017 22:33:49 +0000 (-0400) Subject: crush: simplify osd_pool_default_crush_rule config X-Git-Tag: v12.1.0~27^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=80e3b7380388790a53d8442d3d477d46ce8466ed;p=ceph.git crush: simplify osd_pool_default_crush_rule config 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 --- diff --git a/PendingReleaseNotes b/PendingReleaseNotes index b4dba595d9a..6051ee609c6 100644 --- a/PendingReleaseNotes +++ b/PendingReleaseNotes @@ -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. diff --git a/src/common/config.h b/src/common/config.h index 4c970d24c72..0d32fb3b90c 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -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 diff --git a/src/common/config_opts.h b/src/common/config_opts.h index f8af42a6756..13add94e093 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -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 diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index c94fc6b97d6..192a0379157 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -2389,26 +2389,6 @@ void CrushWrapper::generate_test_instances(list& 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. @@ -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; } diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index 959682ec149..059362a60d8 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -1357,8 +1357,6 @@ public: void dump_tree(Formatter *f) const; static void generate_test_instances(list& 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); diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 23404bb864a..8f0dff9b868 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -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, diff --git a/src/pybind/mgr/restful/api/crush.py b/src/pybind/mgr/restful/api/crush.py index 046676a2815..11a04264da2 100644 --- a/src/pybind/mgr/restful/api/crush.py +++ b/src/pybind/mgr/restful/api/crush.py @@ -7,25 +7,6 @@ from collections import defaultdict 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 @@ -41,8 +22,5 @@ class CrushRule(RestController): return rules - - class Crush(RestController): rule = CrushRule() - ruleset = CrushRuleset() diff --git a/src/pybind/mgr/restful/common.py b/src/pybind/mgr/restful/common.py index 15a14ed9f47..dc8b39b6e6e 100644 --- a/src/pybind/mgr/restful/common.py +++ b/src/pybind/mgr/restful/common.py @@ -12,7 +12,7 @@ OSD_IMPLEMENTED_COMMANDS = [ # 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 = [ diff --git a/src/pybind/mgr/restful/module.py b/src/pybind/mgr/restful/module.py index 2759e96eddb..9d9d2db7a9f 100644 --- a/src/pybind/mgr/restful/module.py +++ b/src/pybind/mgr/restful/module.py @@ -419,7 +419,7 @@ class Module(MgrModule): 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) diff --git a/src/test/mon/osd-pool-create.sh b/src/test/mon/osd-pool-create.sh index cac15998abd..b879d9de0be 100755 --- a/src/test/mon/osd-pool-create.sh +++ b/src/test/mon/osd-pool-create.sh @@ -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 @@ -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