public:
uuid_d fsid;
+ uint64_t encode_features = 0;
map<epoch_t, bufferlist> maps;
map<epoch_t, bufferlist> incremental_maps;
epoch_t oldest_map =0, newest_map = 0;
MOSDMap() : Message(CEPH_MSG_OSD_MAP, HEAD_VERSION) { }
- MOSDMap(const uuid_d &f)
+ MOSDMap(const uuid_d &f, const uint64_t features)
: Message(CEPH_MSG_OSD_MAP, HEAD_VERSION),
- fsid(f),
+ fsid(f), encode_features(features),
oldest_map(0), newest_map(0) { }
private:
~MOSDMap() override {}
-
public:
// marshalling
void decode_payload() override {
void encode_payload(uint64_t features) override {
header.version = HEAD_VERSION;
::encode(fsid, payload);
- if ((features & CEPH_FEATURE_PGID64) == 0 ||
- (features & CEPH_FEATURE_PGPOOL3) == 0 ||
- (features & CEPH_FEATURE_OSDENC) == 0 ||
- (features & CEPH_FEATURE_OSDMAP_ENC) == 0 ||
- (features & CEPH_FEATURE_MSG_ADDR2) == 0 ||
- !HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+ if (OSDMap::get_significant_features(encode_features) !=
+ OSDMap::get_significant_features(features)) {
if ((features & CEPH_FEATURE_PGID64) == 0 ||
(features & CEPH_FEATURE_PGPOOL3) == 0)
header.version = 1; // old old_client version
OSDMap::Incremental inc;
bufferlist::iterator q = p->second.begin();
inc.decode(q);
+ // always encode with subset of osdmaps canonical features
+ uint64_t f = inc.encode_features & features;
p->second.clear();
if (inc.fullmap.length()) {
// embedded full map?
OSDMap m;
m.decode(inc.fullmap);
inc.fullmap.clear();
- m.encode(inc.fullmap, features | CEPH_FEATURE_RESERVED);
+ m.encode(inc.fullmap, f | CEPH_FEATURE_RESERVED);
}
if (inc.crush.length()) {
// embedded crush map
auto p = inc.crush.begin();
c.decode(p);
inc.crush.clear();
- c.encode(inc.crush, features);
+ c.encode(inc.crush, f);
}
- inc.encode(p->second, features | CEPH_FEATURE_RESERVED);
+ inc.encode(p->second, f | CEPH_FEATURE_RESERVED);
}
for (map<epoch_t,bufferlist>::iterator p = maps.begin();
p != maps.end();
++p) {
OSDMap m;
m.decode(p->second);
+ // always encode with subset of osdmaps canonical features
+ uint64_t f = m.get_encoding_features() & features;
p->second.clear();
- m.encode(p->second, features | CEPH_FEATURE_RESERVED);
+ m.encode(p->second, f | CEPH_FEATURE_RESERVED);
}
}
::encode(incremental_maps, payload);