]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
MOSDOpReply: add enough fields to be backwards compatible.
authorGreg Farnum <greg@inktank.com>
Tue, 27 Aug 2013 18:02:44 +0000 (11:02 -0700)
committerGreg Farnum <greg@inktank.com>
Wed, 28 Aug 2013 00:24:50 +0000 (17:24 -0700)
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 <greg@inktank.com>
src/messages/MOSDOpReply.h

index 7028a65232cbb6915ae37dfbe9192225269719c8..cd5a5113b564faba1add248e86beeeb1a70f062c 100644 (file)
@@ -39,6 +39,7 @@ class MOSDOpReply : public Message {
   vector<OSDOp> 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;
     }
   }