From: Sage Weil Date: Mon, 9 Jan 2012 01:23:57 +0000 (-0800) Subject: osd: mux/demux OSDOp::outdata in MOSDOpReply X-Git-Tag: v0.41~27^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a8558284db178cfaf07a20bc475e7366c7903ffd;p=ceph.git osd: mux/demux OSDOp::outdata in MOSDOpReply Bump encoding, so that we don't try to demux old encoded messages, which will likely have OSDOp::payload_len == indata.length(). Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDOpReply.h b/src/messages/MOSDOpReply.h index e8a0930c897f..b179a2cd8ef8 100644 --- a/src/messages/MOSDOpReply.h +++ b/src/messages/MOSDOpReply.h @@ -58,6 +58,16 @@ public: void add_flags(int f) { flags |= f; } + void claim_op_out_data(vector& o) { + assert(ops.size() == o.size()); + for (unsigned i = 0; i < o.size(); i++) { + ops[i].outdata.claim(o[i].outdata); + } + } + void claim_ops(vector& o) { + o.swap(ops); + } + /** * get retry attempt * @@ -88,6 +98,10 @@ public: osdmap_epoch = e; reassert_version = req->reassert_version; retry_attempt = req->get_retry_attempt(); + + // zero out ops payload_len + for (unsigned i = 0; i < ops.size(); i++) + ops[i].op.payload_len = 0; } MOSDOpReply() {} private: @@ -95,6 +109,9 @@ private: public: virtual void encode_payload(CephContext *cct) { + + merge_osd_op_vector_out_data(ops, data); + if (!connection->has_feature(CEPH_FEATURE_PGID64)) { ceph_osd_reply_head head; memset(&head, 0, sizeof(head)); @@ -110,7 +127,7 @@ public: } ::encode_nohead(oid.name, payload); } else { - header.version = 3; + header.version = 4; ::encode(oid, payload); ::encode(pgid, payload); ::encode(flags, payload); @@ -124,6 +141,9 @@ public: ::encode(ops[i].op, payload); ::encode(retry_attempt, payload); + + for (unsigned i = 0; i < num_ops; i++) + ::encode(ops[i].rval, payload); } } virtual void decode_payload(CephContext *cct) { @@ -160,6 +180,13 @@ public: ::decode(retry_attempt, p); else retry_attempt = -1; + + if (header.version >= 4) { + for (unsigned i = 0; i < num_ops; ++i) + ::decode(ops[i].rval, p); + + split_osd_op_vector_out_data(ops, data); + } } }