From: Greg Farnum Date: Tue, 27 Aug 2013 18:02:44 +0000 (-0700) Subject: MOSDOpReply: add enough fields to be backwards compatible. X-Git-Tag: v0.69~40^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=de20997445803dca4225ed0dac1bad6a8a1e6512;p=ceph.git MOSDOpReply: add enough fields to be backwards compatible. The system we've been building up works out very nicely for new clients, but they could not have interoperated with old clients that were only referring to our replay_version. In order to deal with this, we add a bad_replay_version to MOSDOpReply which is encoded where we used to encode replay_version. bad_replay_version will follow the same semantics as reassert_version used to (except that it is filled in on reads), but is not accessible to new clients, who can see only our properly-controlled replay_version and user_version. This will let old and new clients interoperate correctly when communicating about watches, etc. Signed-off-by: Greg Farnum --- diff --git a/src/messages/MOSDOpReply.h b/src/messages/MOSDOpReply.h index 7028a65232cb..cd5a5113b564 100644 --- a/src/messages/MOSDOpReply.h +++ b/src/messages/MOSDOpReply.h @@ -39,6 +39,7 @@ class MOSDOpReply : public Message { vector ops; int64_t flags; int32_t result; + eversion_t bad_replay_version; eversion_t replay_version; version_t user_version; epoch_t osdmap_epoch; @@ -57,6 +58,7 @@ public: version_t get_user_version() { return user_version; } void set_result(int r) { result = r; } + void set_bad_replay_version(eversion_t v) { bad_replay_version = v; } void set_replay_version(eversion_t v) { replay_version = v; } void set_user_version(version_t v) { user_version = v; } @@ -125,7 +127,7 @@ public: head.layout.ol_pgid = pgid.get_old_pg().v; head.flags = flags; head.osdmap_epoch = osdmap_epoch; - head.reassert_version = replay_version; + head.reassert_version = bad_replay_version; head.result = result; head.num_ops = ops.size(); head.object_len = oid.name.length(); @@ -139,7 +141,7 @@ public: ::encode(pgid, payload); ::encode(flags, payload); ::encode(result, payload); - ::encode(replay_version, payload); + ::encode(bad_replay_version, payload); ::encode(osdmap_epoch, payload); __u32 num_ops = ops.size(); @@ -152,6 +154,7 @@ public: for (unsigned i = 0; i < num_ops; i++) ::encode(ops[i].rval, payload); + ::encode(replay_version, payload); ::encode(user_version, payload); } } @@ -177,7 +180,7 @@ public: ::decode(pgid, p); ::decode(flags, p); ::decode(result, p); - ::decode(replay_version, p); + ::decode(bad_replay_version, p); ::decode(osdmap_epoch, p); __u32 num_ops = ops.size(); @@ -198,9 +201,11 @@ public: OSDOp::split_osd_op_vector_out_data(ops, data); } - if (header.version >= 5) + if (header.version >= 5) { + ::decode(replay_version, p); ::decode(user_version, p); - else + } else + replay_version = bad_replay_version; user_version = replay_version.version; } }