#define CEPH_FEATURE_INDEP_PG_MAP (1<<17)
#define CEPH_FEATURE_CRUSH_TUNABLES (1<<18)
#define CEPH_FEATURE_CHUNKY_SCRUB (1<<19)
+#define CEPH_FEATURE_MON_GV (1<<21)
/*
* Features supported. Should be everything above.
CEPH_FEATURE_MONENC | \
CEPH_FEATURE_INDEP_PG_MAP | \
CEPH_FEATURE_CRUSH_TUNABLES | \
- CEPH_FEATURE_CHUNKY_SCRUB)
+ CEPH_FEATURE_CHUNKY_SCRUB | \
+ CEPH_FEATURE_MON_GV)
#define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL
paxos_recovered.insert(id);
if (paxos_recovered.size() == paxos.size()) {
dout(10) << "all paxos instances recovered, going writeable" << dendl;
+
+ if (!features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_GV) &&
+ (quorum_features & CEPH_FEATURE_MON_GV)) {
+ dout(0) << "setting CEPH_MON_FEATURE_INCOMPAT_GV" << dendl;
+ features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_GV);
+ write_features();
+ }
+
for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
finish_contexts(g_ceph_context, (*p)->waiting_for_active);
for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
paxos_recovered.insert(id);
if (paxos_recovered.size() == paxos.size()) {
dout(10) << "all paxos instances recovered/leased" << dendl;
+
+ if (!features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_GV) &&
+ (quorum_features & CEPH_FEATURE_MON_GV)) {
+ dout(0) << "setting CEPH_MON_FEATURE_INCOMPAT_GV" << dendl;
+ features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_GV);
+ write_features();
+ }
+
}
}
CompatSet::FeatureSet ceph_mon_feature_ro_compat;
CompatSet::FeatureSet ceph_mon_feature_incompat;
ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_BASE);
+ ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_GV);
return CompatSet(ceph_mon_feature_compat, ceph_mon_feature_ro_compat,
ceph_mon_feature_incompat);
}