From 360de6adf24ef9a1287d169416d5e9bbb72afbec Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Sun, 15 Jun 2014 16:54:02 +0200 Subject: [PATCH] erasure-code: create default profile if necessary http://tracker.ceph.com/issues/8601 Signed-off-by: Loic Dachary --- src/mon/OSDMonitor.cc | 17 ++++++++++++++++- src/osd/OSDMap.cc | 24 ++++++++++++++++++------ src/osd/OSDMap.h | 5 +++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 1f50f8c0ae97..54eb2f52ca5a 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -4184,8 +4184,23 @@ bool OSDMonitor::prepare_command_impl(MMonCommand *m, 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 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); diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 8d2a346fb64b..79759d7d4c02 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2562,13 +2562,25 @@ int OSDMap::build_simple(CephContext *cct, epoch_t e, uuid_d &fsid, set_weight(i, CEPH_OSD_OUT); } - map 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 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 &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; } diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index fcb3e26d847a..f51d6c4f54e7 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -381,6 +381,9 @@ public: erasure_code_profiles.find(name); return i != erasure_code_profiles.end(); } + int get_erasure_code_profile_default(CephContext *cct, + map &profile_map, + ostream *ss); void set_erasure_code_profile(const string &name, const map &profile) { erasure_code_profiles[name] = profile; @@ -793,6 +796,8 @@ public: */ 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); -- 2.47.3