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,
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:
[ -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
[ `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
}
}
+ r = update_crush_device_class();
+ if (r < 0) {
+ osd_lock.Lock();
+ goto monout;
+ }
+
r = update_crush_location();
if (r < 0) {
osd_lock.Lock();
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)
{
private:
int mon_cmd_maybe_osd_create(string &cmd);
+ int update_crush_device_class();
int update_crush_location();
static int write_meta(ObjectStore *store,