void FSMap::insert(const MDSMap::mds_info_t &new_info)
{
+ static const CompatSet empty;
+
ceph_assert(new_info.state == MDSMap::STATE_STANDBY);
ceph_assert(new_info.rank == MDS_RANK_NONE);
mds_roles[new_info.global_id] = FS_CLUSTER_ID_NONE;
- standby_daemons[new_info.global_id] = new_info;
+ auto& info = standby_daemons[new_info.global_id];
+ info = new_info;
+ if (empty.compare(info.compat) == 0) {
+ // bootstrap old compat: boot beacon contains empty compat on old (v16.2.4
+ // or older) MDS.
+ info.compat = MDSMap::get_compat_set_v16_2_4();
+ }
standby_epochs[new_info.global_id] = epoch;
}
return CompatSet(feature_compat_base, feature_ro_compat_base, feature_incompat_base);
}
+// pre-v16.2.5 CompatSet in MDS beacon
+CompatSet MDSMap::get_compat_set_v16_2_4() {
+ CompatSet::FeatureSet feature_compat;
+ CompatSet::FeatureSet feature_ro_compat;
+ CompatSet::FeatureSet feature_incompat;
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_BASE);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_CLIENTRANGES);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_FILELAYOUT);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_DIRINODE);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_ENCODING);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_OMAPDIRFRAG);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_NOANCHOR);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_FILE_LAYOUT_V2);
+ feature_incompat.insert(MDS_FEATURE_INCOMPAT_SNAPREALM_V2);
+ return CompatSet(feature_compat, feature_ro_compat, feature_incompat);
+}
+
void MDSMap::mds_info_t::dump(Formatter *f) const
{
f->dump_unsigned("gid", global_id);
}
if (struct_v >= 10) {
decode(compat, bl);
+ } else {
+ compat = MDSMap::get_compat_set_v16_2_4();
}
DECODE_FINISH(bl);
}
static CompatSet get_compat_set_all();
static CompatSet get_compat_set_default();
static CompatSet get_compat_set_base(); // pre v0.20
+ static CompatSet get_compat_set_v16_2_4(); // pre-v16.2.5 CompatSet in MDS beacon
static MDSMap create_null_mdsmap() {
MDSMap null_map;