summaryrefslogtreecommitdiffstats
path: root/src/mon/MgrMonitor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mon/MgrMonitor.cc')
-rw-r--r--src/mon/MgrMonitor.cc81
1 files changed, 74 insertions, 7 deletions
diff --git a/src/mon/MgrMonitor.cc b/src/mon/MgrMonitor.cc
index 30382b97052..b89878dddb7 100644
--- a/src/mon/MgrMonitor.cc
+++ b/src/mon/MgrMonitor.cc
@@ -146,10 +146,12 @@ void MgrMonitor::create_initial()
}
pending_map.always_on_modules = always_on_modules();
pending_command_descs = mgr_commands;
- dout(10) << __func__ << " initial modules " << pending_map.modules
- << ", always on modules " << pending_map.get_always_on_modules()
- << ", " << pending_command_descs.size() << " commands"
+ dout(10) << __func__ << " initial enabled modules: " << pending_map.modules
<< dendl;
+ dout(10) << __func__ << "always on modules: " <<
+ pending_map.get_always_on_modules() << dendl;
+ dout(10) << __func__ << "total " << pending_command_descs.size() <<
+ " commands" << dendl;
}
void MgrMonitor::get_store_prefixes(std::set<string>& s) const
@@ -1019,6 +1021,13 @@ bool MgrMonitor::preprocess_command(MonOpRequestRef op)
f->dump_string("module", p);
}
f->close_section();
+
+ f->open_array_section("force_disabled_modules");
+ for (auto& p : map.force_disabled_modules) {
+ f->dump_string("module", p);
+ }
+ f->close_section();
+
f->open_array_section("enabled_modules");
for (auto& p : map.modules) {
if (map.get_always_on_modules().count(p) > 0)
@@ -1048,7 +1057,11 @@ bool MgrMonitor::preprocess_command(MonOpRequestRef op)
for (auto& p : map.get_always_on_modules()) {
tbl << p;
- tbl << "on (always on)";
+ if (map.force_disabled_modules.find(p) == map.force_disabled_modules.end()) {
+ tbl << "on (always on)";
+ } else {
+ tbl << "off (always on but force-disabled)";
+ }
tbl << TextTable::endrow;
}
for (auto& p : map.modules) {
@@ -1269,10 +1282,13 @@ bool MgrMonitor::prepare_command(MonOpRequestRef op)
r = -EINVAL;
goto out;
}
- if (pending_map.get_always_on_modules().count(module) > 0) {
+
+ if (pending_map.get_always_on_modules().count(module) > 0 &&
+ !pending_map.force_disabled_modules.contains(module)) {
ss << "module '" << module << "' is already enabled (always-on)";
goto out;
}
+
bool force = false;
cmd_getval_compat_cephbool(cmdmap, "force", force);
if (!pending_map.all_support_module(module) &&
@@ -1296,7 +1312,12 @@ bool MgrMonitor::prepare_command(MonOpRequestRef op)
ss << "module '" << module << "' is already enabled";
r = 0;
goto out;
+ } else if (pending_map.force_disabled_modules.contains(module)) {
+ pending_map.force_disabled_modules.erase(module);
+ r = 0;
+ goto out;
}
+
pending_map.modules.insert(module);
} else if (prefix == "mgr module disable") {
string module;
@@ -1306,8 +1327,9 @@ bool MgrMonitor::prepare_command(MonOpRequestRef op)
goto out;
}
if (pending_map.get_always_on_modules().count(module) > 0) {
- ss << "module '" << module << "' cannot be disabled (always-on)";
- r = -EINVAL;
+ ss << "module '" << module << "' cannot be disabled (always-on), use " <<
+ "'ceph mgr module force disable' command to disable an always-on module";
+ r = -EPERM;
goto out;
}
if (!pending_map.module_enabled(module)) {
@@ -1318,7 +1340,52 @@ bool MgrMonitor::prepare_command(MonOpRequestRef op)
if (!pending_map.modules.count(module)) {
ss << "module '" << module << "' is not enabled";
}
+ dout(8) << __func__ << " disabling module " << module << " from new " << dendl;
pending_map.modules.erase(module);
+ } else if (prefix == "mgr module force disable") {
+ string mod;
+ cmd_getval(cmdmap, "module", mod);
+
+ bool confirmation_flag = false;
+ cmd_getval(cmdmap, "yes_i_really_mean_it", confirmation_flag);
+
+ if (mod.empty()) {
+ ss << "Module name wasn't passed!";
+ r = -EINVAL;
+ goto out;
+ }
+
+ if (!pending_map.get_always_on_modules().contains(mod)) {
+ ss << "Always-on module named \"" << mod << "\" does not exist";
+ r = -EINVAL;
+ goto out;
+ } else if (pending_map.modules.contains(mod)) {
+ ss << "Module '" << mod << "' is not an always-on module, only always-on " <<
+ "modules can be disabled through this command.";
+ r = -EINVAL;
+ goto out;
+ }
+
+ if (pending_map.force_disabled_modules.contains(mod)) {
+ ss << "Module \"" << mod << "\"is already disabled";
+ r = 0;
+ goto out;
+ }
+
+ if (!confirmation_flag) {
+ ss << "This command will disable operations and remove commands that "
+ << "other Ceph utilities expect to be available. Do not continue "
+ << "unless your cluster is already experiencing an event due to "
+ << "which it is advised to disable this module as part of "
+ << "troubleshooting. If you are sure that you wish to continue, "
+ << "run again with --yes-i-really-mean-it";
+ r = -EPERM;
+ goto out;
+ }
+
+ dout(8) << __func__ << " force-disabling module '" << mod << "'" << dendl;
+ pending_map.force_disabled_modules.insert(mod);
+ pending_map.modules.erase(mod);
} else {
ss << "Command '" << prefix << "' not implemented!";
r = -ENOSYS;