From bfd1d4ef9a10f0fcf238095feb2ba8ebb3823db4 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Sat, 5 Aug 2017 19:21:33 +0800 Subject: [PATCH] mon/OSDMonitor: sanity check osd before performing 'osd purge' This will pervent OSDMonitor from crashing on purging a very large non-existent osd id as below: osd e11 prepare_command_osd_purge purging osd.8 -1> 2017-08-05 18:59:44.994319 7f6076968700 10 mon.a@0(leader).osd e11 prepare_command_osd_destroy osd.8 does not exist. 0> 2017-08-05 18:59:45.002309 7f6076968700 -1 /home/xxg/build/ceph-dev/src/osd/OSDMap.h: In function 'int OSDMap::get_state(int) const' thread 7f6076968700 time 2017-08-05 18:59:44.994336 /home/xxg/build/ceph-dev/src/osd/OSDMap.h: 690: FAILED assert(o < max_osd) Signed-off-by: xie xingguo --- qa/workunits/cephtool/test.sh | 3 ++- src/mon/OSDMonitor.cc | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 9d8482df632..7c43ada2885 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1327,9 +1327,10 @@ function test_mon_osd_create_destroy() expect_false ceph auth get-key client.osd-lockbox.$uuid3 expect_false ceph config-key exists dm-crypt/osd/$uuid3/luks ceph osd purge osd.$id3 --yes-i-really-mean-it - ceph osd purge osd.$id3 --yes-i-really-mean-it + ceph osd purge osd.$id3 --yes-i-really-mean-it # idempotent ceph osd purge osd.$id --yes-i-really-mean-it + ceph osd purge 123456 --yes-i-really-mean-it expect_false ceph osd find $id expect_false ceph auth get-key osd.$id expect_false ceph auth get-key client.osd-lockbox.$uuid diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 6546f56ba08..93aa8479a20 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -9693,9 +9693,9 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, << "really do."; err = -EPERM; goto reply; - } else if (is_destroy && !osdmap.exists(id)) { + } else if (!osdmap.exists(id)) { ss << "osd." << id << " does not exist"; - err = -ENOENT; + err = 0; // idempotent goto reply; } else if (osdmap.is_up(id)) { ss << "osd." << id << " is not `down`."; -- 2.39.5