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 "$@"
return "noin";
case CEPH_OSD_NOOUT:
return "noout";
+ case CEPH_OSD_STOP:
+ return "stop";
default:
return "???";
}
#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);
"set osd(s) <id> [<id>...] down, " \
"or use <any|all> 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) <id> [<id>...] out, " \
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;
}
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;
+ }
}
}
}
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()) ||
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(
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;
}