From 3f36408010f81e1468b5fee7c9ded46d04ef8746 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Wed, 11 May 2016 16:13:47 +0800 Subject: [PATCH 1/3] mon/OSDMonitor: make error handling for "osd lost" command more fine-grained If the specified osd is not down or doesn't exist, we shall return error instead of success. So caller can abort(if does not exist) or mark osd as down and retry(if not down). Signed-off-by: xie xingguo --- src/mon/OSDMonitor.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 7859d2b64d4d1..f303db3863d7b 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -6649,8 +6649,14 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, "--yes-i-really-mean-it if you really do."; err = -EPERM; goto reply; - } else if (!osdmap.exists(id) || !osdmap.is_down(id)) { - ss << "osd." << id << " is not down or doesn't exist"; + } else if (!osdmap.exists(id)) { + ss << "osd." << id << " does not exist"; + err = -ENOENT; + goto reply; + } else if (!osdmap.is_down(id)) { + ss << "osd." << id << " is not down"; + err = -EBUSY; + goto reply; } else { epoch_t e = osdmap.get_info(id).down_at; pending_inc.new_lost[id] = e; From 3b160df0aa7a25e7f7bf3615d13b03022c5ab9db Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Thu, 28 Jul 2016 19:17:34 +0800 Subject: [PATCH 2/3] mon/OSDMonitor: expose require_kraken_osds flag to user For newly created cluster the CEPH_OSDMAP_REQUIRE_KRAKEN will be automatically set, while for existing clusters it will not. This change add "require_jewel_osds" to white list, so user can access it by the "ceph osd set *" command family. Signed-off-by: xie xingguo --- qa/workunits/cephtool/test.sh | 2 ++ src/mon/MonCommands.h | 2 +- src/osd/OSDMap.cc | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index d9875a7cfa3dc..d97a929ad2307 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1109,6 +1109,8 @@ function test_mon_osd() expect_false ceph osd unset bogus 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 ceph osd set noup ceph osd down 0 diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 1c1da710cbc60..5dc1eed785c86 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -628,7 +628,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", \ + "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 ", "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/osd/OSDMap.cc b/src/osd/OSDMap.cc index 4580d826ffc3b..03aac656cb57c 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2382,6 +2382,8 @@ string OSDMap::get_flag_string(unsigned f) s += ",sortbitwise"; if (f & CEPH_OSDMAP_REQUIRE_JEWEL) s += ",require_jewel_osds"; + if (f & CEPH_OSDMAP_REQUIRE_KRAKEN) + s += ",require_kraken_osds"; if (s.length()) s.erase(0, 1); return s; From 2ead84781d924392d7bd93d9df0bd2697acb88b5 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Fri, 29 Jul 2016 12:21:27 +0800 Subject: [PATCH 3/3] mon/OSDMonitor: fix CEPH_FEATURE_SERVER_JEWEL of preprocess_boot() check We shall check CEPH_FEATURE_SERVER_JEWEL carried by osd_features of MOSDBoot message, as it will be properly filled by every OSD during OSD::_send_boot() process. Signed-off-by: xie xingguo --- src/mon/OSDMonitor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index f303db3863d7b..436fb1846dba7 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1978,7 +1978,7 @@ bool OSDMonitor::preprocess_boot(MonOpRequestRef op) } if (osdmap.test_flag(CEPH_OSDMAP_REQUIRE_JEWEL) && - !(m->get_connection()->get_features() & CEPH_FEATURE_SERVER_JEWEL)) { + !(m->osd_features & CEPH_FEATURE_SERVER_JEWEL)) { mon->clog->info() << "disallowing boot of OSD " << m->get_orig_source_inst() << " because the osdmap requires"