]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
MOSDRepOpReply: Simple Messenger optimization 6503/head
authorXinze Chi <xinze@xsky.com>
Mon, 9 Nov 2015 11:58:03 +0000 (19:58 +0800)
committerXinze Chi <xinze@xsky.com>
Mon, 9 Nov 2015 14:21:06 +0000 (22:21 +0800)
the origin idea is from https://github.com/ceph/ceph/pull/5211.

Signed-off-by: Xinze Chi <xinze@xsky.com>
src/messages/MOSDRepOpReply.h
src/messages/MOSDSubOpReply.h
src/osd/ReplicatedBackend.cc

index f0faa4c022994b6a93fad9e47da134674b85089b..1632ffbf4b39447e174dfbfa9b3e95f8723ec689 100644 (file)
@@ -46,18 +46,26 @@ public:
   // piggybacked osd state
   eversion_t last_complete_ondisk;
 
+  bufferlist::iterator p;
+  // Decoding flags. Decoding is only needed for messages catched by pipe reader.
+  bool final_decode_needed;
 
   virtual void decode_payload() {
-    bufferlist::iterator p = payload.begin();
+    p = payload.begin();
     ::decode(map_epoch, p);
     ::decode(reqid, p);
     ::decode(pgid, p);
+  }
 
+  void finish_decode() {
+    if (!final_decode_needed)
+      return; // Message is already final decoded
     ::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) {
     ::encode(map_epoch, payload);
@@ -91,12 +99,14 @@ public:
     from(from),
     pgid(req->pgid.pgid, req->from.shard),
     ack_type(at),
-    result(result_) {
+    result(result_),
+    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),
+      final_decode_needed(true) {}
 private:
   ~MOSDRepOpReply() {}
 
@@ -105,14 +115,16 @@ public:
 
   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;
+        << " " << pgid;
+    if (!final_decode_needed) {
+      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 << ")";
   }
 
index a084246e7f94e3aa483387a786b9367738634d1d..81d1b2836de3760c8a933d500b86465e7737cf26 100644 (file)
@@ -85,6 +85,9 @@ public:
       pgid.shard = shard_id_t::NO_SHARD;
     }
   }
+
+  void finish_decode() { }
+
   virtual void encode_payload(uint64_t features) {
     ::encode(map_epoch, payload);
     ::encode(reqid, payload);
index 63c7d93f1c57730019c3d118513c45ed1252590e..daa96e2917245950e6f93cfa7dfd44785d771cbc 100644 (file)
@@ -666,6 +666,7 @@ template<typename T, int MSGTYPE>
 void ReplicatedBackend::sub_op_modify_reply(OpRequestRef op)
 {
   T *r = static_cast<T *>(op->get_req());
+  r->finish_decode();
   assert(r->get_header().type == MSGTYPE);
   assert(MSGTYPE == MSG_OSD_SUBOPREPLY || MSGTYPE == MSG_OSD_REPOPREPLY);