Otherwise, we break CephFS over cache tiers.
Fixes: #12551
Signed-off-by: Samuel Just <sjust@redhat.com>
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;
&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);
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
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?
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;
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;
}
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)
{}
};
return;
}
- ENCODE_START(6, 5, bl);
+ ENCODE_START(7, 5, bl);
::encode(size, bl);
::encode(mtime, bl);
::encode(attrs, bl);
::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);
if (struct_v >= 6) {
::decode(reqids, bl);
}
+ if (struct_v >= 7) {
+ ::decode(truncate_seq, bl);
+ ::decode(truncate_size, bl);
+ }
}
DECODE_FINISH(bl);
}
///< 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;
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,
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;
*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)
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;
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;
}