From 0e33001e17238b192e1b47fcf22496e299b443cf Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 19 Jul 2017 21:13:35 +0800 Subject: [PATCH] messages/: always set header.version in encode_payload() 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 --- src/messages/MOSDPGInfo.h | 4 +++- src/messages/MOSDPGLog.h | 1 + src/messages/MOSDPGNotify.h | 4 +++- src/messages/MOSDPGQuery.h | 4 +++- src/messages/MOSDPGRemove.h | 4 +++- src/messages/MOSDPing.h | 7 ++++--- src/messages/MOSDRepOp.h | 1 + src/messages/MOSDRepOpReply.h | 1 + 8 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/messages/MOSDPGInfo.h b/src/messages/MOSDPGInfo.h index 810de9cea29b7..106c499cdde66 100644 --- a/src/messages/MOSDPGInfo.h +++ b/src/messages/MOSDPGInfo.h @@ -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 diff --git a/src/messages/MOSDPGLog.h b/src/messages/MOSDPGLog.h index beeda6b7a34ef..57c8a0efe7e7e 100644 --- a/src/messages/MOSDPGLog.h +++ b/src/messages/MOSDPGLog.h @@ -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; diff --git a/src/messages/MOSDPGNotify.h b/src/messages/MOSDPGNotify.h index a0b118aceb86d..a93dfce187403 100644 --- a/src/messages/MOSDPGNotify.h +++ b/src/messages/MOSDPGNotify.h @@ -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; diff --git a/src/messages/MOSDPGQuery.h b/src/messages/MOSDPGQuery.h index 8b58bc9a9f7af..bd6bf44150be2 100644 --- a/src/messages/MOSDPGQuery.h +++ b/src/messages/MOSDPGQuery.h @@ -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); diff --git a/src/messages/MOSDPGRemove.h b/src/messages/MOSDPGRemove.h index 5a716b4700d19..0a6afa507218d 100644 --- a/src/messages/MOSDPGRemove.h +++ b/src/messages/MOSDPGRemove.h @@ -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); diff --git a/src/messages/MOSDPing.h b/src/messages/MOSDPing.h index 0801e8a04ce64..c286319ebf81e 100644 --- a/src/messages/MOSDPing.h +++ b/src/messages/MOSDPing.h @@ -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; diff --git a/src/messages/MOSDRepOp.h b/src/messages/MOSDRepOp.h index 8b01131fec483..86653531f447f 100644 --- a/src/messages/MOSDRepOp.h +++ b/src/messages/MOSDRepOp.h @@ -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 { diff --git a/src/messages/MOSDRepOpReply.h b/src/messages/MOSDRepOpReply.h index c3e5e01004270..adeee9253738a 100644 --- a/src/messages/MOSDRepOpReply.h +++ b/src/messages/MOSDRepOpReply.h @@ -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 { -- 2.39.5