tasks:
- exec:
osd.0:
- - ceph osd set require_luminous_osds
+ - ceph osd require-osd-release luminous
- ceph osd set-require-min-compat-client luminous
- ceph.healthy:
overrides:
wait-for-healthy: false
- exec:
osd.0:
- - ceph osd set require_luminous_osds
+ - ceph osd require-osd-release luminous
- ceph osd set-require-min-compat-client luminous
- ceph.healthy:
overrides:
- full_sequential_finally:
- exec:
mon.a:
- - ceph osd set require_luminous_osds
+ - ceph osd require-osd-release luminous
# make sure osds have latest map
- rados -p rbd bench 5 write -b 4096
- ceph.healthy:
expect_false ceph osd unset sortbitwise # cannot be unset
expect_false ceph osd set bogus
expect_false ceph osd unset bogus
+ ceph osd require-osd-release luminous
+ # can't lower (or use new command for anything but jewel)
+ expect_false ceph osd require-osd-release jewel
+ # these are no-ops but should succeed.
ceph osd set require_jewel_osds
- expect_false ceph osd unset require_jewel_osds
ceph osd set require_kraken_osds
- expect_false ceph osd unset require_kraken_osds
+ expect_false ceph osd unset require_jewel_osds
ceph osd set noup
ceph osd down 0
CEPH_OSDMAP_REQUIRE_KRAKEN | \
CEPH_OSDMAP_REQUIRE_LUMINOUS | \
CEPH_OSDMAP_SORTBITWISE)
+#define CEPH_OSDMAP_LEGACY_REQUIRE_FLAGS (CEPH_OSDMAP_REQUIRE_JEWEL | \
+ CEPH_OSDMAP_REQUIRE_KRAKEN | \
+ CEPH_OSDMAP_REQUIRE_LUMINOUS)
/*
* major ceph release numbers
"list all erasure code profiles", \
"osd", "r", "cli,rest")
COMMAND("osd set " \
- "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|require_jewel_osds|require_kraken_osds|require_luminous_osds", \
+ "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|require_jewel_osds|require_kraken_osds", \
"set <key>", "osd", "rw", "cli,rest")
COMMAND("osd unset " \
"name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent", \
newmap.set_flag(CEPH_OSDMAP_SORTBITWISE);
// new cluster should require latest by default
- newmap.set_flag(CEPH_OSDMAP_REQUIRE_JEWEL);
- newmap.set_flag(CEPH_OSDMAP_REQUIRE_KRAKEN);
- if (!g_conf->mon_debug_no_require_luminous) {
- newmap.set_flag(CEPH_OSDMAP_REQUIRE_LUMINOUS);
+ if (g_conf->mon_debug_no_require_luminous) {
+ newmap.require_osd_release = CEPH_RELEASE_KRAKEN;
+ } else {
+ newmap.require_osd_release = CEPH_RELEASE_LUMINOUS;
newmap.full_ratio = g_conf->mon_osd_full_ratio;
if (newmap.full_ratio > 1.0) newmap.full_ratio /= 100;
newmap.backfillfull_ratio = g_conf->mon_osd_backfillfull_ratio;
} else {
ss << "not all up OSDs have OSD_BITWISE_HOBJ_SORT feature";
err = -EPERM;
+ goto reply;
}
} else if (key == "require_jewel_osds") {
if (!osdmap.test_flag(CEPH_OSDMAP_SORTBITWISE)) {
ss << "the sortbitwise flag must be set before require_jewel_osds";
err = -EPERM;
+ goto reply;
+ } else if (osdmap.require_osd_release >= CEPH_RELEASE_JEWEL) {
+ ss << "require_osd_release is already >= jewel";
+ err = 0;
+ goto reply;
} else if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_JEWEL)) {
return prepare_set_flag(op, CEPH_OSDMAP_REQUIRE_JEWEL);
} else {
if (!osdmap.test_flag(CEPH_OSDMAP_SORTBITWISE)) {
ss << "the sortbitwise flag must be set before require_kraken_osds";
err = -EPERM;
+ goto reply;
+ } else if (osdmap.require_osd_release >= CEPH_RELEASE_KRAKEN) {
+ ss << "require_osd_release is already >= kraken";
+ err = 0;
+ goto reply;
} else if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_KRAKEN)) {
bool r = prepare_set_flag(op, CEPH_OSDMAP_REQUIRE_KRAKEN);
// ensure JEWEL is also set
ss << "not all up OSDs have CEPH_FEATURE_SERVER_KRAKEN feature";
err = -EPERM;
}
- } else if (key == "require_luminous_osds") {
- if (!osdmap.test_flag(CEPH_OSDMAP_SORTBITWISE)) {
- ss << "the sortbitwise flag must be set before require_luminous_osds";
- err = -EPERM;
- } else if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_LUMINOUS)) {
- bool r = prepare_set_flag(op, CEPH_OSDMAP_REQUIRE_LUMINOUS);
- // ensure JEWEL and KRAKEN are also set
- pending_inc.new_flags |= CEPH_OSDMAP_REQUIRE_JEWEL;
- pending_inc.new_flags |= CEPH_OSDMAP_REQUIRE_KRAKEN;
- return r;
- } else {
- ss << "not all up OSDs have CEPH_FEATURE_SERVER_LUMINOUS feature";
- err = -EPERM;
- }
} else {
ss << "unrecognized flag '" << key << "'";
err = -EINVAL;
if (struct_v >= 6) {
::decode(new_require_osd_release, bl);
} else {
- new_require_osd_release = -1;
+ if (new_flags >= 0 && (new_flags & CEPH_OSDMAP_REQUIRE_LUMINOUS)) {
+ // only for compat with post-kraken pre-luminous test clusters
+ new_require_osd_release = CEPH_RELEASE_LUMINOUS;
+ new_flags &= ~(CEPH_OSDMAP_LEGACY_REQUIRE_FLAGS);
+ } else if (new_flags >= 0 && (new_flags & CEPH_OSDMAP_REQUIRE_KRAKEN)) {
+ new_require_osd_release = CEPH_RELEASE_KRAKEN;
+ } else if (new_flags >= 0 && (new_flags & CEPH_OSDMAP_REQUIRE_JEWEL)) {
+ new_require_osd_release = CEPH_RELEASE_JEWEL;
+ } else {
+ new_require_osd_release = -1;
+ }
}
DECODE_FINISH(bl); // osd-only data
}
}
// nope, incremental.
- if (inc.new_flags >= 0)
+ if (inc.new_flags >= 0) {
flags = inc.new_flags;
+ // the below is just to cover a newly-upgraded luminous mon
+ // cluster that has to set require_jewel_osds or
+ // require_kraken_osds before the osds can be upgraded to
+ // luminous.
+ if (flags & CEPH_OSDMAP_REQUIRE_KRAKEN) {
+ if (require_osd_release < CEPH_RELEASE_KRAKEN) {
+ require_osd_release = CEPH_RELEASE_KRAKEN;
+ }
+ } else if (flags & CEPH_OSDMAP_REQUIRE_JEWEL) {
+ if (require_osd_release < CEPH_RELEASE_JEWEL) {
+ require_osd_release = CEPH_RELEASE_JEWEL;
+ }
+ }
+ }
if (inc.new_max_osd >= 0)
set_max_osd(inc.new_max_osd);
}
if (inc.new_require_osd_release >= 0) {
require_osd_release = inc.new_require_osd_release;
+ if (require_osd_release >= CEPH_RELEASE_LUMINOUS) {
+ flags &= ~(CEPH_OSDMAP_LEGACY_REQUIRE_FLAGS);
+ }
}
// do new crush map last (after up/down stuff)
{
uint8_t v = 4;
- if (!HAVE_FEATURE(features, OSDMAP_PG_UPMAP)) {
+ if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
v = 3;
}
ENCODE_START(v, 1, bl); // client-usable data
::encode(pool_name, bl);
::encode(pool_max, bl);
- ::encode(flags, bl);
+ if (v < 4) {
+ decltype(flags) f = flags;
+ if (require_osd_release >= CEPH_RELEASE_LUMINOUS)
+ f |= CEPH_OSDMAP_REQUIRE_LUMINOUS;
+ else if (require_osd_release == CEPH_RELEASE_KRAKEN)
+ f |= CEPH_OSDMAP_REQUIRE_KRAKEN;
+ else if (require_osd_release == CEPH_RELEASE_JEWEL)
+ f |= CEPH_OSDMAP_REQUIRE_JEWEL;
+ ::encode(f, bl);
+ } else {
+ ::encode(flags, bl);
+ }
::encode(max_osd, bl);
::encode(osd_state, bl);
}
if (struct_v >= 5) {
::decode(require_osd_release, bl);
+ if (require_osd_release >= CEPH_RELEASE_LUMINOUS) {
+ flags &= ~(CEPH_OSDMAP_LEGACY_REQUIRE_FLAGS);
+ }
} else {
- require_osd_release = -1;
+ if (flags & CEPH_OSDMAP_REQUIRE_LUMINOUS) {
+ // only for compat with post-kraken pre-luminous test clusters
+ require_osd_release = CEPH_RELEASE_LUMINOUS;
+ flags &= ~(CEPH_OSDMAP_LEGACY_REQUIRE_FLAGS);
+ } else if (flags & CEPH_OSDMAP_REQUIRE_KRAKEN) {
+ require_osd_release = CEPH_RELEASE_KRAKEN;
+ } else if (flags & CEPH_OSDMAP_REQUIRE_JEWEL) {
+ require_osd_release = CEPH_RELEASE_JEWEL;
+ } else {
+ require_osd_release = 0;
+ }
}
DECODE_FINISH(bl); // osd-only data
}
/// min compat client we want to support
string require_min_compat_client;
+public:
/// require osds to run at least this release
uint8_t require_osd_release = 0;
+private:
mutable uint64_t cached_up_osd_features;
mutable bool crc_defined;