]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: osd crush set-device-class
authorLoic Dachary <ldachary@redhat.com>
Sun, 19 Mar 2017 09:06:50 +0000 (10:06 +0100)
committerLoic Dachary <ldachary@redhat.com>
Wed, 5 Apr 2017 07:22:24 +0000 (09:22 +0200)
Signed-off-by: Loic Dachary <loic@dachary.org>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/test/crush/crush-classes.sh

index 6e0e70ddecfa1562b9b5ada4c2524ed9db910799..2561fce117f1f58d1f4d23530732559fbe673408 100644 (file)
@@ -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 <name> with <weight> and location <args>", \
        "osd", "rw", "cli,rest")
+COMMAND("osd crush set-device-class " \
+       "name=id,type=CephOsdName " \
+       "name=class,type=CephString ", \
+       "set the <class> of the device <name>", \
+       "osd", "rw", "cli,rest")
 COMMAND("osd crush create-or-move " \
        "name=id,type=CephOsdName " \
        "name=weight,type=CephFloat,range=0.0 " \
index 6fa5e8de4be7fa52bfd0770c8a5666d13d081aff..a9339f0c74415bdbe02ccb7d1ddafac7eb34fd76 100644 (file)
@@ -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 <name> <type>
     string name, typestr;
index b7762eb7372e1f787e007a0fdb5afde937a1368d..bf06f33d34465cf2e67df3da434f82d6311a7973 100755 (executable)
@@ -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: