cmd_getval(g_ceph_context, cmdmap, "profile", profile);
if (profile == "")
profile = "default";
+ if (profile == "default") {
+ if (!osdmap.has_erasure_code_profile(profile)) {
+ if (pending_inc.has_erasure_code_profile(profile)) {
+ dout(20) << "erasure code profile " << profile << " already pending" << dendl;
+ goto wait;
+ }
+
+ map<string,string> profile_map;
+ err = osdmap.get_erasure_code_profile_default(g_ceph_context,
+ profile_map,
+ &ss);
+ if (err)
+ goto reply;
+ dout(20) << "erasure code profile " << profile << " set" << dendl;
+ pending_inc.set_erasure_code_profile(profile, profile_map);
+ goto wait;
+ }
+ }
int ruleset;
err = crush_ruleset_create_erasure(name, profile, &ruleset, ss);
cmd_getval(g_ceph_context, cmdmap, "erasure_code_profile", erasure_code_profile);
if (erasure_code_profile == "")
erasure_code_profile = "default";
+ if (erasure_code_profile == "default") {
+ if (!osdmap.has_erasure_code_profile(erasure_code_profile)) {
+ if (pending_inc.has_erasure_code_profile(erasure_code_profile)) {
+ dout(20) << "erasure code profile " << erasure_code_profile << " already pending" << dendl;
+ goto wait;
+ }
+
+ map<string,string> profile_map;
+ err = osdmap.get_erasure_code_profile_default(g_ceph_context,
+ profile_map,
+ &ss);
+ if (err)
+ goto reply;
+ dout(20) << "erasure code profile " << erasure_code_profile << " set" << dendl;
+ pending_inc.set_erasure_code_profile(erasure_code_profile, profile_map);
+ goto wait;
+ }
+ }
+
if (ruleset_name == "") {
if (erasure_code_profile == "default") {
ruleset_name = "erasure-code";
set_weight(i, CEPH_OSD_OUT);
}
- map<string,string> erasure_code_profile_map;
- r = get_str_map(cct->_conf->osd_pool_default_erasure_code_profile,
- ss,
- &erasure_code_profile_map);
- erasure_code_profile_map["directory"] =
+ map<string,string> profile_map;
+ r = get_erasure_code_profile_default(cct, profile_map, &ss);
+ if (r < 0) {
+ lderr(cct) << ss.str() << dendl;
+ return r;
+ }
+ set_erasure_code_profile("default", profile_map);
+ return 0;
+}
+
+int OSDMap::get_erasure_code_profile_default(CephContext *cct,
+ map<string,string> &profile_map,
+ ostream *ss)
+{
+ int r = get_str_map(cct->_conf->osd_pool_default_erasure_code_profile,
+ *ss,
+ &profile_map);
+ profile_map["directory"] =
cct->_conf->osd_pool_default_erasure_code_directory;
- set_erasure_code_profile("default", erasure_code_profile_map);
return r;
}
erasure_code_profiles.find(name);
return i != erasure_code_profiles.end();
}
+ int get_erasure_code_profile_default(CephContext *cct,
+ map<string,string> &profile_map,
+ ostream *ss);
void set_erasure_code_profile(const string &name,
const map<string,string> &profile) {
erasure_code_profiles[name] = profile;
function TEST_crush_rule_create_erasure() {
local dir=$1
local ruleset=ruleset3
+ #
+ # create a new ruleset with the default profile, implicitly
+ #
./ceph osd crush rule create-erasure $ruleset || return 1
./ceph osd crush rule create-erasure $ruleset 2>&1 | \
grep "$ruleset already exists" || return 1
grep '<op>chooseleaf_indep</op><num>0</num><type>host</type>' || return 1
./ceph osd crush rule rm $ruleset || return 1
! ./ceph osd crush rule ls | grep $ruleset || return 1
+ #
+ # create a new ruleset with the default profile, explicitly
+ #
./ceph osd crush rule create-erasure $ruleset default || return 1
./ceph osd crush rule ls | grep $ruleset || return 1
./ceph osd crush rule rm $ruleset || return 1
+ ! ./ceph osd crush rule ls | grep $ruleset || return 1
+ #
+ # create a new ruleset and the default profile, implicitly
+ #
+ ./ceph osd erasure-code-profile rm default || return 1
+ ! ./ceph osd erasure-code-profile ls | grep default || return 1
+ ./ceph osd crush rule create-erasure $ruleset || return 1
+ CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
+ grep 'profile default set' $dir/a/log || return 1
+ ./ceph osd erasure-code-profile ls | grep default || return 1
+ ./ceph osd crush rule rm $ruleset || return 1
+ ! ./ceph osd crush rule ls | grep $ruleset || return 1
}
function TEST_crush_rule_create_erasure_exists() {
./ceph osd crush rule rm $ruleset || return 1
}
+function TEST_crush_rule_create_erasure_profile_default_exists() {
+ local dir=$1
+ local ruleset=ruleset6
+ ./ceph osd erasure-code-profile rm default || return 1
+ ! ./ceph osd erasure-code-profile ls | grep default || return 1
+ # add to the pending OSD map without triggering a paxos proposal
+ result=$(echo '{"prefix":"osdmonitor_prepare_command","prepare":"osd erasure-code-profile set","name":"default"}' | nc -U $dir/a/ceph-mon.a.asok | cut --bytes=5-)
+ test $result = true || return 1
+ ./ceph osd crush rule create-erasure $ruleset || return 1
+ CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
+ grep 'profile default already pending' $dir/a/log || return 1
+ ./ceph osd crush rule rm $ruleset || return 1
+ ./ceph osd erasure-code-profile ls | grep default || return 1
+}
+
main osd-crush
# Local Variables:
grep "$crush_ruleset try again" $dir/a/log || return 1
}
+function TEST_erasure_code_profile_default() {
+ local dir=$1
+ run_mon $dir a --public-addr 127.0.0.1
+ ./ceph osd erasure-code-profile rm default || return 1
+ ! ./ceph osd erasure-code-profile ls | grep default || return 1
+ ./ceph osd pool create $poolname 12 12 erasure default
+ ./ceph osd erasure-code-profile ls | grep default || return 1
+}
+
+function TEST_erasure_code_profile_default_pending() {
+ local dir=$1
+ run_mon $dir a --public-addr 127.0.0.1
+ ./ceph osd erasure-code-profile rm default || return 1
+ ! ./ceph osd erasure-code-profile ls | grep default || return 1
+ # add to the pending OSD map without triggering a paxos proposal
+ result=$(echo '{"prefix":"osdmonitor_prepare_command","prepare":"osd erasure-code-profile set","name":"default"}' | nc -U $dir/a/ceph-mon.a.asok | cut --bytes=5-)
+ test $result = true || return 1
+ ./ceph osd pool create pool_erasure 12 12 erasure default || return 1
+ CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
+ grep 'profile default already pending' $dir/a/log || return 1
+}
+
function TEST_erasure_crush_stripe_width() {
local dir=$1
# the default stripe width is used to initialize the pool