]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
messages/MOSDOp: decode complete message for v6, too.
authorSage Weil <sage@redhat.com>
Fri, 9 Oct 2015 14:59:54 +0000 (10:59 -0400)
committerSage Weil <sage@redhat.com>
Mon, 12 Oct 2015 12:29:12 +0000 (08:29 -0400)
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 <sage@redhat.com>
src/messages/MOSDOp.h

index f0357ed29531feabfafb55f49ae457e4d36b9c7b..19550bf20ae3af80c5291ab91ffd6519c57d35ff 100755 (executable)
@@ -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;
   }