From: Sage Weil Date: Thu, 2 Feb 2017 01:31:01 +0000 (-0500) Subject: osd/OSDMap: add REQUIRE_LUMINOUS flag X-Git-Tag: v12.0.1~467^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cf8b5e33940cba21f662acedb33ecd20f1daadd6;p=ceph.git osd/OSDMap: add REQUIRE_LUMINOUS flag Signed-off-by: Sage Weil --- diff --git a/src/include/rados.h b/src/include/rados.h index 291aa3a599ab..c045c360a68d 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 a2962c45e6f3..e1136d1a10eb 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 585cd7bf0fca..2579859cde65 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 e7040b89d3bd..4b5cb9863148 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;