X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;ds=sidebyside;f=ceph%2Fsrc%2Fmessages%2FMOSDMap.h;h=e77b4856cb9f478088794b16dddd2cdda4909e22;hb=28e407b858acd3bddc89f68583571f771bb42e46;hp=865642cf417c30f487fb3a698946a20e86f8075f;hpb=dfcb7b53b2e4fcd2a5af0240d4975adc711ab96e;p=ceph.git diff --git a/ceph/src/messages/MOSDMap.h b/ceph/src/messages/MOSDMap.h index 865642cf4..e77b4856c 100644 --- a/ceph/src/messages/MOSDMap.h +++ b/ceph/src/messages/MOSDMap.h @@ -26,6 +26,7 @@ class MOSDMap : public Message { public: uuid_d fsid; + uint64_t encode_features = 0; map maps; map incremental_maps; epoch_t oldest_map =0, newest_map = 0; @@ -57,13 +58,12 @@ class MOSDMap : public Message { 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 { @@ -82,12 +82,8 @@ public: 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 @@ -105,13 +101,15 @@ public: 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 @@ -119,17 +117,19 @@ public: 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::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);