From: Loic Dachary Date: Sun, 19 Mar 2017 09:06:50 +0000 (+0100) Subject: mon: osd crush set-device-class X-Git-Tag: v12.0.2~126^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f94d6b449a43b576a1df5ce346d937cdddaf63b1;p=ceph.git mon: osd crush set-device-class Signed-off-by: Loic Dachary --- diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 6e0e70ddecfa..2561fce117f1 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 6fa5e8de4be7..a9339f0c7441 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 b7762eb7372e..bf06f33d3446 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: