]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG,Objecter: copy_get should include truncate_seq and size 5442/head
authorSamuel Just <sjust@redhat.com>
Thu, 30 Jul 2015 23:59:32 +0000 (16:59 -0700)
committerSage Weil <sage@redhat.com>
Wed, 9 Sep 2015 12:01:59 +0000 (08:01 -0400)
Otherwise, we break CephFS over cache tiers.

Fixes: #12551
Signed-off-by: Samuel Just <sjust@redhat.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osd/osd_types.cc
src/osd/osd_types.h
src/osdc/Objecter.h

index dcd11f5553f293e0a575573baa78b7f7c29ed176..902aba78f971520fc2cbe24a78c6eab1f8466bf4 100644 (file)
@@ -6044,6 +6044,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;
@@ -6242,6 +6244,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);
   op.set_last_op_flags(cop->src_obj_fadvise_flags);
 
@@ -6341,6 +6345,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?
   if (cop->results.is_data_digest() || cop->results.is_omap_digest()) {
     dout(20) << __func__ << std::hex
@@ -6545,6 +6551,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?
@@ -6726,6 +6735,8 @@ void ReplicatedPG::finish_promote(int r, CopyResults *results,
       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 9c280365da27f7f6b8053a138c0fd8a2ce1d202e..89794c24f2ba3dab3a41a56c004bdb1564438863 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 dbcbd3dab357a12ef6a4580c7aa5fc1a6da17bad..f0a1e4730f161dad39ccf00f887c8cf99dda8840 100644 (file)
@@ -3632,7 +3632,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);
@@ -3646,12 +3646,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);
@@ -3703,6 +3705,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 0c45f413ebc052b5b57bcdf0681009bb4743dce6..0bedb490481de61a4f2d197fabb728a0ad90e9ca 100644 (file)
@@ -2677,9 +2677,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 7c49efb95c14dd2123cee629923819c08c1e5ded..038e5f3b6e6c63aacfcd76672a9f6c58d7105d3b 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)
@@ -707,6 +718,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;
@@ -720,7 +733,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;
   }