From f94d6b449a43b576a1df5ce346d937cdddaf63b1 Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Sun, 19 Mar 2017 10:06:50 +0100 Subject: [PATCH] mon: osd crush set-device-class Signed-off-by: Loic Dachary --- src/mon/MonCommands.h | 5 ++++ src/mon/OSDMonitor.cc | 46 +++++++++++++++++++++++++++++++++ src/test/crush/crush-classes.sh | 22 ++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 6e0e70ddecf..2561fce117f 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -500,6 +500,11 @@ COMMAND("osd crush add " \ "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]", \ "add or update crushmap position and weight for with and location ", \ "osd", "rw", "cli,rest") +COMMAND("osd crush set-device-class " \ + "name=id,type=CephOsdName " \ + "name=class,type=CephString ", \ + "set the of the device ", \ + "osd", "rw", "cli,rest") COMMAND("osd crush create-or-move " \ "name=id,type=CephOsdName " \ "name=weight,type=CephFloat,range=0.0 " \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 6fa5e8de4be..a9339f0c744 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -6286,6 +6286,52 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, pending_inc.crush = data; ss << "set crush map"; goto update; + + } else if (prefix == "osd crush set-device-class") { + if (!osdmap.exists(osdid)) { + err = -ENOENT; + ss << name << " does not exist. create it before updating the crush map"; + goto reply; + } + + string device_class; + if (!cmd_getval(g_ceph_context, cmdmap, "class", device_class)) { + err = -EINVAL; // no value! + goto reply; + } + + if (!_get_stable_crush().item_exists(osdid)) { + err = -ENOENT; + ss << "unable to set-device-class for item id " << osdid << " name '" << name + << "' device_class " << device_class << ": does not exist"; + goto reply; + } + + dout(5) << "updating crush item id " << osdid << " name '" + << name << "' device_class " << device_class << dendl; + CrushWrapper newcrush; + _get_pending_crush(newcrush); + + err = newcrush.update_device_class(g_ceph_context, osdid, device_class, name); + + if (err < 0) + goto reply; + + if (err == 0 && !_have_pending_crush()) { + ss << "set-device-class item id " << osdid << " name '" << name << "' device_class " + << device_class << " : no change"; + goto reply; + } + + pending_inc.crush.clear(); + newcrush.encode(pending_inc.crush, mon->get_quorum_con_features()); + ss << "set-device-class item id " << osdid << " name '" << name << "' device_class " + << device_class; + getline(ss, rs); + wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs, + get_last_committed() + 1)); + return true; + } else if (prefix == "osd crush add-bucket") { // os crush add-bucket string name, typestr; diff --git a/src/test/crush/crush-classes.sh b/src/test/crush/crush-classes.sh index b7762eb7372..bf06f33d344 100755 --- a/src/test/crush/crush-classes.sh +++ b/src/test/crush/crush-classes.sh @@ -106,6 +106,28 @@ function TEST_classes() { ceph osd crush dump | grep -q '~ssd' || return 1 } +function TEST_set_device_class() { + local dir=$1 + + TEST_classes $dir || return 1 + + ceph osd crush set-device-class osd.0 ssd || return 1 + ceph osd crush set-device-class osd.1 ssd || return 1 + + ok=false + for delay in 2 4 8 16 32 64 128 256 ; do + if test "$(get_osds_up rbd SOMETHING_ELSE)" == "0 1" ; then + ok=true + break + fi + sleep $delay + ceph osd crush dump + ceph osd dump # for debugging purposes + ceph pg dump # for debugging purposes + done + $ok || return 1 +} + main crush-classes "$@" # Local Variables: -- 2.47.3