reply_obj.size = oi.size;
reply_obj.mtime = oi.mtime;
reply_obj.category = oi.category;
+ reply_obj.snaps = oi.snaps;
// attrs
map<string,bufferlist>& out_attrs = reply_obj.attrs;
&cop->results->object_size, &cop->results->mtime,
&cop->results->category,
&cop->attrs, &cop->data, &cop->omap_header, &cop->omap,
+ &cop->results->snaps,
&cop->rval);
C_Copyfrom *fin = new C_Copyfrom(this, obc->obs.oi.soid,
tctx->delta_stats.num_bytes += results->object_size;
tctx->new_obs.oi.category = results->category;
tctx->new_obs.oi.user_version = results->user_version;
+ tctx->new_obs.oi.snaps = results->snaps;
}
// take RWWRITE lock for duration of our local write
string category; ///< The copy source's category
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)
CopyResults() : object_size(0), started_temp_obj(false),
user_version(0), should_requeue(false) {}
};
void object_copy_data_t::encode(bufferlist& bl) const
{
- ENCODE_START(2, 1, bl);
+ ENCODE_START(3, 1, bl);
::encode(size, bl);
::encode(mtime, bl);
::encode(category, bl);
::encode(omap, bl);
::encode(cursor, bl);
::encode(omap_header, bl);
+ ::encode(snaps, bl);
ENCODE_FINISH(bl);
}
::decode(cursor, bl);
if (struct_v >= 2)
::decode(omap_header, bl);
+ if (struct_v >= 3)
+ ::decode(snaps, bl);
DECODE_FINISH(bl);
}
bufferptr databp("iamsomedatatocontain", 20);
o.back()->data.push_back(databp);
o.back()->omap_header.append("this is an omap header");
+ o.back()->snaps.push_back(123);
}
void object_copy_data_t::dump(Formatter *f) const
f->dump_int("omap_size", omap.size());
f->dump_int("omap_header_length", omap_header.length());
f->dump_int("data_length", data.length());
+ f->open_array_section("snaps");
+ for (vector<snapid_t>::const_iterator p = snaps.begin();
+ p != snaps.end(); ++p)
+ f->dump_unsigned("snap", *p);
+ f->close_section();
}
// -- pg_create_t --
bufferlist omap_header;
map<string, bufferlist> omap;
string category;
+
+ /// which snaps we are defined for (if a snap and not the head)
+ vector<snapid_t> snaps;
public:
object_copy_data_t() : size((uint64_t)-1) {}
std::map<std::string,bufferlist> *out_attrs;
bufferlist *out_data, *out_omap_header;
std::map<std::string,bufferlist> *out_omap;
+ vector<snapid_t> *out_snaps;
int *prval;
C_ObjectOperation_copyget(object_copy_cursor_t *c,
uint64_t *s,
std::map<std::string,bufferlist> *a,
bufferlist *d, bufferlist *oh,
std::map<std::string,bufferlist> *o,
+ std::vector<snapid_t> *osnaps,
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), prval(r) {}
+ out_omap(o), out_snaps(osnaps), prval(r) {}
void finish(int r) {
if (r < 0)
return;
out_omap_header->claim_append(copy_reply.omap_header);
if (out_omap)
*out_omap = copy_reply.omap;
+ if (out_snaps)
+ *out_snaps = copy_reply.snaps;
*cursor = copy_reply.cursor;
} catch (buffer::error& e) {
if (prval)
bufferlist *out_data,
bufferlist *out_omap_header,
std::map<std::string,bufferlist> *out_omap,
+ vector<snapid_t> *out_snaps,
int *prval) {
OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_GET);
osd_op.op.copy_get.max = max;
C_ObjectOperation_copyget *h =
new C_ObjectOperation_copyget(cursor, out_size, out_mtime, out_category,
out_attrs, out_data, out_omap_header,
- out_omap, prval);
+ out_omap, out_snaps, prval);
out_bl[p] = &h->bl;
out_handler[p] = h;
}