From: Sage Weil Date: Mon, 30 Dec 2013 19:47:33 +0000 (-0800) Subject: osd: include snap_seq in copy-get results X-Git-Tag: v0.77~22^2~20 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=21f3dcbd3308587a920f82cdcaf97e7784e2d766;p=ceph.git osd: include snap_seq in copy-get results 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 --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 2605d5df2ffa..e370e3feede2 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4027,14 +4027,14 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& 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& 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, diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 82605f8fb065..692dec65b05b 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -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 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 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. * diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index ddb6243a1257..855b5d85c598 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -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); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index c000c309bb67..cf11aa1437e7 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1964,6 +1964,8 @@ struct object_copy_data_t { /// which snaps we are defined for (if a snap and not the head) vector snaps; + ///< latest snap seq for the object (if head) + snapid_t snap_seq; public: object_copy_data_t() : size((uint64_t)-1) {} diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 2f03a8f65e49..508cc379cb8e 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -580,6 +580,7 @@ struct ObjectOperation { bufferlist *out_data, *out_omap_header; std::map *out_omap; vector *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 *o, std::vector *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 *out_omap, vector *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; }