case CRUSH_RULE_TYPE_ERASURE:
out << "\ttype erasure\n";
break;
+ case CRUSH_RULE_TYPE_MSR_FIRSTN:
+ out << "\ttype msr_firstn\n";
+ break;
+ case CRUSH_RULE_TYPE_MSR_INDEP:
+ out << "\ttype msr_indep\n";
+ break;
default:
out << "\ttype " << crush.get_rule_type(i) << "\n";
}
type = CRUSH_RULE_TYPE_REPLICATED;
else if (tname == "erasure")
type = CRUSH_RULE_TYPE_ERASURE;
+ else if (tname == "msr_firstn")
+ type = CRUSH_RULE_TYPE_MSR_FIRSTN;
+ else if (tname == "msr_indep")
+ type = CRUSH_RULE_TYPE_MSR_INDEP;
else
ceph_abort();
return false;
}
+bool CrushWrapper::has_msr_rules() const
+{
+ for (unsigned i=0; i<crush->max_rules; i++) {
+ if (is_msr_rule(i)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool CrushWrapper::is_msr_rule(unsigned ruleid) const
+{
+ if (ruleid >= crush->max_rules)
+ return false;
+
+ crush_rule *r = crush->rules[ruleid];
+ if (!r)
+ return false;
+
+ return r->type == CRUSH_RULE_TYPE_MSR_INDEP ||
+ r->type == CRUSH_RULE_TYPE_MSR_FIRSTN;
+}
+
bool CrushWrapper::has_choose_args() const
{
return !choose_args.empty();
f->dump_int("has_v4_buckets", (int)has_v4_buckets());
f->dump_int("require_feature_tunables5", (int)has_nondefault_tunables5());
f->dump_int("has_v5_rules", (int)has_v5_rules());
+ f->dump_int("has_msr_rules", (int)has_msr_rules());
}
void CrushWrapper::dump_choose_args(Formatter *f) const
bool has_v5_rules() const;
bool has_choose_args() const; // any choose_args
bool has_incompat_choose_args() const; // choose_args that can't be made compat
+ bool has_msr_rules() const;
bool is_v2_rule(unsigned ruleid) const;
bool is_v3_rule(unsigned ruleid) const;
bool is_v5_rule(unsigned ruleid) const;
+ bool is_msr_rule(unsigned ruleid) const;
std::string get_min_required_version() const {
- if (has_v5_rules() || has_nondefault_tunables5())
+ if (has_msr_rules())
+ return "squid";
+ else if (has_v5_rules() || has_nondefault_tunables5())
return "jewel";
else if (has_v4_buckets())
return "hammer";
step_emit );
crushrule = str_p("rule") >> !name >> '{'
>> (str_p("id") | str_p("ruleset")) >> posint
- >> str_p("type") >> ( str_p("replicated") | str_p("erasure") )
+ >> str_p("type") >> ( str_p("replicated") | str_p("erasure") | str_p("msr_firstn") | str_p("msr_indep") )
>> !(str_p("min_size") >> posint)
>> !(str_p("max_size") >> posint)
>> +step
DEFINE_CEPH_FEATURE(35, 1, OSD_CACHEPOOL) // 3.14
DEFINE_CEPH_FEATURE(36, 1, CRUSH_V2) // 3.14
DEFINE_CEPH_FEATURE(37, 1, EXPORT_PEER) // 3.14
-DEFINE_CEPH_FEATURE_RETIRED(38, 1, OSD_ERASURE_CODES, MIMIC, OCTOPUS)
+DEFINE_CEPH_FEATURE(38, 2, CRUSH_MSR) // X.XX TODOSAM kernel version?
// available
DEFINE_CEPH_FEATURE(39, 1, OSDMAP_ENC) // 3.15
DEFINE_CEPH_FEATURE(40, 1, MDS_INLINE_DATA) // 3.19
CEPH_FEATURE_OSD_CACHEPOOL | \
CEPH_FEATURE_CRUSH_V2 | \
CEPH_FEATURE_EXPORT_PEER | \
+ CEPH_FEATURE_CRUSH_MSR | \
CEPH_FEATURE_OSDMAP_ENC | \
CEPH_FEATURE_MDS_INLINE_DATA | \
CEPH_FEATURE_CRUSH_TUNABLES3 | \
CEPH_FEATURE_CRUSH_TUNABLES2 | \
CEPH_FEATURE_CRUSH_TUNABLES3 | \
CEPH_FEATURE_CRUSH_TUNABLES5 | \
+ CEPH_FEATURE_CRUSH_MSR | \
CEPH_FEATURE_CRUSH_V2 | \
CEPH_FEATURE_CRUSH_V4 | \
- CEPH_FEATUREMASK_CRUSH_CHOOSE_ARGS)
+ CEPH_FEATUREMASK_CRUSH_MSR)
/*
* make sure we don't try to use the reserved features
features |= CEPH_FEATURE_CRUSH_TUNABLES3;
if (crush->is_v5_rule(ruleid))
features |= CEPH_FEATURE_CRUSH_TUNABLES5;
+ if (crush->is_msr_rule(ruleid))
+ features |= CEPH_FEATURE_CRUSH_MSR;
}
}
mask |= CEPH_FEATURE_OSDHASHPSPOOL | CEPH_FEATURE_OSD_CACHEPOOL;
{
uint64_t f = get_features(CEPH_ENTITY_TYPE_CLIENT, nullptr);
+ if (HAVE_FEATURE(f, CRUSH_MSR)) { // TODOSAM -- add version right before merge
+ return ceph_release_t::squid; // v19.2.0
+ }
if (HAVE_FEATURE(f, OSDMAP_PG_UPMAP) || // v12.0.0-1733-g27d6f43
HAVE_FEATURE(f, CRUSH_CHOOSE_ARGS)) { // v12.0.1-2172-gef1ef28
return ceph_release_t::luminous; // v12.2.0