From 5f9de0e61190a817833f89ecdb90cea7ff3232d5 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Mon, 10 Jul 2017 11:41:51 +0800 Subject: [PATCH] mon/OSDMonitor: sanity check osd number before applying pg-temp In case user did something stupid and causing weird results. Signed-off-by: xie xingguo --- qa/workunits/cephtool/test.sh | 6 ++++-- src/mon/OSDMonitor.cc | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 5bce08b029f..e17f97efdab 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1831,8 +1831,10 @@ function test_mon_pg() expect_false ceph osd primary-affinity osd.9999 .5 ceph osd primary-affinity osd.0 1 - ceph osd pg-temp 1.0 0 1 2 - ceph osd pg-temp 1.0 osd.1 osd.0 osd.2 + ceph osd pool set rbd size 2 + ceph osd pg-temp 1.0 0 1 + ceph osd pg-temp 1.0 osd.1 osd.0 + expect_false ceph osd pg-temp 1.0 0 1 2 expect_false ceph osd pg-temp asdf qwer expect_false ceph osd pg-temp 1.0 asdf expect_false ceph osd pg-temp 1.0 diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 86657e3a9fd..92c9b9ddba7 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -8856,6 +8856,22 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, new_pg_temp.push_back(osd); } + int pool_min_size = osdmap.get_pg_pool_min_size(pgid); + if ((int)new_pg_temp.size() < pool_min_size) { + ss << "num of osds (" << new_pg_temp.size() <<") < pool min size (" + << pool_min_size << ")"; + err = -EINVAL; + goto reply; + } + + int pool_size = osdmap.get_pg_pool_size(pgid); + if ((int)new_pg_temp.size() > pool_size) { + ss << "num of osds (" << new_pg_temp.size() <<") > pool size (" + << pool_size << ")"; + err = -EINVAL; + goto reply; + } + pending_inc.new_pg_temp[pgid] = mempool::osdmap::vector( new_pg_temp.begin(), new_pg_temp.end()); ss << "set " << pgid << " pg_temp mapping to " << new_pg_temp; -- 2.39.5