]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG,Objecter: copy_get should include truncate_seq and size 5885/head
authorSamuel Just <sjust@redhat.com>
Thu, 30 Jul 2015 23:59:32 +0000 (16:59 -0700)
committerAbhishek Varshney <abhishek.varshney@flipkart.com>
Fri, 11 Sep 2015 10:35:28 +0000 (16:05 +0530)
Otherwise, we break CephFS over cache tiers.

Fixes: #12551
Signed-off-by: Samuel Just <sjust@redhat.com>
(cherry picked from commit 6f9ee7961eee9ee3a61a07cbe0d8d289ee98fa9a)

Conflicts:
src/osd/ReplicatedPG.cc

src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osd/osd_types.cc
src/osd/osd_types.h
src/osdc/Objecter.h

index 6b22c3a845a68c942bcc1e73794dd466464d6110..f74713993030f245132027e1a9a1acd641a47989 100644 (file)
@@ -5999,6 +5999,8 @@ int ReplicatedPG::fill_in_copy_get(
     reply_obj.flags |= object_copy_data_t::FLAG_OMAP_DIGEST;
     reply_obj.omap_digest = oi.omap_digest;
   }
+  reply_obj.truncate_seq = oi.truncate_seq;
+  reply_obj.truncate_size = oi.truncate_size;
 
   // attrs
   map<string,bufferlist>& out_attrs = reply_obj.attrs;
@@ -6188,6 +6190,8 @@ void ReplicatedPG::_copy_some(ObjectContextRef obc, CopyOpRef cop)
              &cop->results.source_data_digest,
              &cop->results.source_omap_digest,
              &cop->results.reqids,
+             &cop->results.truncate_seq,
+             &cop->results.truncate_size,
              &cop->rval);
 
   C_Copyfrom *fin = new C_Copyfrom(this, obc->obs.oi.soid,
@@ -6285,6 +6289,8 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r)
   cop->results.final_tx = pgbackend->get_transaction();
   _build_finish_copy_transaction(cop, cop->results.final_tx);
 
+  derr << __func__ << " got truncate_seq " << cop->results.truncate_seq
+       << " " << cop->results.truncate_size << dendl;
   // verify digests?
   dout(20) << __func__ << std::hex
           << " got digest: rx data 0x" << cop->results.data_digest
@@ -6485,6 +6491,9 @@ void ReplicatedPG::finish_copyfrom(OpContext *ctx)
   obs.oi.set_data_digest(cb->results->data_digest);
   obs.oi.set_omap_digest(cb->results->omap_digest);
 
+  obs.oi.truncate_seq = cb->results->truncate_seq;
+  obs.oi.truncate_size = cb->results->truncate_size;
+
   ctx->extra_reqids = cb->results->reqids;
 
   // cache: clear whiteout?
@@ -6660,6 +6669,13 @@ void ReplicatedPG::finish_promote(int r, CopyResults *results,
     }
     tctx->new_obs.oi.size = results->object_size;
     tctx->new_obs.oi.user_version = results->user_version;
+    // Don't care src object whether have data or omap digest
+    if (results->object_size)
+      tctx->new_obs.oi.set_data_digest(results->data_digest);
+    if (results->has_omap)
+      tctx->new_obs.oi.set_omap_digest(results->omap_digest);
+    tctx->new_obs.oi.truncate_seq = results->truncate_seq;
+    tctx->new_obs.oi.truncate_size = results->truncate_size;
 
     if (soid.snap != CEPH_NOSNAP) {
       tctx->new_obs.oi.snaps = results->snaps;
index 5b5bc23cb5c50785cc4df5dadcbe64d8c0a8f3a8..48e0def334ef8893ec32caddc125f796e384f0f7 100644 (file)
@@ -127,6 +127,8 @@ public:
     uint32_t source_data_digest, source_omap_digest;
     uint32_t data_digest, omap_digest;
     vector<pair<osd_reqid_t, version_t> > reqids; // [(reqid, user_version)]
+    uint64_t truncate_seq;
+    uint64_t truncate_size;
     bool is_data_digest() {
       return flags & object_copy_data_t::FLAG_DATA_DIGEST;
     }
@@ -140,7 +142,8 @@ public:
        has_omap(false),
        flags(0),
        source_data_digest(-1), source_omap_digest(-1),
-       data_digest(-1), omap_digest(-1)
+       data_digest(-1), omap_digest(-1),
+       truncate_seq(0), truncate_size(0)
     {}
   };
 
index add13444ccb447ffac608ea7ff687e1b607577e6..b2bea5b7204e4b93c48256c2039e823e0333bb4b 100644 (file)
@@ -3599,7 +3599,7 @@ void object_copy_data_t::encode(bufferlist& bl, uint64_t features) const
     return;
   }
 
-  ENCODE_START(6, 5, bl);
+  ENCODE_START(7, 5, bl);
   ::encode(size, bl);
   ::encode(mtime, bl);
   ::encode(attrs, bl);
@@ -3613,12 +3613,14 @@ void object_copy_data_t::encode(bufferlist& bl, uint64_t features) const
   ::encode(data_digest, bl);
   ::encode(omap_digest, bl);
   ::encode(reqids, bl);
+  ::encode(truncate_seq, bl);
+  ::encode(truncate_size, bl);
   ENCODE_FINISH(bl);
 }
 
 void object_copy_data_t::decode(bufferlist::iterator& bl)
 {
-  DECODE_START(6, bl);
+  DECODE_START(7, bl);
   if (struct_v < 5) {
     // old
     ::decode(size, bl);
@@ -3676,6 +3678,10 @@ void object_copy_data_t::decode(bufferlist::iterator& bl)
     if (struct_v >= 6) {
       ::decode(reqids, bl);
     }
+    if (struct_v >= 7) {
+      ::decode(truncate_seq, bl);
+      ::decode(truncate_size, bl);
+    }
   }
   DECODE_FINISH(bl);
 }
index d48a2e145e48fb3ccb3b95d9c249bbe632c2f620..b9b3b8150ab97759219199875072505dacb0defe 100644 (file)
@@ -2606,9 +2606,15 @@ struct object_copy_data_t {
   ///< recent reqids on this object
   vector<pair<osd_reqid_t, version_t> > reqids;
 
+  uint64_t truncate_seq;
+  uint64_t truncate_size;
+
 public:
-  object_copy_data_t() : size((uint64_t)-1), data_digest(-1),
-                        omap_digest(-1), flags(0) {}
+  object_copy_data_t() :
+    size((uint64_t)-1), data_digest(-1),
+    omap_digest(-1), flags(0),
+    truncate_seq(0),
+    truncate_size(0) {}
 
   static void generate_test_instances(list<object_copy_data_t*>& o);
   void encode_classic(bufferlist& bl) const;
index 244efc4d9c8b286e79bc350f5d8b5ba3e52ea7ab..b9fd0cd6c12bd097cf483940417c75f213cd0c93 100644 (file)
@@ -633,6 +633,8 @@ struct ObjectOperation {
     uint32_t *out_data_digest;
     uint32_t *out_omap_digest;
     vector<pair<osd_reqid_t, version_t> > *out_reqids;
+    uint64_t *out_truncate_seq;
+    uint64_t *out_truncate_size;
     int *prval;
     C_ObjectOperation_copyget(object_copy_cursor_t *c,
                              uint64_t *s,
@@ -646,13 +648,18 @@ struct ObjectOperation {
                              uint32_t *dd,
                              uint32_t *od,
                              vector<pair<osd_reqid_t, version_t> > *oreqids,
+                             uint64_t *otseq,
+                             uint64_t *otsize,
                              int *r)
       : cursor(c),
        out_size(s), out_mtime(m),
        out_attrs(a), out_data(d), out_omap_header(oh),
        out_omap_data(o), out_snaps(osnaps), out_snap_seq(osnap_seq),
        out_flags(flags), out_data_digest(dd), out_omap_digest(od),
-        out_reqids(oreqids), prval(r) {}
+        out_reqids(oreqids),
+        out_truncate_seq(otseq),
+        out_truncate_size(otsize),
+        prval(r) {}
     void finish(int r) {
       if (r < 0)
        return;
@@ -684,6 +691,10 @@ struct ObjectOperation {
          *out_omap_digest = copy_reply.omap_digest;
        if (out_reqids)
          *out_reqids = copy_reply.reqids;
+       if (out_truncate_seq)
+         *out_truncate_seq = copy_reply.truncate_seq;
+       if (out_truncate_size)
+         *out_truncate_size = copy_reply.truncate_size;
        *cursor = copy_reply.cursor;
       } catch (buffer::error& e) {
        if (prval)
@@ -706,6 +717,8 @@ struct ObjectOperation {
                uint32_t *out_data_digest,
                uint32_t *out_omap_digest,
                vector<pair<osd_reqid_t, version_t> > *out_reqids,
+               uint64_t *truncate_seq,
+               uint64_t *truncate_size,
                int *prval) {
     OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_GET);
     osd_op.op.copy_get.max = max;
@@ -718,7 +731,8 @@ struct ObjectOperation {
                                     out_attrs, out_data, out_omap_header,
                                    out_omap_data, out_snaps, out_snap_seq,
                                    out_flags, out_data_digest, out_omap_digest,
-                                   out_reqids, prval);
+                                   out_reqids, truncate_seq, truncate_size,
+                                   prval);
     out_bl[p] = &h->bl;
     out_handler[p] = h;
   }