From: xie xingguo Date: Mon, 15 Apr 2019 12:36:36 +0000 (+0800) Subject: osd: add 'ceph osd stop ' command X-Git-Tag: v15.1.0~2888^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5dbae13ce0f5b0104ab43e0ccfe94f832d0e1268;p=ceph-ci.git osd: add 'ceph osd stop ' command stop command can be used to force stopping a specified osd daemon, e.g., you don't have to pre-figure out where it located. Signed-off-by: xie xingguo --- diff --git a/qa/standalone/osd/osd-markdown.sh b/qa/standalone/osd/osd-markdown.sh index 4c4fd767f65..a33f54003bb 100755 --- a/qa/standalone/osd/osd-markdown.sh +++ b/qa/standalone/osd/osd-markdown.sh @@ -124,8 +124,23 @@ function TEST_markdown_boot_exceed_time() { ceph osd tree | grep up | grep osd.0 || return 1 } -main osd-markdown "$@" +function TEST_osd_stop() { + + local dir=$1 -# Local Variables: -# compile-command: "cd ../.. ; make -j4 && test/osd/osd-bench.sh" -# End: + run_mon $dir a || return 1 + run_mgr $dir x || return 1 + run_osd $dir 0 || return 1 + run_osd $dir 1 || return 1 + run_osd $dir 2 || return 1 + osd_0_pid=$(cat $dir/osd.0.pid) + ps -p $osd_0_pid || return 1 + + ceph osd tree | grep osd.0 | grep up || return 1 + ceph osd stop osd.0 + sleep 15 # give osd plenty of time to notice and exit + ceph osd tree | grep down | grep osd.0 || return 1 + ! ps -p $osd_0_pid || return 1 +} + +main osd-markdown "$@" diff --git a/src/common/ceph_strings.cc b/src/common/ceph_strings.cc index 201f4dbb8ec..8711672689e 100644 --- a/src/common/ceph_strings.cc +++ b/src/common/ceph_strings.cc @@ -65,6 +65,8 @@ const char *ceph_osd_state_name(int s) return "noin"; case CEPH_OSD_NOOUT: return "noout"; + case CEPH_OSD_STOP: + return "stop"; default: return "???"; } diff --git a/src/include/rados.h b/src/include/rados.h index 59bd771c15e..a7a852e31bf 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -124,6 +124,7 @@ struct ceph_eversion { #define CEPH_OSD_NODOWN (1<<9) /* osd can not be marked down */ #define CEPH_OSD_NOIN (1<<10) /* osd can not be marked in */ #define CEPH_OSD_NOOUT (1<<11) /* osd can not be marked out */ +#define CEPH_OSD_STOP (1<<12) /* osd has been stopped by admin */ extern const char *ceph_osd_state_name(int s); diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 729eb1cd8c9..3e6c5f7682c 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -817,6 +817,10 @@ COMMAND("osd down " \ "set osd(s) [...] down, " \ "or use to set all osds down", \ "osd", "rw") +COMMAND("osd stop " \ + "type=CephString,name=ids,n=N", \ + "stop the corresponding osd daemons and mark them as down", \ + "osd", "rw") COMMAND("osd out " \ "name=ids,type=CephString,n=N", \ "set osd(s) [...] out, " \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index e5d031c9a37..718e86b1cdb 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -10397,9 +10397,10 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, pending_inc.new_require_osd_release = rel; goto update; } else if (prefix == "osd down" || - prefix == "osd out" || - prefix == "osd in" || - prefix == "osd rm") { + prefix == "osd out" || + prefix == "osd in" || + prefix == "osd rm" || + prefix == "osd stop") { bool any = false; bool stop = false; @@ -10505,6 +10506,19 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, } any = true; } + } else if (prefix == "osd stop") { + if (osdmap.is_stop(osd)) { + if (verbose) + ss << "osd." << osd << " is already stopped. "; + } else if (osdmap.is_down(osd)) { + pending_inc.pending_osd_state_set(osd, CEPH_OSD_STOP); + ss << "stop down osd." << osd << ". "; + any = true; + } else { + pending_inc.pending_osd_state_set(osd, CEPH_OSD_UP | CEPH_OSD_STOP); + ss << "stop osd." << osd << ". "; + any = true; + } } } } diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 16f85379e37..188bf29a318 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -8241,6 +8241,9 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m) dout(0) << "map says i do not exist. shutting down." << dendl; do_shutdown = true; // don't call shutdown() while we have // everything paused + } else if (osdmap->is_stop(whoami)) { + dout(0) << "map says i am stopped by admin. shutting down." << dendl; + do_shutdown = true; } else if (!osdmap->is_up(whoami) || !osdmap->get_addrs(whoami).legacy_equals( client_messenger->get_myaddrs()) || diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 1fd46a7be42..246eb19797b 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2030,6 +2030,7 @@ int OSDMap::apply_incremental(const Incremental &inc) for (const auto &client : inc.new_up_client) { osd_state[client.first] |= CEPH_OSD_EXISTS | CEPH_OSD_UP; + osd_state[client.first] &= ~CEPH_OSD_STOP; // if any osd_addrs->client_addrs[client.first].reset( new entity_addrvec_t(client.second)); osd_addrs->hb_back_addrs[client.first].reset( diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 83b0037ad9e..3b10a7b9955 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -815,6 +815,11 @@ public: return !is_up(osd); } + bool is_stop(int osd) const { + return exists(osd) && is_down(osd) && + (osd_state[osd] & CEPH_OSD_STOP); + } + bool is_out(int osd) const { return !exists(osd) || get_weight(osd) == CEPH_OSD_OUT; }