]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
messages/MOSDBoot: fix compat with pre-nautilus
authorSage Weil <sage@redhat.com>
Mon, 19 Nov 2018 14:53:19 +0000 (08:53 -0600)
committerSage Weil <sage@redhat.com>
Fri, 21 Dec 2018 21:31:32 +0000 (15:31 -0600)
We can't make an addr -> addrvec transition without a compat encoding,
unfortunately (I screwed this one up back when then ADDR2 feature was
introduced).

Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MOSDBoot.h

index eeaa7fefe5087925e6dcbf254198601018ec62d3..f0a5da59a8b35f199ad745f0f4ea73f7992e4c31 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "messages/PaxosServiceMessage.h"
 
+#include "include/ceph_features.h"
 #include "include/types.h"
 #include "osd/osd_types.h"
 
@@ -24,8 +25,8 @@ class MOSDBoot : public MessageInstance<MOSDBoot, PaxosServiceMessage> {
 public:
   friend factory;
 private:
-  static constexpr int HEAD_VERSION = 6;
-  static constexpr int COMPAT_VERSION = 6;
+  static constexpr int HEAD_VERSION = 7;
+  static constexpr int COMPAT_VERSION = 7;
 
  public:
   OSDSuperblock sb;
@@ -65,8 +66,22 @@ public:
   }
   
   void encode_payload(uint64_t features) override {
+    header.version = HEAD_VERSION;
+    header.compat_version = COMPAT_VERSION;
     using ceph::encode;
     paxos_encode();
+    if (!HAVE_FEATURE(features, SERVER_NAUTILUS)) {
+      header.version = 6;
+      header.compat_version = 6;
+      encode(sb, payload);
+      hb_back_addrs.legacy_addr().encode(payload, features);
+      cluster_addrs.legacy_addr().encode(payload, features);
+      encode(boot_epoch, payload);
+      hb_front_addrs.legacy_addr().encode(payload, features);
+      encode(metadata, payload);
+      encode(osd_features, payload);
+      return;
+    }
     encode(sb, payload);
     encode(hb_back_addrs, payload, features);
     encode(cluster_addrs, payload, features);
@@ -78,6 +93,20 @@ public:
   void decode_payload() override {
     auto p = payload.cbegin();
     paxos_decode(p);
+    if (header.version < 7) {
+      entity_addr_t a;
+      decode(sb, p);
+      decode(a, p);
+      hb_back_addrs = entity_addrvec_t(a);
+      decode(a, p);
+      cluster_addrs = entity_addrvec_t(a);
+      decode(boot_epoch, p);
+      decode(a, p);
+      hb_front_addrs = entity_addrvec_t(a);
+      decode(metadata, p);
+      decode(osd_features, p);
+      return;
+    }
     decode(sb, p);
     decode(hb_back_addrs, p);
     decode(cluster_addrs, p);