cmd_getval(g_ceph_context, cmdmap, "name", name);
string profile;
cmd_getval(g_ceph_context, cmdmap, "profile", profile);
- if (profile == "")
+ if (profile == "") {
profile = "default";
+ if (!osdmap.has_erasure_code_profile(profile)) {
+ if (pending_inc.has_erasure_code_profile(profile))
+ 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 " << name << " set" << dendl;
+ pending_inc.set_erasure_code_profile(profile, profile_map);
+ goto wait;
+ }
+ }
int ruleset;
err = crush_ruleset_create_erasure(name, profile, &ruleset, ss);
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;
*/
int build_simple(CephContext *cct, epoch_t e, uuid_d &fsid,
int num_osd, int pg_bits, int pgp_bits);
+ int set_erasure_code_profile_default(CephContext *cct);
+
static int _build_crush_types(CrushWrapper& crush);
static int build_simple_crush_map(CephContext *cct, CrushWrapper& crush,
int num_osd, ostream *ss);