From 6f6fe39558a7e53e91be2047d7697ece37b23bf4 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 9 Oct 2015 10:59:54 -0400 Subject: [PATCH] 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 --- src/messages/MOSDOp.h | 75 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/src/messages/MOSDOp.h b/src/messages/MOSDOp.h index f0357ed29531f..19550bf20ae3a 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; } -- 2.39.5