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 <zou.aiguo@zte.com.cn>
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()
for (map<int64_t, pg_pool_t>::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;
}
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;