From c8070d4e192b3f3a35d7f6a8244891f6c71a6bb5 Mon Sep 17 00:00:00 2001 From: Xinze Chi Date: Mon, 9 Nov 2015 19:58:03 +0800 Subject: [PATCH] MOSDRepOpReply: Simple Messenger optimization the origin idea is from https://github.com/ceph/ceph/pull/5211. Signed-off-by: Xinze Chi --- src/messages/MOSDRepOpReply.h | 69 +++++++++++++++++++++++++++-------- src/messages/MOSDSubOpReply.h | 3 ++ src/osd/ReplicatedBackend.cc | 1 + 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/messages/MOSDRepOpReply.h b/src/messages/MOSDRepOpReply.h index f0faa4c022994b..81bd47b73795ab 100644 --- a/src/messages/MOSDRepOpReply.h +++ b/src/messages/MOSDRepOpReply.h @@ -29,7 +29,7 @@ */ class MOSDRepOpReply : public Message { - static const int HEAD_VERSION = 1; + static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 1; public: epoch_t map_epoch; @@ -46,20 +46,50 @@ class MOSDRepOpReply : public Message { // piggybacked osd state eversion_t last_complete_ondisk; + bufferlist::iterator p; + // Decoding flags. Decoding is only needed for messages catched by pipe reader. + bool partial_decode_needed; + bool final_decode_needed; virtual void decode_payload() { - bufferlist::iterator p = payload.begin(); - ::decode(map_epoch, p); - ::decode(reqid, p); - ::decode(pgid, p); + p = payload.begin(); + if (header.version < 2) { + ::decode(map_epoch, p); + ::decode(reqid, p); + ::decode(pgid, p); + + ::decode(ack_type, p); + ::decode(result, p); + ::decode(last_complete_ondisk, p); + + ::decode(from, p); + } else { + // new, v2 decode, splitted to partial and final + ::decode(map_epoch, p); + ::decode(reqid, p); + ::decode(pgid, p); + } + partial_decode_needed = false; + } + void finish_decode() { + assert(!partial_decode_needed); // partial decoding required + if (!final_decode_needed) + return; // Message is already final decoded + assert(header.version >= 2); ::decode(ack_type, p); ::decode(result, p); ::decode(last_complete_ondisk, p); ::decode(from, p); + final_decode_needed = false; } virtual void encode_payload(uint64_t features) { + if ((features & CEPH_FEATURE_NEW_OSDREPOP_ENCODING) == 0) { + header.version = 1; + } else { + header.version = HEAD_VERSION; + } ::encode(map_epoch, payload); ::encode(reqid, payload); ::encode(pgid, payload); @@ -91,12 +121,16 @@ class MOSDRepOpReply : public Message { from(from), pgid(req->pgid.pgid, req->from.shard), ack_type(at), - result(result_) { + result(result_), + partial_decode_needed(false), + final_decode_needed(false) { set_tid(req->get_tid()); } MOSDRepOpReply() : Message(MSG_OSD_REPOPREPLY), map_epoch(0), - ack_type(0), result(0) {} + ack_type(0), result(0), + partial_decode_needed(true), + final_decode_needed(true) {} private: ~MOSDRepOpReply() {} @@ -104,15 +138,18 @@ class MOSDRepOpReply : public Message { const char *get_type_name() const { return "osd_repop_reply"; } void print(ostream& out) const { - out << "osd_repop_reply(" << reqid - << " " << pgid; - if (ack_type & CEPH_OSD_FLAG_ONDISK) - out << " ondisk"; - if (ack_type & CEPH_OSD_FLAG_ONNVRAM) - out << " onnvram"; - if (ack_type & CEPH_OSD_FLAG_ACK) - out << " ack"; - out << ", result = " << result; + out << "osd_repop_reply("; + if (!partial_decode_needed) { + out << reqid + << " " << pgid; + if (ack_type & CEPH_OSD_FLAG_ONDISK) + out << " ondisk"; + if (ack_type & CEPH_OSD_FLAG_ONNVRAM) + out << " onnvram"; + if (ack_type & CEPH_OSD_FLAG_ACK) + out << " ack"; + out << ", result = " << result; + } out << ")"; } diff --git a/src/messages/MOSDSubOpReply.h b/src/messages/MOSDSubOpReply.h index a084246e7f94e3..81d1b2836de376 100644 --- a/src/messages/MOSDSubOpReply.h +++ b/src/messages/MOSDSubOpReply.h @@ -85,6 +85,9 @@ class MOSDSubOpReply : public Message { pgid.shard = shard_id_t::NO_SHARD; } } + + void finish_decode() { } + virtual void encode_payload(uint64_t features) { ::encode(map_epoch, payload); ::encode(reqid, payload); diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 63c7d93f1c5773..daa96e29172459 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -666,6 +666,7 @@ template void ReplicatedBackend::sub_op_modify_reply(OpRequestRef op) { T *r = static_cast(op->get_req()); + r->finish_decode(); assert(r->get_header().type == MSGTYPE); assert(MSGTYPE == MSG_OSD_SUBOPREPLY || MSGTYPE == MSG_OSD_REPOPREPLY);