]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: switch object_info_t::user_version to be a version_t
authorGreg Farnum <greg@inktank.com>
Wed, 21 Aug 2013 00:13:53 +0000 (17:13 -0700)
committerGreg Farnum <greg@inktank.com>
Wed, 28 Aug 2013 00:24:50 +0000 (17:24 -0700)
We never expose the full eversion_t data to users, and do not want to.
However, we pull some tricks in the encode/decode functions to avoid
having to change the object_info_t disk format for this change.
When we can break compatibility, we should simplify this.

Signed-off-by: Greg Farnum <greg@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/osd_types.cc
src/osd/osd_types.h

index 81b037c0523689857300f287141d740a7339e093..e42b532c50d8f18a5e18a294203c1a709a957537 100644 (file)
@@ -2432,9 +2432,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        uint64_t ver = op.watch.ver;
        if (!ver)
          result = -EINVAL;
-        else if (ver < oi.user_version.version)
+        else if (ver < oi.user_version)
          result = -ERANGE;
-       else if (ver > oi.user_version.version)
+       else if (ver > oi.user_version)
          result = -EOVERFLOW;
        break;
       }
@@ -2549,9 +2549,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        uint64_t ver = op.watch.ver;
        if (!ver)
          result = -EINVAL;
-        else if (ver < src_obc->obs.oi.user_version.version)
+        else if (ver < src_obc->obs.oi.user_version)
          result = -ERANGE;
-       else if (ver > src_obc->obs.oi.user_version.version)
+       else if (ver > src_obc->obs.oi.user_version)
          result = -EOVERFLOW;
        break;
       }
@@ -2832,7 +2832,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
        dout(10) << "watch: ctx->obc=" << (void *)obc << " cookie=" << cookie
                 << " oi.version=" << oi.version.version << " ctx->at_version=" << ctx->at_version << dendl;
-       dout(10) << "watch: oi.user_version=" << oi.user_version.version << dendl;
+       dout(10) << "watch: oi.user_version=" << oi.user_version<< dendl;
        dout(10) << "watch: peer_addr="
          << ctx->op->request->get_connection()->get_peer_addr() << dendl;
 
@@ -3720,7 +3720,7 @@ void ReplicatedPG::do_osd_op_effects(OpContext *ctx)
        p->timeout,
        p->cookie,
        osd->get_next_id(get_osdmap()->get_epoch()),
-       ctx->obc->obs.oi.user_version.version,
+       ctx->obc->obs.oi.user_version,
        osd));
     for (map<pair<uint64_t, entity_name_t>, WatchRef>::iterator i =
           ctx->obc->watchers.begin();
@@ -3792,7 +3792,7 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx)
 
   // read-op?  done?
   if (ctx->op_t.empty() && !ctx->modify) {
-    ctx->reply_user_version = ctx->obs->oi.user_version.version;
+    ctx->reply_user_version = ctx->obs->oi.user_version;
     unstable_stats.add(ctx->delta_stats, ctx->obc->obs.oi.category);
     return result;
   }
@@ -3852,9 +3852,9 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx)
   // finish and log the op.
   if (ctx->user_modify) {
     /* update the user_version for any modify ops, except for the watch op */
-    ctx->new_obs.oi.user_version = ctx->at_version;
+    ctx->new_obs.oi.user_version = ctx->at_version.version;
   }
-  ctx->reply_user_version = ctx->new_obs.oi.user_version.version;
+  ctx->reply_user_version = ctx->new_obs.oi.user_version;
   ctx->bytes_written = ctx->op_t.get_encoded_bytes();
  
   if (ctx->new_obs.exists) {
index ea3e5d5c3ebde95bf5836cde3ab01786d3623827..9594cc6057938ac371c581d18dc36af0836a63b9 100644 (file)
@@ -2688,7 +2688,10 @@ void object_info_t::encode(bufferlist& bl) const
   ::encode(truncate_size, bl);
   ::encode(lost, bl);
   ::encode(old_watchers, bl);
-  ::encode(user_version, bl);
+  /* shenanigans to avoid breaking backwards compatibility in the disk format.
+   * When we can, switch this out for simply putting the version_t on disk. */
+  eversion_t user_eversion(0, user_version);
+  ::encode(user_eversion, bl);
   ::encode(uses_tmap, bl);
   ::encode(watchers, bl);
   ENCODE_FINISH(bl);
@@ -2733,7 +2736,9 @@ void object_info_t::decode(bufferlist::iterator& bl)
     lost = false;
   if (struct_v >= 4) {
     ::decode(old_watchers, bl);
-    ::decode(user_version, bl);
+    eversion_t user_eversion;
+    ::decode(user_eversion, bl);
+    user_version = user_eversion.version;
   }
   if (struct_v >= 9)
     ::decode(uses_tmap, bl);
index 3cafdc2b03504a2430f028b9683d8c22636e9546..4c34e81871f6df44255bc8bb5ed427b5efcb55c8 100644 (file)
@@ -1952,7 +1952,7 @@ struct object_info_t {
   string category;
 
   eversion_t version, prior_version;
-  eversion_t user_version;
+  version_t user_version;
   osd_reqid_t last_reqid;
 
   uint64_t size;
@@ -1983,12 +1983,12 @@ struct object_info_t {
   static void generate_test_instances(list<object_info_t*>& o);
 
   explicit object_info_t()
-    : size(0), lost(false),
+    : user_version(0), size(0), lost(false),
       truncate_seq(0), truncate_size(0), uses_tmap(false)
   {}
 
   object_info_t(const hobject_t& s)
-    : soid(s), size(0),
+    : soid(s), user_version(0), size(0),
       lost(false), truncate_seq(0), truncate_size(0), uses_tmap(false) {}
 
   object_info_t(bufferlist& bl) {