From 70263dae676c8def71855027d606a7d36d0f015f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 13 Jul 2017 17:46:15 -0400 Subject: [PATCH] mon: 'osd crush weight-set {ls,dump,create[-compat],rm[-compat],reweight[-compat]}' commands Signed-off-by: Sage Weil --- qa/workunits/mon/crush_ops.sh | 27 +++++++ src/mon/MonCommands.h | 31 +++++++ src/mon/OSDMonitor.cc | 147 +++++++++++++++++++++++++++++++++- 3 files changed, 204 insertions(+), 1 deletion(-) diff --git a/qa/workunits/mon/crush_ops.sh b/qa/workunits/mon/crush_ops.sh index f28b48d9e75..63d57197690 100755 --- a/qa/workunits/mon/crush_ops.sh +++ b/qa/workunits/mon/crush_ops.sh @@ -125,4 +125,31 @@ ceph osd crush rm osd.$o5 ceph osd rm osd.$o4 ceph osd rm osd.$o5 +# weight sets +ceph osd crush weight-set dump +ceph osd crush weight-set ls +expect_false ceph osd crush weight-set reweight fooset osd.0 .9 +ceph osd pool create fooset 8 +ceph osd pool create barset 8 +ceph osd pool set barset size 3 +expect_false ceph osd crush weight-set reweight fooset osd.0 .9 +ceph osd crush weight-set create fooset flat +ceph osd crush weight-set create barset positional +ceph osd crush weight-set ls | grep fooset +ceph osd crush weight-set ls | grep barset +ceph osd crush weight-set dump +ceph osd crush weight-set reweight fooset osd.0 .9 +expect_false ceph osd crush weight-set reweight fooset osd.0 .9 .9 +expect_false ceph osd crush weight-set reweight barset osd.0 .9 +ceph osd crush weight-set reweight barset osd.0 .9 .9 .9 +ceph osd crush weight-set ls | grep -c fooset | grep -q 1 +ceph osd crush weight-set rm fooset +ceph osd crush weight-set ls | grep -c fooset | grep -q 0 +ceph osd crush weight-set ls | grep barset +ceph osd crush weight-set rm barset +ceph osd crush weight-set ls | grep -c barset | grep -q 0 +ceph osd crush weight-set create-compat +ceph osd crush weight-set ls | grep '(compat)' +ceph osd crush weight-set rm-compat + echo OK diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index a9055041e6c..1f157cead53 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -651,6 +651,37 @@ COMMAND("osd crush class ls-osd " \ "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \ "list all osds belonging to the specific ", \ "osd", "r", "cli,rest") +COMMAND("osd crush weight-set ls", + "list crush weight sets", + "osd", "r", "cli,rest") +COMMAND("osd crush weight-set dump", + "dump crush weight sets", + "osd", "r", "cli,rest") +COMMAND("osd crush weight-set create-compat", + "create a default backward-compatible weight-set", + "osd", "rw", "cli,rest") +COMMAND("osd crush weight-set create " \ + "name=pool,type=CephPoolname "\ + "name=mode,type=CephChoices,strings=flat|positional", + "create a weight-set for a given pool", + "osd", "rw", "cli,rest") +COMMAND("osd crush weight-set rm name=pool,type=CephPoolname", + "remove the weight-set for a given pool", + "osd", "rw", "cli,rest") +COMMAND("osd crush weight-set rm-compat", + "remove the backward-compatible weight-set", + "osd", "rw", "cli,rest") +COMMAND("osd crush weight-set reweight " \ + "name=pool,type=CephPoolname " \ + "name=item,type=CephString " \ + "name=weight,type=CephFloat,range=0.0,n=N", + "set weight for an item (bucket or osd) in a pool's weight-set", + "osd", "rw", "cli,rest") +COMMAND("osd crush weight-set reweight-compat " \ + "name=item,type=CephString " \ + "name=weight,type=CephFloat,range=0.0,n=N", + "set weight for an item (bucket or osd) in the backward-compatible weight-set", + "osd", "rw", "cli,rest") COMMAND("osd setmaxosd " \ "name=newmax,type=CephInt,range=0", \ "set new maximum osd value", "osd", "rw", "cli,rest") diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 0fdfaa823b7..bd0acbed962 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -5123,6 +5123,37 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) rs << "\n"; rdata.append(rs.str()); } + } else if (prefix == "osd crush weight-set ls") { + boost::scoped_ptr f(Formatter::create(format)); + if (f) { + f->open_array_section("weight_sets"); + if (osdmap.crush->have_choose_args(CrushWrapper::DEFAULT_CHOOSE_ARGS)) { + f->dump_string("pool", "(compat)"); + } + for (auto& i : osdmap.crush->choose_args) { + if (i.first >= 0) { + f->dump_string("pool", osdmap.get_pool_name(i.first)); + } + } + f->close_section(); + f->flush(rdata); + } else { + ostringstream rs; + if (osdmap.crush->have_choose_args(CrushWrapper::DEFAULT_CHOOSE_ARGS)) { + rs << "(compat)\n"; + } + for (auto& i : osdmap.crush->choose_args) { + if (i.first >= 0) { + rs << osdmap.get_pool_name(i.first) << "\n"; + } + } + rdata.append(rs.str()); + } + } else if (prefix == "osd crush weight-set dump") { + boost::scoped_ptr f(Formatter::create(format, "json-pretty", + "json-pretty")); + osdmap.crush->dump_choose_args(f.get()); + f->flush(rdata); } else if (prefix == "osd erasure-code-profile get") { string name; cmd_getval(g_ceph_context, cmdmap, "name", name); @@ -7595,7 +7626,121 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, newcrush.encode(pending_inc.crush, mon->get_quorum_con_features()); ss << "rename class '" << srcname << "' to '" << dstname << "'"; goto update; - + + } else if (prefix == "osd crush weight-set create" || + prefix == "osd crush weight-set create-compat") { + CrushWrapper newcrush; + _get_pending_crush(newcrush); + int64_t pool; + int positions; + if (newcrush.has_non_straw2_buckets()) { + ss << "crush map contains one or more bucket(s) that are not straw2"; + err = -EPERM; + goto reply; + } + if (prefix == "osd crush weight-set create") { + if (osdmap.require_min_compat_client > 0 && + osdmap.require_min_compat_client < CEPH_RELEASE_LUMINOUS) { + ss << "require_min_compat_client " + << ceph_release_name(osdmap.require_min_compat_client) + << " < luminous, which is required for per-pool weight-sets"; + err = -EPERM; + goto reply; + } + string poolname, mode; + cmd_getval(g_ceph_context, cmdmap, "pool", poolname); + pool = osdmap.lookup_pg_pool_name(poolname.c_str()); + if (pool < 0) { + ss << "pool '" << poolname << "' not found"; + err = -ENOENT; + goto reply; + } + cmd_getval(g_ceph_context, cmdmap, "mode", mode); + if (mode != "flat" && mode != "positional") { + ss << "unrecognized weight-set mode '" << mode << "'"; + err = -EINVAL; + goto reply; + } + positions = mode == "flat" ? 1 : osdmap.get_pg_pool(pool)->get_size(); + } else { + pool = CrushWrapper::DEFAULT_CHOOSE_ARGS; + positions = 1; + } + newcrush.create_choose_args(pool, positions); + pending_inc.crush.clear(); + newcrush.encode(pending_inc.crush, mon->get_quorum_con_features()); + goto update; + + } else if (prefix == "osd crush weight-set rm" || + prefix == "osd crush weight-set rm-compat") { + CrushWrapper newcrush; + _get_pending_crush(newcrush); + int64_t pool; + if (prefix == "osd crush weight-set rm") { + string poolname; + cmd_getval(g_ceph_context, cmdmap, "pool", poolname); + pool = osdmap.lookup_pg_pool_name(poolname.c_str()); + if (pool < 0) { + ss << "pool '" << poolname << "' not found"; + err = -ENOENT; + goto reply; + } + } else { + pool = CrushWrapper::DEFAULT_CHOOSE_ARGS; + } + newcrush.rm_choose_args(pool); + pending_inc.crush.clear(); + newcrush.encode(pending_inc.crush, mon->get_quorum_con_features()); + goto update; + + } else if (prefix == "osd crush weight-set reweight" || + prefix == "osd crush weight-set reweight-compat") { + string poolname, item; + vector weight; + cmd_getval(g_ceph_context, cmdmap, "pool", poolname); + cmd_getval(g_ceph_context, cmdmap, "item", item); + cmd_getval(g_ceph_context, cmdmap, "weight", weight); + CrushWrapper newcrush; + _get_pending_crush(newcrush); + int64_t pool; + if (prefix == "osd crush weight-set reweight") { + pool = osdmap.lookup_pg_pool_name(poolname.c_str()); + if (pool < 0) { + ss << "pool '" << poolname << "' not found"; + err = -ENOENT; + goto reply; + } + if (!newcrush.have_choose_args(pool)) { + ss << "no weight-set for pool '" << poolname << "'"; + err = -ENOENT; + goto reply; + } + } else { + pool = CrushWrapper::DEFAULT_CHOOSE_ARGS; + if (!newcrush.have_choose_args(pool)) { + ss << "no backward-compatible weight-set"; + err = -ENOENT; + goto reply; + } + } + if (!newcrush.name_exists(item)) { + ss << "item '" << item << "' does not exist"; + err = -ENOENT; + goto reply; + } + err = newcrush.choose_args_adjust_item_weightf( + g_ceph_context, + newcrush.choose_args_get(pool), + newcrush.get_item_id(item), + weight, + &ss); + if (err < 0) { + goto reply; + } + err = 0; + pending_inc.crush.clear(); + newcrush.encode(pending_inc.crush, mon->get_quorum_con_features()); + goto update; } else if (osdid_present && (prefix == "osd crush set" || prefix == "osd crush add")) { // is 'osd.' or '', passed as int64_t id -- 2.39.5