From cf8b5e33940cba21f662acedb33ecd20f1daadd6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 1 Feb 2017 20:31:01 -0500 Subject: [PATCH] osd/OSDMap: add REQUIRE_LUMINOUS flag Signed-off-by: Sage Weil --- src/include/rados.h | 1 + src/mon/MonCommands.h | 2 +- src/mon/OSDMonitor.cc | 42 ++++++++++++++++++++++++++++++++++++++++-- src/osd/OSDMap.cc | 2 ++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/include/rados.h b/src/include/rados.h index 291aa3a599a..c045c360a68 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -146,6 +146,7 @@ extern const char *ceph_osd_state_name(int s); #define CEPH_OSDMAP_SORTBITWISE (1<<15) /* use bitwise hobject_t sort */ #define CEPH_OSDMAP_REQUIRE_JEWEL (1<<16) /* require jewel for booting osds */ #define CEPH_OSDMAP_REQUIRE_KRAKEN (1<<17) /* require kraken for booting osds */ +#define CEPH_OSDMAP_REQUIRE_LUMINOUS (1<<18) /* require l for booting osds */ /* * The error code to return when an OSD can't handle a write diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index a2962c45e6f..e1136d1a10e 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -649,7 +649,7 @@ COMMAND("osd erasure-code-profile ls", \ "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", \ + "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", \ "set ", "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|sortbitwise", \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 585cd7bf0fc..2579859cde6 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -128,9 +128,10 @@ void OSDMonitor::create_initial() // new clusters should sort bitwise by default. newmap.set_flag(CEPH_OSDMAP_SORTBITWISE); - // new cluster should require jewel and kraken by default + // new cluster should require latest by default newmap.set_flag(CEPH_OSDMAP_REQUIRE_JEWEL); newmap.set_flag(CEPH_OSDMAP_REQUIRE_KRAKEN); + newmap.set_flag(CEPH_OSDMAP_REQUIRE_LUMINOUS); // encode into pending incremental newmap.encode(pending_inc.fullmap, @@ -1125,6 +1126,11 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t) tmp.apply_incremental(pending_inc); // determine appropriate features + if (!tmp.test_flag(CEPH_OSDMAP_REQUIRE_LUMINOUS)) { + dout(10) << __func__ << " encoding without feature SERVER_LUMINOUS" + << dendl; + features &= ~CEPH_FEATURE_SERVER_LUMINOUS; + } if (!tmp.test_flag(CEPH_OSDMAP_REQUIRE_JEWEL)) { dout(10) << __func__ << " encoding without feature SERVER_JEWEL" << dendl; features &= ~CEPH_FEATURE_SERVER_JEWEL; @@ -1923,6 +1929,16 @@ bool OSDMonitor::preprocess_boot(MonOpRequestRef op) goto ignore; } + if (osdmap.test_flag(CEPH_OSDMAP_REQUIRE_LUMINOUS) && + !HAVE_FEATURE(m->osd_features, SERVER_LUMINOUS)) { + mon->clog->info() << "disallowing boot of OSD " + << m->get_orig_source_inst() + << " because the osdmap requires" + << " CEPH_FEATURE_SERVER_LUMINOUS" + << " but the osd lacks CEPH_FEATURE_SERVER_LUMINOUS\n"; + goto ignore; + } + if (osdmap.test_flag(CEPH_OSDMAP_REQUIRE_JEWEL) && !(m->osd_features & CEPH_FEATURE_SERVER_JEWEL)) { mon->clog->info() << "disallowing boot of OSD " @@ -3012,7 +3028,15 @@ void OSDMonitor::get_health(list >& summary, } // warn about upgrade flags that can be set but are not. - if ((osdmap.get_up_osd_features() & CEPH_FEATURE_SERVER_KRAKEN) && + if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_LUMINOUS) && + !osdmap.test_flag(CEPH_OSDMAP_REQUIRE_LUMINOUS)) { + string msg = "all OSDs are running luminous or later but the" + " 'require_luminous_osds' osdmap flag is not set"; + summary.push_back(make_pair(HEALTH_WARN, msg)); + if (detail) { + detail->push_back(make_pair(HEALTH_WARN, msg)); + } + } else if ((osdmap.get_up_osd_features() & CEPH_FEATURE_SERVER_KRAKEN) && !osdmap.test_flag(CEPH_OSDMAP_REQUIRE_KRAKEN)) { string msg = "all OSDs are running kraken or later but the" " 'require_kraken_osds' osdmap flag is not set"; @@ -6480,6 +6504,20 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, 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; diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index e7040b89d3b..4b5cb986314 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2412,6 +2412,8 @@ string OSDMap::get_flag_string(unsigned f) s += ",require_jewel_osds"; if (f & CEPH_OSDMAP_REQUIRE_KRAKEN) s += ",require_kraken_osds"; + if (f & CEPH_OSDMAP_REQUIRE_LUMINOUS) + s += ",require_luminous_osds"; if (s.length()) s.erase(0, 1); return s; -- 2.47.3