]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-disk,osd: add support for crush device classes 14436/head
authorLoic Dachary <ldachary@redhat.com>
Mon, 10 Apr 2017 20:52:35 +0000 (22:52 +0200)
committerLoic Dachary <ldachary@redhat.com>
Tue, 11 Apr 2017 15:06:57 +0000 (17:06 +0200)
Fixes: http://tracker.ceph.com/issues/19513
Signed-off-by: Loic Dachary <loic@dachary.org>
src/ceph-disk/ceph_disk/main.py
src/ceph-disk/tests/ceph-disk.sh
src/osd/OSD.cc
src/osd/OSD.h

index 9837649ef8699c33857a26ada875e6168db07dd7..f3b669a94bdb4210ed5e49550ad77f907c72150f 100755 (executable)
@@ -1921,6 +1921,10 @@ class Prepare(object):
             metavar='UUID',
             help='unique OSD uuid to assign this disk to',
         )
+        parser.add_argument(
+            '--crush-device-class',
+            help='crush device class to assign this disk to',
+        )
         parser.add_argument(
             '--dmcrypt',
             action='store_true', default=None,
@@ -2788,6 +2792,9 @@ class PrepareData(object):
 
         write_one_line(path, 'ceph_fsid', self.args.cluster_uuid)
         write_one_line(path, 'fsid', self.args.osd_uuid)
+        if self.args.crush_device_class:
+            write_one_line(path, 'crush_device_class',
+                           self.args.crush_device_class)
         write_one_line(path, 'magic', CEPH_OSD_ONDISK_MAGIC)
 
         for to_prepare in to_prepare_list:
index 454ec444151ff0c4ae162aa3de9fc6c851b602a7..ae216bc102de7777176cb1682fd8a3fe640d44aa 100755 (executable)
@@ -362,6 +362,47 @@ function test_ceph_osd_mkfs() {
     [ -f $dir/used-ceph-osd ] || return 1
 }
 
+function test_crush_device_class() {
+    local dir=$1
+    shift
+
+    run_mon $dir a
+
+    local osd_data=$dir/dir
+    $mkdir -p $osd_data
+
+    local osd_uuid=$($uuidgen)
+
+    $mkdir -p $osd_data
+
+    ${CEPH_DISK} $CEPH_DISK_ARGS \
+        prepare --osd-uuid $osd_uuid \
+                --crush-device-class CRUSH_CLASS \
+                $osd_data || return 1
+    test -f $osd_data/crush_device_class || return 1
+    test $(cat $osd_data/crush_device_class) = CRUSH_CLASS || return 1
+
+    ceph osd crush class create CRUSH_CLASS || return 1
+
+    CEPH_ARGS="--crush-location=root=default $CEPH_ARGS" \
+      ${CEPH_DISK} $CEPH_DISK_ARGS \
+        --verbose \
+        activate \
+        --mark-init=none \
+        $osd_data || return 1
+
+    ok=false
+    for delay in 2 4 8 16 32 64 128 256 ; do
+        if ceph osd crush dump | grep --quiet 'CRUSH_CLASS' ; then
+            ok=true
+            break
+        fi
+        sleep $delay
+        ceph osd crush dump # for debugging purposes
+    done
+    $ok || return 1
+}
+
 function run() {
     local dir=$1
     shift
@@ -402,6 +443,7 @@ function run() {
     [ `uname` != FreeBSD ] && \
       default_actions+="test_activate_dir_bluestore "
     default_actions+="test_ceph_osd_mkfs "
+    default_actions+="test_crush_device_class "
     local actions=${@:-$default_actions}
     for action in $actions  ; do
         setup $dir || return 1
index ea67e40f8433ef01a719f746a83c04e8dab32539..bdc2878d785ca1db5835cbaaff71cfd2fb54d7d1 100644 (file)
@@ -2382,6 +2382,12 @@ int OSD::init()
     }
   }
 
+  r = update_crush_device_class();
+  if (r < 0) {
+    osd_lock.Lock();
+    goto monout;
+  }
+
   r = update_crush_location();
   if (r < 0) {
     osd_lock.Lock();
@@ -3100,6 +3106,20 @@ int OSD::update_crush_location()
   return mon_cmd_maybe_osd_create(cmd);
 }
 
+int OSD::update_crush_device_class()
+{
+  string device_class;
+  int r = store->read_meta("crush_device_class", &device_class);
+  if (r < 0)
+    return 0;
+
+  string cmd =
+    string("{\"prefix\": \"osd crush set-device-class\", ") +
+    string("\"id\": ") + stringify(whoami) + string(", ") +
+    string("\"class\": \"") + device_class + string("\"}");
+
+  return mon_cmd_maybe_osd_create(cmd);
+}
 
 void OSD::write_superblock(ObjectStore::Transaction& t)
 {
index 90821997caa26c55e7a944747999071f5d75b48f..71db4878d91d0b3891994bff9f85f65587c12712 100644 (file)
@@ -2415,6 +2415,7 @@ protected:
 
 private:
   int mon_cmd_maybe_osd_create(string &cmd);
+  int update_crush_device_class();
   int update_crush_location();
 
   static int write_meta(ObjectStore *store,