]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: add initial NAUTILUS feature/compatset bits
authorSage Weil <sage@redhat.com>
Thu, 10 May 2018 18:25:14 +0000 (13:25 -0500)
committerSage Weil <sage@redhat.com>
Thu, 24 May 2018 13:22:14 +0000 (08:22 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/options.cc
src/include/ceph_features.h
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/OSDMonitor.cc
src/mon/mon_types.h

index 5768f2755909e234e26864ce4cb3df1953b0a4ee..95533d6469a6187190445179d5c441b297bb8dc3 100644 (file)
@@ -1678,6 +1678,11 @@ std::vector<Option> get_global_options() {
     .set_flag(Option::FLAG_CLUSTER_CREATE)
     .set_description(""),
 
+    Option("mon_debug_no_require_nautilus", Option::TYPE_BOOL, Option::LEVEL_DEV)
+    .set_default(false)
+    .set_flag(Option::FLAG_CLUSTER_CREATE)
+    .set_description(""),
+
     Option("mon_debug_no_require_bluestore_for_ec_overwrites", Option::TYPE_BOOL, Option::LEVEL_DEV)
     .set_default(false)
     .set_description(""),
index a90a9b7a78a7dba8ea74f6ffe50aa3638522aa82..8c1945f0bb2842428d821018b2da2eeeb9fc2d9d 100644 (file)
@@ -232,6 +232,7 @@ DEFINE_CEPH_FEATURE_DEPRECATED(63, 1, RESERVED_BROKEN, LUMINOUS) // client-facin
         CEPH_FEATURE_OSD_RECOVERY_DELETES |    \
         CEPH_FEATURE_SERVER_MIMIC |            \
         CEPH_FEATURE_RECOVERY_RESERVATION_2 |  \
+        CEPH_FEATURE_SERVER_NAUTILUS |         \
         0ULL)
 
 #define CEPH_FEATURES_SUPPORTED_DEFAULT  CEPH_FEATURES_ALL
index d1c84eaf2b57659cb000a2787dd64ff65ec47a83..2a8df86004e1f8861b4cfccd07c83d523786c141 100644 (file)
@@ -388,6 +388,7 @@ CompatSet Monitor::get_supported_features()
   compat.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_KRAKEN);
   compat.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_LUMINOUS);
   compat.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_MIMIC);
+  compat.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_NAUTILUS);
   return compat;
 }
 
@@ -2178,6 +2179,13 @@ void Monitor::apply_monmap_to_compatset_features()
     assert(HAVE_FEATURE(quorum_con_features, SERVER_MIMIC));
     new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_MIMIC);
   }
+  if (monmap_features.contains_all(ceph::features::mon::FEATURE_NAUTILUS)) {
+    assert(ceph::features::mon::get_persistent().contains_all(
+           ceph::features::mon::FEATURE_NAUTILUS));
+    // this feature should only ever be set if the quorum supports it.
+    assert(HAVE_FEATURE(quorum_con_features, SERVER_NAUTILUS));
+    new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_NAUTILUS);
+  }
 
   dout(5) << __func__ << dendl;
   _apply_compatset_features(new_features);
@@ -2200,6 +2208,9 @@ void Monitor::calc_quorum_requirements()
   if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_MIMIC)) {
     required_features |= CEPH_FEATUREMASK_SERVER_MIMIC;
   }
+  if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_NAUTILUS)) {
+    required_features |= CEPH_FEATUREMASK_SERVER_NAUTILUS;
+  }
 
   // monmap
   if (monmap->get_required_features().contains_all(
@@ -2214,6 +2225,10 @@ void Monitor::calc_quorum_requirements()
        ceph::features::mon::FEATURE_MIMIC)) {
     required_features |= CEPH_FEATUREMASK_SERVER_MIMIC;
   }
+  if (monmap->get_required_features().contains_all(
+       ceph::features::mon::FEATURE_NAUTILUS)) {
+    required_features |= CEPH_FEATUREMASK_SERVER_NAUTILUS;
+  }
   dout(10) << __func__ << " required_features " << required_features << dendl;
 }
 
index 1acf69cc31a85aa64d0728fc870ea46f4761a43e..864a8f8289b8eb37a25c345d1ebb18fb0a71e8fa 100644 (file)
@@ -988,6 +988,7 @@ public:
 #define CEPH_MON_FEATURE_INCOMPAT_KRAKEN CompatSet::Feature(8, "support monmap features")
 #define CEPH_MON_FEATURE_INCOMPAT_LUMINOUS CompatSet::Feature(9, "luminous ondisk layout")
 #define CEPH_MON_FEATURE_INCOMPAT_MIMIC CompatSet::Feature(10, "mimic ondisk layout")
+#define CEPH_MON_FEATURE_INCOMPAT_NAUTILUS CompatSet::Feature(11, "nautilus ondisk layout")
 // make sure you add your feature to Monitor::get_supported_features
 
 
index 01730126abad2e08bc501661b6dca4793448ad6f..58ce4d5162fb2ed54adab2926ba184c246ea3463 100644 (file)
@@ -248,11 +248,16 @@ void OSDMonitor::create_initial()
   if (newmap.nearfull_ratio > 1.0) newmap.nearfull_ratio /= 100;
 
   // new cluster should require latest by default
-  if (g_conf->mon_debug_no_require_mimic) {
-    newmap.require_osd_release = CEPH_RELEASE_LUMINOUS;
-    derr << __func__ << " mon_debug_no_require_mimic=true" << dendl;
+  if (g_conf->get_val<bool>("mon_debug_no_require_nautilus")) {
+    if (g_conf->mon_debug_no_require_mimic) {
+      derr << __func__ << " mon_debug_no_require_mimic=true and nautilus=true" << dendl;
+      newmap.require_osd_release = CEPH_RELEASE_LUMINOUS;
+    } else {
+      derr << __func__ << " mon_debug_no_require_nautilus=true" << dendl;
+      newmap.require_osd_release = CEPH_RELEASE_MIMIC;
+    }
   } else {
-    newmap.require_osd_release = CEPH_RELEASE_MIMIC;
+    newmap.require_osd_release = CEPH_RELEASE_NAUTILUS;
     int r = ceph_release_from_name(
       g_conf->mon_osd_initial_require_min_compat_client.c_str());
     if (r <= 0) {
@@ -1176,7 +1181,7 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t)
     // upgrade to mimic?
     if (osdmap.require_osd_release < CEPH_RELEASE_MIMIC &&
        tmp.require_osd_release >= CEPH_RELEASE_MIMIC) {
-      dout(10) << __func__ << " first mimic epoch" << dendl;
+      dout(10) << __func__ << " first mimic+ epoch" << dendl;
       // record this epoch as the deletion for all legacy removed_snaps
       for (auto& p : tmp.get_pools()) {
        // update every pool
@@ -1236,6 +1241,10 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t)
        }
       }
     }
+    if (osdmap.require_osd_release < CEPH_RELEASE_NAUTILUS &&
+       tmp.require_osd_release >= CEPH_RELEASE_NAUTILUS) {
+      dout(10) << __func__ << " first nautilus+ epoch" << dendl;
+    }
   }
 
   // tell me about it
@@ -3944,7 +3953,7 @@ epoch_t OSDMonitor::send_pg_creates(int osd, Connection *con, epoch_t next) cons
   // create message handling path in the OSD still does the old thing where
   // the pg history is pregenerated and it's instantiated at the latest osdmap
   // epoch; child pgs are simply not created.
-  bool old = true; // !HAVE_FEATURE(con->get_features(), SERVER_MIMIC);
+  bool old = true; // !HAVE_FEATURE(con->get_features(), SERVER_NAUTILUS);
 
   epoch_t last = 0;
   for (auto epoch_pgs = creating_pgs_by_epoch->second.lower_bound(next);
@@ -9602,19 +9611,26 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
       goto reply;
     }
     assert(osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS);
+    if (!osdmap.get_num_up_osds() && sure != "--yes-i-really-mean-it") {
+      ss << "Not advisable to continue since no OSDs are up. Pass "
+        << "--yes-i-really-mean-it if you really wish to continue.";
+      err = -EPERM;
+      goto reply;
+    }
     if (rel == CEPH_RELEASE_MIMIC) {
-      if (!osdmap.get_num_up_osds() && sure != "--yes-i-really-mean-it") {
-        ss << "Not advisable to continue since no OSDs are up. Pass "
-           << "--yes-i-really-mean-it if you really wish to continue.";
-        err = -EPERM;
-        goto reply;
-      }
       if ((!HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_MIMIC))
            && sure != "--yes-i-really-mean-it") {
        ss << "not all up OSDs have CEPH_FEATURE_SERVER_MIMIC feature";
        err = -EPERM;
        goto reply;
       }
+    } else if (rel == CEPH_RELEASE_NAUTILUS) {
+      if ((!HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_NAUTILUS))
+           && sure != "--yes-i-really-mean-it") {
+       ss << "not all up OSDs have CEPH_FEATURE_SERVER_NAUTILUS feature";
+       err = -EPERM;
+       goto reply;
+      }
     } else {
       ss << "not supported for this release yet";
       err = -EPERM;
index 84e715343b49e04830faa1d78834acd279d54a5c..841353019d82bb61467fd124e83db88b1eadc5ee 100644 (file)
@@ -494,6 +494,7 @@ namespace ceph {
       constexpr mon_feature_t FEATURE_LUMINOUS(   (1ULL << 1));
       constexpr mon_feature_t FEATURE_MIMIC(      (1ULL << 2));
       constexpr mon_feature_t FEATURE_OSDMAP_PRUNE (1ULL << 3);
+      constexpr mon_feature_t FEATURE_NAUTILUS(    (1ULL << 4));
 
       constexpr mon_feature_t FEATURE_RESERVED(   (1ULL << 63));
       constexpr mon_feature_t FEATURE_NONE(       (0ULL));
@@ -509,6 +510,7 @@ namespace ceph {
          FEATURE_LUMINOUS |
          FEATURE_MIMIC |
           FEATURE_OSDMAP_PRUNE |
+         FEATURE_NAUTILUS |
          FEATURE_NONE
          );
       }
@@ -527,6 +529,7 @@ namespace ceph {
          FEATURE_KRAKEN |
          FEATURE_LUMINOUS |
          FEATURE_MIMIC |
+         FEATURE_NAUTILUS |
          FEATURE_OSDMAP_PRUNE |
          FEATURE_NONE
          );
@@ -555,6 +558,8 @@ static inline const char *ceph::features::mon::get_feature_name(uint64_t b) {
     return "mimic";
   } else if (f == FEATURE_OSDMAP_PRUNE) {
     return "osdmap-prune";
+  } else if (f == FEATURE_NAUTILUS) {
+    return "nautilus";
   } else if (f == FEATURE_RESERVED) {
     return "reserved";
   }
@@ -571,6 +576,8 @@ inline mon_feature_t ceph::features::mon::get_feature_by_name(const std::string
     return FEATURE_MIMIC;
   } else if (n == "osdmap-prune") {
     return FEATURE_OSDMAP_PRUNE;
+  } else if (n == "nautilus") {
+    return FEATURE_NAUTILUS;
   } else if (n == "reserved") {
     return FEATURE_RESERVED;
   }