From 26ba0ba044846d18f9bdfdbee6e2a9c46882c742 Mon Sep 17 00:00:00 2001 From: Brad Hubbard Date: Wed, 20 Sep 2017 13:15:30 +1000 Subject: [PATCH] mon/OSDMonitor: mon osd feature checks with 0 up osds get_up_osd_features() returns 0 if no osds are up which causes feature checks to fail. Fixes: http://tracker.ceph.com/issues/21471 Signed-off-by: Brad Hubbard --- src/mon/MonCommands.h | 6 +++-- src/mon/OSDMonitor.cc | 59 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 2faf384d0bc..d8f743f3416 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -725,13 +725,15 @@ 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|recovery_deletes|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|recovery_deletes|require_jewel_osds|require_kraken_osds " \ + "name=sure,type=CephChoices,strings=--yes-i-really-mean-it,req=false", \ "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", \ "unset ", "osd", "rw", "cli,rest") COMMAND("osd require-osd-release "\ - "name=release,type=CephChoices,strings=luminous|mimic", + "name=release,type=CephChoices,strings=luminous|mimic " \ + "name=sure,type=CephChoices,strings=--yes-i-really-mean-it,req=false", \ "set the minimum allowed OSD release to participate in the cluster", "osd", "rw", "cli,rest") COMMAND("osd cluster_snap", "take cluster snapshot (disabled)", \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index f583dffcce0..f8c4ee7d1f1 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -5905,7 +5905,15 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, bloomp->set_fpp(f); } else if (var == "use_gmt_hitset") { if (val == "true" || (interr.empty() && n == 1)) { - if (!(osdmap.get_up_osd_features() & CEPH_FEATURE_OSD_HITSET_GMT)) { + string force; + cmd_getval(g_ceph_context, cmdmap, "force", force); + if (!osdmap.get_num_up_osds() && force != "--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."; + return -EPERM; + } + if (!(osdmap.get_up_osd_features() & CEPH_FEATURE_OSD_HITSET_GMT) + && force != "--yes-i-really-mean-it") { ss << "not all OSDs support GMT hit set."; return -EINVAL; } @@ -8448,6 +8456,8 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, return prepare_unset_flag(op, CEPH_OSDMAP_PAUSERD | CEPH_OSDMAP_PAUSEWR); } else if (prefix == "osd set") { + string sure; + cmd_getval(g_ceph_context, cmdmap, "sure", sure); string key; cmd_getval(g_ceph_context, cmdmap, "key", key); if (key == "full") @@ -8475,7 +8485,14 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, else if (key == "notieragent") return prepare_set_flag(op, CEPH_OSDMAP_NOTIERAGENT); else if (key == "sortbitwise") { - if (osdmap.get_up_osd_features() & CEPH_FEATURE_OSD_BITWISE_HOBJ_SORT) { + 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 ((osdmap.get_up_osd_features() & CEPH_FEATURE_OSD_BITWISE_HOBJ_SORT) + || sure == "--yes-i-really-mean-it") { return prepare_set_flag(op, CEPH_OSDMAP_SORTBITWISE); } else { ss << "not all up OSDs have OSD_BITWISE_HOBJ_SORT feature"; @@ -8483,7 +8500,14 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, goto reply; } } else if (key == "recovery_deletes") { - if (HAVE_FEATURE(osdmap.get_up_osd_features(), OSD_RECOVERY_DELETES)) { + 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(), OSD_RECOVERY_DELETES) + || sure == "--yes-i-really-mean-it") { return prepare_set_flag(op, CEPH_OSDMAP_RECOVERY_DELETES); } else { ss << "not all up OSDs have OSD_RECOVERY_DELETES feature"; @@ -8491,6 +8515,12 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, goto reply; } } else if (key == "require_jewel_osds") { + 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 (!osdmap.test_flag(CEPH_OSDMAP_SORTBITWISE)) { ss << "the sortbitwise flag must be set before require_jewel_osds"; err = -EPERM; @@ -8499,13 +8529,20 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, ss << "require_osd_release is already >= jewel"; err = 0; goto reply; - } else if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_JEWEL)) { + } else if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_JEWEL) + || sure == "--yes-i-really-mean-it") { return prepare_set_flag(op, CEPH_OSDMAP_REQUIRE_JEWEL); } else { ss << "not all up OSDs have CEPH_FEATURE_SERVER_JEWEL feature"; err = -EPERM; } } else if (key == "require_kraken_osds") { + 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 (!osdmap.test_flag(CEPH_OSDMAP_SORTBITWISE)) { ss << "the sortbitwise flag must be set before require_kraken_osds"; err = -EPERM; @@ -8514,7 +8551,8 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, ss << "require_osd_release is already >= kraken"; err = 0; goto reply; - } else if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_KRAKEN)) { + } else if (HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_KRAKEN) + || sure == "--yes-i-really-mean-it") { bool r = prepare_set_flag(op, CEPH_OSDMAP_REQUIRE_KRAKEN); // ensure JEWEL is also set pending_inc.new_flags |= CEPH_OSDMAP_REQUIRE_JEWEL; @@ -8563,6 +8601,8 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, } else if (prefix == "osd require-osd-release") { string release; cmd_getval(g_ceph_context, cmdmap, "release", release); + string sure; + cmd_getval(g_ceph_context, cmdmap, "sure", sure); if (!osdmap.test_flag(CEPH_OSDMAP_SORTBITWISE)) { ss << "the sortbitwise flag must be set first"; err = -EPERM; @@ -8586,7 +8626,14 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, } assert(osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS); if (rel == CEPH_RELEASE_MIMIC) { - if (!HAVE_FEATURE(osdmap.get_up_osd_features(), SERVER_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; -- 2.39.5