]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/messages/MOSDMap.h
update sources to 12.2.7
[ceph.git] / ceph / src / messages / MOSDMap.h
index 865642cf417c30f487fb3a698946a20e86f8075f..e77b4856cb9f478088794b16dddd2cdda4909e22 100644 (file)
@@ -26,6 +26,7 @@ class MOSDMap : public Message {
 
  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;
@@ -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<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);