]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
messages/: always set header.version in encode_payload()
authorKefu Chai <kchai@redhat.com>
Wed, 19 Jul 2017 13:13:35 +0000 (21:13 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 19 Jul 2017 13:30:25 +0000 (21:30 +0800)
we encode the payload w/o the writelock even can_write == NOWRITE, if
the message "can_fast_prepare". in that case, the "feature" of the
connection is 0, as no handshake happens yet. so the header.version is
always set to a version compatible with pre-luminous. but when the
message is re-encoded when the connection is re-established with feature
with luminous, the header.version is not set back to HEADER_VERSION.
that's why the message's encoding is not consistent with header.version
sometimes.

in this change, we always set the header.version in encode_payload(), so
it's consistent even after connection reset and message re-encoding.

Fixes: http://tracker.ceph.com/issues/19939
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/messages/MOSDPGInfo.h
src/messages/MOSDPGLog.h
src/messages/MOSDPGNotify.h
src/messages/MOSDPGQuery.h
src/messages/MOSDPGRemove.h
src/messages/MOSDPing.h
src/messages/MOSDRepOp.h
src/messages/MOSDRepOpReply.h

index 810de9cea29b7974fc21775617b7a5af11597295..106c499cdde66447a2bc480fadd2a32fac7a8585 100644 (file)
@@ -58,7 +58,9 @@ public:
   }
 
   void encode_payload(uint64_t features) override {
-    if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+    if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
+    } else {
       header.version = 4;
 
       // for kraken+jewel only
index beeda6b7a34ef22ecb6d27f9df567018e3657ba7..57c8a0efe7e7e666ead11c1d1d6c64791bc3b203 100644 (file)
@@ -82,6 +82,7 @@ public:
     ::encode(missing, payload);
     ::encode(query_epoch, payload);
     if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
       ::encode(past_intervals, payload);
     } else {
       header.version = 4;
index a0b118aceb86d5b043f34a9d4300c91fc579afde..a93dfce187403bde568d2ffcc8ad1dca5f986208 100644 (file)
@@ -58,7 +58,9 @@ public:
   const char *get_type_name() const override { return "PGnot"; }
 
   void encode_payload(uint64_t features) override {
-    if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+    if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
+    } else {
       // for jewel+kraken compat only
       header.version = 5;
 
index 8b58bc9a9f7afde949b1d0fea17b5eaf5c9e5288..bd6bf44150be2c2aaeb5fc4ebc114d3d0ae5a14c 100644 (file)
@@ -63,7 +63,9 @@ public:
   }
 
   void encode_payload(uint64_t features) override {
-    if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+    if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
+    } else {
       // for kraken/jewel only
       header.version = 3;
       ::encode(epoch, payload);
index 5a716b4700d19084a9a48d89b9c4962b0e214323..0a6afa507218d8bf21e3b426335e8d460aacbeec 100644 (file)
@@ -46,7 +46,9 @@ public:
   const char *get_type_name() const override { return "PGrm"; }
 
   void encode_payload(uint64_t features) override {
-    if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+    if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
+    } else {
       // for jewel+kraken
       header.version = 2;
       ::encode(epoch, payload);
index 0801e8a04ce64c4e15297c3263bf0993963dd79c..c286319ebf81ecad8f803453f48b7ff1619c7127 100644 (file)
@@ -102,7 +102,10 @@ public:
     ::encode(map_epoch, payload);
     
     // with luminous, we drop peer_as_of_epoch and peer_stat
-    if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) { 
+    if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
+      ::encode(op, payload);
+    } else {
       epoch_t dummy_epoch = {};
       osd_peer_stat_t dummy_stat = {};
       header.version = 3;
@@ -110,8 +113,6 @@ public:
       ::encode(dummy_epoch, payload);
       ::encode(op, payload);   
       ::encode(dummy_stat, payload);
-    } else {
-      ::encode(op, payload);
     }
     ::encode(stamp, payload);
     size_t s = 0;
index 8b01131fec483a5b99236e5daf807f815d0f962c..86653531f447f328b44ee3772335bc1d43118b50 100644 (file)
@@ -115,6 +115,7 @@ public:
   void encode_payload(uint64_t features) override {
     ::encode(map_epoch, payload);
     if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
       ::encode(min_epoch, payload);
       encode_trace(payload, features);
     } else {
index c3e5e010042702e4d53687d6fcff934c586f0806..adeee9253738a7f8e39236af1e0040b4b8cbc152 100644 (file)
@@ -86,6 +86,7 @@ public:
   void encode_payload(uint64_t features) override {
     ::encode(map_epoch, payload);
     if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
+      header.version = HEAD_VERSION;
       ::encode(min_epoch, payload);
       encode_trace(payload, features);
     } else {