! ceph osd crush rule ls | grep $rule || return 1
}
+function TEST_erasure_pool_crush_rule_rm() {
+ local dir=$1
+
+ run_mon $dir a || return 1
+ # should have at least one OSD
+ run_osd $dir 0 || return 1
+
+ # create a new rule with pool name as rule name
+ # delete the rule when the pool is deleted
+ local pool_name=cpool
+ ceph osd erasure-code-profile set profile_name plugin=jerasure technique=reed_sol_van k=2 m=2 crush-failure-domain=osd || return 1
+ ceph osd pool create $pool_name 12 12 erasure profile_name || return 1
+ ceph osd crush rule ls | grep $pool_name || return 1
+ ceph osd pool delete $pool_name $pool_name --yes-i-really-really-mean-it || return 1
+ ! ceph osd crush rule ls | grep $pool_name || return 1
+
+ # create few pools that using the same rule
+ # make sure the rule is not deleted when the pool is deleted
+ # unlease it was the last pool using the rule
+ local pool_name1=pool_name1
+ local pool_name2=pool_name2
+
+ ceph osd pool create $pool_name1 12 12 erasure profile_name || return 1
+ ceph osd crush rule ls | grep $pool_name1 || return 1
+ ceph osd pool create $pool_name2 12 12 erasure profile_name || return 1
+ ceph osd crush rule ls | grep $pool_name2 || return 1
+ ceph osd pool delete $pool_name1 $pool_name1 --yes-i-really-really-mean-it || return 1
+ ! ceph osd crush rule ls | grep $pool_name || return 1
+ ceph osd pool delete $pool_name2 $pool_name2 --yes-i-really-really-mean-it || return 1
+ ! ceph osd crush rule ls | grep $pool_name2 || return 1
+
+ # crush rule should be deleted when the last pool using it is deleted
+ local default_rule_name=erasure-code
+ ceph osd pool create $pool_name-1 12 12 erasure || return 1
+ ceph osd pool create $pool_name-2 12 12 erasure || return 1
+ ceph osd pool create $pool_name-3 12 12 erasure || return 1
+ ceph osd crush rule ls | grep $default_rule_name || return 1
+ ceph osd pool delete $pool_name-1 $pool_name-1 --yes-i-really-really-mean-it || return 1
+ ceph osd crush rule ls | grep $default_rule_name || return 1
+ ceph osd pool delete $pool_name-2 $pool_name-2 --yes-i-really-really-mean-it || return 1
+ ceph osd crush rule ls | grep $default_rule_name || return 1
+ ceph osd pool delete $pool_name-3 $pool_name-3 --yes-i-really-really-mean-it || return 1
+ ! ceph osd crush rule ls | grep $default_rule_name || return 1
+}
+
function TEST_add_rule_failed() {
local dir=$1
pending_inc.crush.clear();
newcrush.encode(pending_inc.crush, mon.get_quorum_con_features());
}
+
+ // remove any crush rules for this pool
+ const pg_pool_t *pi = osdmap.get_pg_pool(pool);
+ if (pi->is_erasure() && newcrush.rule_exists(pi->get_crush_rule())) {
+ int ruleno = pi->get_crush_rule();
+ ceph_assert(ruleno >= 0);
+
+ auto rule_in_use = false;
+ for (const auto &_pool : osdmap.pools) {
+ if (_pool.second.get_crush_rule() == ruleno && pool != _pool.first)
+ rule_in_use = true;
+ }
+ if (!rule_in_use) {
+ dout(10) << __func__ << " removing crush rule for pool " << pool << dendl;
+ newcrush.remove_rule(ruleno);
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush, mon.get_quorum_con_features());
+ }
+ }
+
return 0;
}