read_features_off_disk(store, &features);
dout(10) << "features " << features << dendl;
- apply_compatset_features_to_quorum_requirements();
+ calc_quorum_requirements();
dout(10) << "required_features " << required_features << dendl;
}
write_features(t);
store->apply_transaction(t);
- apply_compatset_features_to_quorum_requirements();
+ calc_quorum_requirements();
}
}
assert(HAVE_FEATURE(quorum_con_features, SERVER_KRAKEN));
new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_KRAKEN);
}
+
dout(5) << __func__ << dendl;
_apply_compatset_features(new_features);
}
-void Monitor::apply_compatset_features_to_quorum_requirements()
+void Monitor::calc_quorum_requirements()
{
required_features = 0;
+
+ // compatset
if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_OSD_ERASURE_CODES)) {
required_features |= CEPH_FEATURE_OSD_ERASURE_CODES;
}
if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_KRAKEN)) {
required_features |= CEPH_FEATUREMASK_SERVER_KRAKEN;
}
+
+ // monmap
+ if (monmap->get_required_features().contains_all(
+ ceph::features::mon::FEATURE_KRAKEN)) {
+ required_features |= CEPH_FEATUREMASK_SERVER_KRAKEN;
+ }
+ if (monmap->get_required_features().contains_all(
+ ceph::features::mon::FEATURE_LUMINOUS)) {
+ required_features |= CEPH_FEATUREMASK_SERVER_LUMINOUS;
+ }
dout(10) << __func__ << " required_features " << required_features << dendl;
}
}
void apply_quorum_to_compatset_features();
void apply_monmap_to_compatset_features();
- void apply_compatset_features_to_quorum_requirements();
+ void calc_quorum_requirements();
private:
void _reset(); ///< called from bootstrap, start_, or join_election