summaryrefslogtreecommitdiffstats
path: root/src/mon/MonmapMonitor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mon/MonmapMonitor.cc')
-rw-r--r--src/mon/MonmapMonitor.cc36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/mon/MonmapMonitor.cc b/src/mon/MonmapMonitor.cc
index 1226c8a8241..732238f4358 100644
--- a/src/mon/MonmapMonitor.cc
+++ b/src/mon/MonmapMonitor.cc
@@ -1187,6 +1187,42 @@ bool MonmapMonitor::prepare_command(MonOpRequestRef op)
ceph_assert(okay == true);
}
request_proposal(mon.osdmon());
+ } else if (prefix == "mon disable_stretch_mode") {
+ if (!mon.osdmon()->is_writeable()) {
+ dout(10) << __func__
+ << ": waiting for osdmon writeable for stretch mode" << dendl;
+ mon.osdmon()->wait_for_writeable(op, new Monitor::C_RetryMessage(&mon, op));
+ return false; /* do not propose, yet */
+ }
+ bool sure = false;
+ bool okay = false;
+ int errcode = 0;
+ if (!pending_map.stretch_mode_enabled) {
+ ss << "stretch mode is already disabled";
+ err = -EINVAL;
+ goto reply_no_propose;
+ }
+ cmd_getval(cmdmap, "yes_i_really_mean_it", sure);
+ if (!sure) {
+ ss << " This command will disable stretch mode, "
+ "which means all your pools will be reverted back "
+ "to the default size, min_size and crush_rule. "
+ "Pass --yes-i-really-mean-it to proceed.";
+ err = -EPERM;
+ goto reply_no_propose;
+ }
+ string crush_rule = cmd_getval_or<string>(cmdmap, "crush_rule", string{});
+ mon.osdmon()->try_disable_stretch_mode(ss, &okay, &errcode, crush_rule);
+ if (!okay) {
+ err = errcode;
+ goto reply_no_propose;
+ }
+ pending_map.stretch_mode_enabled = false;
+ pending_map.tiebreaker_mon = "";
+ pending_map.disallowed_leaders.clear();
+ pending_map.stretch_marked_down_mons.clear();
+ pending_map.last_changed = ceph_clock_now();
+ request_proposal(mon.osdmon());
} else {
ss << "unknown command " << prefix;
err = -EINVAL;