#define CEPH_FEATURE_OSD_PRIMARY_AFFINITY (1ULL<<41) /* overlap w/ tunables3 */
#define CEPH_FEATURE_MSGR_KEEPALIVE2 (1ULL<<42)
#define CEPH_FEATURE_OSD_POOLRESEND (1ULL<<43)
+#define CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2 (1ULL<<44)
/*
* The introduction of CEPH_FEATURE_OSD_SNAPMAPPER caused the feature
CEPH_FEATURE_OSD_PRIMARY_AFFINITY | \
CEPH_FEATURE_MSGR_KEEPALIVE2 | \
CEPH_FEATURE_OSD_POOLRESEND | \
+ CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2 | \
0ULL)
#define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL
ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_SINGLE_PAXOS);
ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_OSD_ERASURE_CODES);
ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_OSDMAP_ENC);
+ ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_ERASURE_CODE_PLUGINS_V2);
return CompatSet(ceph_mon_feature_compat, ceph_mon_feature_ro_compat,
ceph_mon_feature_incompat);
}
if (quorum_features & CEPH_FEATURE_OSDMAP_ENC) {
new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_OSDMAP_ENC);
}
-
+ if (quorum_features & CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2) {
+ new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_ERASURE_CODE_PLUGINS_V2);
+ }
if (new_features.compare(features) != 0) {
CompatSet diff = features.unsupported(new_features);
dout(1) << __func__ << " enabling new quorum features: " << diff << dendl;
if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_OSDMAP_ENC)) {
required_features |= CEPH_FEATURE_OSDMAP_ENC;
}
+ if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_ERASURE_CODE_PLUGINS_V2)) {
+ required_features |= CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2;
+ }
dout(10) << __func__ << " required_features " << required_features << dendl;
}
#define CEPH_MON_FEATURE_INCOMPAT_SINGLE_PAXOS CompatSet::Feature (3, "single paxos with k/v store (v0.\?)")
#define CEPH_MON_FEATURE_INCOMPAT_OSD_ERASURE_CODES CompatSet::Feature(4, "support erasure code pools")
#define CEPH_MON_FEATURE_INCOMPAT_OSDMAP_ENC CompatSet::Feature(5, "new-style osdmap encoding")
+#define CEPH_MON_FEATURE_INCOMPAT_ERASURE_CODE_PLUGINS_V2 CompatSet::Feature(6, "support isa/lrc erasure code")
// make sure you add your feature to Monitor::get_supported_features
long parse_pos_long(const char *s, ostream *pss = NULL);
*
* Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
* Copyright (C) 2013,2014 Cloudwatt <libre.licensing@cloudwatt.com>
+ * Copyright (C) 2014 Red Hat <contact@redhat.com>
*
* Author: Loic Dachary <loic@dachary.org>
*
if ((osdmap.get_features(CEPH_ENTITY_TYPE_OSD, NULL) &
CEPH_FEATURE_OSD_ERASURE_CODES) &&
!(m->get_connection()->get_features() & CEPH_FEATURE_OSD_ERASURE_CODES)) {
- dout(0) << __func__ << " osdmap requires Erasure Codes but osd at "
+ dout(0) << __func__ << " osdmap requires erasure code but osd at "
+ << m->get_orig_source_inst()
+ << " doesn't announce support -- ignore" << dendl;
+ goto ignore;
+ }
+
+ if ((osdmap.get_features(CEPH_ENTITY_TYPE_OSD, NULL) &
+ CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2) &&
+ !(m->get_connection()->get_features() & CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2)) {
+ dout(0) << __func__ << " osdmap requires erasure code plugins v2 but osd at "
<< m->get_orig_source_inst()
<< " doesn't announce support -- ignore" << dendl;
goto ignore;
err = parse_erasure_code_profile(profile, &profile_map, ss);
if (err)
goto reply;
+ if (profile_map.find("plugin") == profile_map.end()) {
+ ss << "erasure-code-profile " << profile_map
+ << " must contain a plugin entry" << std::endl;
+ err = -EINVAL;
+ goto reply;
+ }
+ string plugin = profile_map["plugin"];
if (osdmap.has_erasure_code_profile(name)) {
if (osdmap.get_erasure_code_profile(name) == profile_map) {
dout(20) << "erasure code profile " << name << " try again" << dendl;
goto wait;
} else {
+ if (plugin == "isa" || plugin == "lrc") {
+ err = check_cluster_features(CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2, ss);
+ if (err == -EAGAIN)
+ goto wait;
+ if (err)
+ goto reply;
+ }
dout(20) << "erasure code profile " << name << " set" << dendl;
pending_inc.set_erasure_code_profile(name, profile_map);
}
features |= CEPH_FEATURE_CRUSH_TUNABLES3;
}
}
+ if (entity_type == CEPH_ENTITY_TYPE_OSD) {
+ for (map<string,map<string,string> >::const_iterator p = erasure_code_profiles.begin();
+ p != erasure_code_profiles.end();
+ p++) {
+ const map<string,string> &profile = p->second;
+ map<string,string>::const_iterator plugin = profile.find("plugin");
+ if (plugin != profile.end() && (plugin->second == "isa" ||
+ plugin->second == "lrc"))
+ features |= CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2;
+ }
+ }
mask |= CEPH_FEATURE_OSDHASHPSPOOL | CEPH_FEATURE_OSD_CACHEPOOL;
if (entity_type != CEPH_ENTITY_TYPE_CLIENT)
mask |= CEPH_FEATURE_OSD_ERASURE_CODES;