From 02d15bb434d96301889968519d408fb91c962440 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 15 Jan 2016 21:04:21 +0800 Subject: [PATCH] mon/MDSMonitor: Add confirmation to "ceph mds rmfailed" Fixes: #14379 Signed-off-by: Yan, Zheng --- qa/workunits/cephtool/test.sh | 6 ++++++ src/mon/MDSMonitor.cc | 7 +++++++ src/mon/MonCommands.h | 4 ++-- src/test/pybind/test_ceph_argparse.py | 10 +++++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 5b6fbf25c7f88..a811faab92270 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -836,6 +836,12 @@ function test_mon_mds() fail_all_mds + set +e + # Check that rmfailed requires confirmation + expect_false ceph mds rmfailed 0 + ceph mds rmfailed 0 --yes-i-really-mean-it + set -e + # Check that 'fs reset' runs ceph fs reset cephfs --yes-i-really-mean-it diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 664af7b03e752..17d2ac405e88e 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -1647,6 +1647,13 @@ int MDSMonitor::filesystem_command( } } else if (prefix == "mds rmfailed") { mds_rank_t who; + string confirm; + if (!cmd_getval(g_ceph_context, cmdmap, "confirm", confirm) || + confirm != "--yes-i-really-mean-it") { + ss << "WARNING: this can make your filesystem inaccessible! " + "Add --yes-i-really-mean-it if you are sure you wish to continue."; + return -EPERM; + } if (!cmd_getval(g_ceph_context, cmdmap, "who", who)) { ss << "error parsing 'who' value '" << cmd_vartype_stringify(cmdmap["who"]) << "'"; diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 8d09f91fba040..600b1f2ef11df 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -342,8 +342,8 @@ COMMAND("mds repaired name=rank,type=CephInt", \ COMMAND("mds rm " \ "name=gid,type=CephInt,range=0", \ "remove nonactive mds", "mds", "rw", "cli,rest") -COMMAND("mds rmfailed name=who,type=CephInt,range=0", "remove failed mds", \ - "mds", "rw", "cli,rest") +COMMAND("mds rmfailed name=who,type=CephInt,range=0 name=confirm,type=CephString,req=false", \ + "remove failed mds", "mds", "rw", "cli,rest") COMMAND("mds cluster_down", "take MDS cluster down", "mds", "rw", "cli,rest") COMMAND("mds cluster_up", "bring MDS cluster up", "mds", "rw", "cli,rest") COMMAND("mds compat rm_compat " \ diff --git a/src/test/pybind/test_ceph_argparse.py b/src/test/pybind/test_ceph_argparse.py index 53d420f8f8709..9f22af660839d 100755 --- a/src/test/pybind/test_ceph_argparse.py +++ b/src/test/pybind/test_ceph_argparse.py @@ -405,7 +405,15 @@ class TestMDS(TestArgparse): assert_equal({}, validate_command(sigdict, ['mds', 'rm', '1', 'mds.42'])) def test_rmfailed(self): - self.check_1_natural_arg('mds', 'rmfailed') + self.assert_valid_command(['mds', 'rmfailed', '0']) + self.assert_valid_command(['mds', 'rmfailed', '0', '--yes-i-really-mean-it']) + assert_equal({}, validate_command(sigdict, ['mds', 'rmfailed', + '--yes-i-really-mean-it'])) + assert_equal({}, validate_command(sigdict, ['mds', 'rmfailed', '-1', + '--yes-i-really-mean-it'])) + assert_equal({}, validate_command(sigdict, ['mds', 'rmfailed', '0', + '--yes-i-really-mean-it', + 'toomany'])) def test_cluster_down(self): self.check_no_arg('mds', 'cluster_down') -- 2.39.5