From: zouaiguo Date: Mon, 25 Dec 2017 00:55:14 +0000 (+0800) Subject: mon/OSDMonitor.cc : set erasure-code-profile to "" when create replicated pools. X-Git-Tag: v13.0.2~520^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a61e62cf446f430161061ada9a256c4d90de104a;p=ceph.git mon/OSDMonitor.cc : set erasure-code-profile to "" when create replicated pools. when we create a pool specify a rule, for example "ceph osd pool create foo replicated 10 rule_foo", we will set pool foo erasure-code-profile to rule_foo, if there has an erasure-code-profile names rule_foo, use "ceph osd erasure-code-profile rule_foo" will fail, "Error EBUSY: foo pool(s) are using the erasure code profile 'rule_foo'", this is wrong. we should do: 1. set erasure-code-profile to "" when create replicated pools 2. whether erasure-code-profile is used by pool not only judge pool erasure_code_profile property and also the pool is_erasure Signed-off-by: zouaiguo --- diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 6e3f0ebc793..b71bd3a8773 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1703,6 +1703,17 @@ function test_mon_osd_pool() set -e ceph osd pool delete replicated replicated --yes-i-really-really-mean-it ceph osd pool delete ec_test ec_test --yes-i-really-really-mean-it + + # test create pool with rule + ceph osd erasure-code-profile set foo foo + ceph osd erasure-code-profile ls | grep foo + ceph osd crush rule create-erasure foo foo + ceph osd pool create erasure 12 12 erasure foo + expect_false ceph osd erasure-code-profile rm foo + ceph osd pool delete erasure erasure --yes-i-really-really-mean-it + ceph osd crush rule rm foo + ceph osd erasure-code-profile rm foo + } function test_mon_osd_pool_quota() diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 52c5afbb480..d0b8b3c9086 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -5442,7 +5442,7 @@ bool OSDMonitor::erasure_code_profile_in_use( for (map::const_iterator p = pools.begin(); p != pools.end(); ++p) { - if (p->second.erasure_code_profile == profile) { + if (p->second.erasure_code_profile == profile && p->second.is_erasure()) { *ss << osdmap.pool_name[p->first] << " "; found = true; } @@ -5833,7 +5833,11 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, pi->set_pgp_num(pgp_num); pi->last_change = pending_inc.epoch; pi->auid = auid; - pi->erasure_code_profile = erasure_code_profile; + if (pool_type == pg_pool_t::TYPE_ERASURE) { + pi->erasure_code_profile = erasure_code_profile; + } else { + pi->erasure_code_profile = ""; + } pi->stripe_width = stripe_width; pi->cache_target_dirty_ratio_micro = g_conf->osd_pool_default_cache_target_dirty_ratio * 1000000;