From 6f9ee7961eee9ee3a61a07cbe0d8d289ee98fa9a Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 30 Jul 2015 16:59:32 -0700 Subject: [PATCH] ReplicatedPG,Objecter: copy_get should include truncate_seq and size Otherwise, we break CephFS over cache tiers. Fixes: #12551 Signed-off-by: Samuel Just --- src/osd/ReplicatedPG.cc | 11 +++++++++++ src/osd/ReplicatedPG.h | 5 ++++- src/osd/osd_types.cc | 10 ++++++++-- src/osd/osd_types.h | 10 ++++++++-- src/osdc/Objecter.h | 18 ++++++++++++++++-- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index dcd11f5553f29..902aba78f9715 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -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& 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; diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 9c280365da27f..89794c24f2ba3 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -127,6 +127,8 @@ public: uint32_t source_data_digest, source_omap_digest; uint32_t data_digest, omap_digest; vector > 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) {} }; diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index dbcbd3dab357a..f0a1e4730f161 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -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); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 0c45f413ebc05..0bedb490481de 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2677,9 +2677,15 @@ struct object_copy_data_t { ///< recent reqids on this object vector > 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& o); void encode_classic(bufferlist& bl) const; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 7c49efb95c14d..038e5f3b6e6c6 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -633,6 +633,8 @@ struct ObjectOperation { uint32_t *out_data_digest; uint32_t *out_omap_digest; vector > *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 > *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 > *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; } -- 2.39.5