From: Sage Weil Date: Fri, 9 Oct 2015 14:59:54 +0000 (-0400) Subject: messages/MOSDOp: decode complete message for v6, too. X-Git-Tag: v10.0.0~78^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6f6fe39558a7e53e91be2047d7697ece37b23bf4;p=ceph.git messages/MOSDOp: decode complete message for v6, too. We can't avoid this because we need the reqid before we've done the full decoding, and that is at the very end of v6. Too bad, so sad! Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDOp.h b/src/messages/MOSDOp.h index f0357ed29531..19550bf20ae3 100755 --- a/src/messages/MOSDOp.h +++ b/src/messages/MOSDOp.h @@ -378,9 +378,9 @@ struct ceph_osd_request_head { features = 0; reqid = osd_reqid_t(); OSDOp::split_osd_op_vector_in_data(ops, data); - // In old versions, final decoding is done in first step - final_decode_needed = false; + // we did the full decode + final_decode_needed = false; } else if (header.version < 7) { ::decode(client_inc, p); ::decode(osdmap_epoch, p); @@ -398,26 +398,6 @@ struct ceph_osd_request_head { ::decode(pgid, p); } - } else { - // new, v7 decode, splitted to partial and final - ::decode(pgid, p); - ::decode(osdmap_epoch, p); - ::decode(flags, p); - ::decode(reassert_version, p); - ::decode(reqid, 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 - - if (header.version < 7) { ::decode(oid, p); //::decode(ops, p); @@ -448,29 +428,46 @@ struct ceph_osd_request_head { OSDOp::split_osd_op_vector_in_data(ops, data); - } else { // final decoding for reordered v7 - ::decode(client_inc, p); - ::decode(mtime, p); - ::decode(oloc, p); - ::decode(oid, p); + // we did the full decode + final_decode_needed = false; + } else { + // new, v7 decode, splitted to partial and final + ::decode(pgid, p); + ::decode(osdmap_epoch, p); + ::decode(flags, p); + ::decode(reassert_version, p); + ::decode(reqid, p); + } - __u16 num_ops; - ::decode(num_ops, p); - ops.resize(num_ops); - for (unsigned i = 0; i < num_ops; i++) - ::decode(ops[i].op, p); + partial_decode_needed = false; + } - ::decode(snapid, p); - ::decode(snap_seq, p); - ::decode(snaps, p); + void finish_decode() { + assert(!partial_decode_needed); // partial decoding required + if (!final_decode_needed) + return; // Message is already final decoded + assert(header.version >= 7); - ::decode(retry_attempt, p); + ::decode(client_inc, p); + ::decode(mtime, p); + ::decode(oloc, p); + ::decode(oid, p); - ::decode(features, p); + __u16 num_ops; + ::decode(num_ops, p); + ops.resize(num_ops); + for (unsigned i = 0; i < num_ops; i++) + ::decode(ops[i].op, p); - OSDOp::split_osd_op_vector_in_data(ops, data); + ::decode(snapid, p); + ::decode(snap_seq, p); + ::decode(snaps, p); - } + ::decode(retry_attempt, p); + + ::decode(features, p); + + OSDOp::split_osd_op_vector_in_data(ops, data); final_decode_needed = false; }