]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: include snap_seq in copy-get results
authorSage Weil <sage@inktank.com>
Mon, 30 Dec 2013 19:47:33 +0000 (11:47 -0800)
committerSage Weil <sage@inktank.com>
Tue, 14 Jan 2014 00:19:47 +0000 (16:19 -0800)
This is needed by the cache layer when reading a logical snap from a head
object on the backend in order to correctly recreate the clone in the
cache layer.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osd/osd_types.cc
src/osd/osd_types.h
src/osdc/Objecter.h

index 2605d5df2ffa899d515615805c1b392ef2d8d52e..e370e3feede2453edc8d3187685436d7ab7badf4 100644 (file)
@@ -4027,14 +4027,14 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
     case CEPH_OSD_OP_COPY_GET_CLASSIC:
       ++ctx->num_read;
-      result = fill_in_copy_get(bp, osd_op, oi, true);
+      result = fill_in_copy_get(bp, osd_op, ctx->obc, true);
       if (result == -EINVAL)
        goto fail;
       break;
 
     case CEPH_OSD_OP_COPY_GET:
       ++ctx->num_read;
-      result = fill_in_copy_get(bp, osd_op, oi, false);
+      result = fill_in_copy_get(bp, osd_op, ctx->obc, false);
       if (result == -EINVAL)
        goto fail;
       break;
@@ -4752,8 +4752,9 @@ struct C_Copyfrom : public Context {
 };
 
 int ReplicatedPG::fill_in_copy_get(bufferlist::iterator& bp, OSDOp& osd_op,
-                                   object_info_t& oi, bool classic)
+                                   ObjectContextRef& obc, bool classic)
 {
+  object_info_t& oi = obc->obs.oi;
   hobject_t& soid = oi.soid;
   int result = 0;
   object_copy_cursor_t cursor;
@@ -4772,7 +4773,12 @@ int ReplicatedPG::fill_in_copy_get(bufferlist::iterator& bp, OSDOp& osd_op,
   reply_obj.size = oi.size;
   reply_obj.mtime = oi.mtime;
   reply_obj.category = oi.category;
-  reply_obj.snaps = oi.snaps;
+  if (soid.snap < CEPH_NOSNAP) {
+    reply_obj.snaps = oi.snaps;
+  } else {
+    assert(obc->ssc);
+    reply_obj.snap_seq = obc->ssc->snapset.seq;
+  }
 
   // attrs
   map<string,bufferlist>& out_attrs = reply_obj.attrs;
@@ -4920,7 +4926,7 @@ void ReplicatedPG::_copy_some(ObjectContextRef obc, CopyOpRef cop)
              &cop->results->object_size, &cop->results->mtime,
              &cop->results->category,
              &cop->attrs, &cop->data, &cop->omap_header, &cop->omap,
-             &cop->results->snaps,
+             &cop->results->snaps, &cop->results->snap_seq,
              &cop->rval);
 
   C_Copyfrom *fin = new C_Copyfrom(this, obc->obs.oi.soid,
index 82605f8fb06510a99a8a47cb96ba083a5035182b..692dec65b05bbffa4489d49efb80fb761cd122a0 100644 (file)
@@ -116,6 +116,7 @@ public:
     version_t user_version; ///< The copy source's user version
     bool should_requeue;  ///< op should be requeued on cancel
     vector<snapid_t> snaps;  ///< src's snaps (if clone)
+    snapid_t snap_seq;       ///< src's snap_seq (if head)
     librados::snap_set_t snapset; ///< src snapset (if head)
     bool mirror_snapset;
     CopyResults() : object_size(0), started_temp_obj(false),
@@ -965,7 +966,7 @@ protected:
   map<hobject_t, CopyOpRef> copy_ops;
 
   int fill_in_copy_get(bufferlist::iterator& bp, OSDOp& op,
-                       object_info_t& oi, bool classic);
+                       ObjectContextRef& obc, bool classic);
   /**
    * To copy an object, call start_copy.
    *
index ddb6243a1257f1e6f70e32bd2c2213e045d56c2b..855b5d85c598f61b859e02b1a412ae2c1c74b807 100644 (file)
@@ -2689,6 +2689,7 @@ void object_copy_data_t::encode(bufferlist& bl) const
   ::encode(cursor, bl);
   ::encode(omap_header, bl);
   ::encode(snaps, bl);
+  ::encode(snap_seq, bl);
   ENCODE_FINISH(bl);
 }
 
@@ -2704,8 +2705,13 @@ void object_copy_data_t::decode(bufferlist::iterator& bl)
   ::decode(cursor, bl);
   if (struct_v >= 2)
     ::decode(omap_header, bl);
-  if (struct_v >= 3)
+  if (struct_v >= 3) {
     ::decode(snaps, bl);
+    ::decode(snap_seq, bl);
+  } else {
+    snaps.clear();
+    snap_seq = 0;
+  }
   DECODE_FINISH(bl);
 }
 
index c000c309bb678106559b876983bf0f6be75dfc30..cf11aa1437e76d79b12abc7780dc0dbd7b17ae1c 100644 (file)
@@ -1964,6 +1964,8 @@ struct object_copy_data_t {
 
   /// which snaps we are defined for (if a snap and not the head)
   vector<snapid_t> snaps;
+  ///< latest snap seq for the object (if head)
+  snapid_t snap_seq;
 public:
   object_copy_data_t() : size((uint64_t)-1) {}
 
index 2f03a8f65e49fa6216bb9da560a57eda8a87c1a1..508cc379cb8e0e449ea36e98da498e3eaf929f84 100644 (file)
@@ -580,6 +580,7 @@ struct ObjectOperation {
     bufferlist *out_data, *out_omap_header;
     std::map<std::string,bufferlist> *out_omap;
     vector<snapid_t> *out_snaps;
+    snapid_t *out_snap_seq;
     int *prval;
     C_ObjectOperation_copyget(object_copy_cursor_t *c,
                              uint64_t *s,
@@ -589,11 +590,13 @@ struct ObjectOperation {
                              bufferlist *d, bufferlist *oh,
                              std::map<std::string,bufferlist> *o,
                              std::vector<snapid_t> *osnaps,
+                             snapid_t *osnap_seq,
                              int *r)
       : cursor(c),
        out_size(s), out_mtime(m), out_category(cat),
        out_attrs(a), out_data(d), out_omap_header(oh),
-       out_omap(o), out_snaps(osnaps), prval(r) {}
+       out_omap(o), out_snaps(osnaps), out_snap_seq(osnap_seq),
+       prval(r) {}
     void finish(int r) {
       if (r < 0)
        return;
@@ -617,6 +620,8 @@ struct ObjectOperation {
          *out_omap = copy_reply.omap;
        if (out_snaps)
          *out_snaps = copy_reply.snaps;
+       if (out_snap_seq)
+         *out_snap_seq = copy_reply.snap_seq;
        *cursor = copy_reply.cursor;
       } catch (buffer::error& e) {
        if (prval)
@@ -635,6 +640,7 @@ struct ObjectOperation {
                bufferlist *out_omap_header,
                std::map<std::string,bufferlist> *out_omap,
                vector<snapid_t> *out_snaps,
+               snapid_t *out_snap_seq,
                int *prval) {
     OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_GET);
     osd_op.op.copy_get.max = max;
@@ -645,7 +651,7 @@ struct ObjectOperation {
     C_ObjectOperation_copyget *h =
       new C_ObjectOperation_copyget(cursor, out_size, out_mtime, out_category,
                                     out_attrs, out_data, out_omap_header,
-                                   out_omap, out_snaps, prval);
+                                   out_omap, out_snaps, out_snap_seq, prval);
     out_bl[p] = &h->bl;
     out_handler[p] = h;
   }