std::map<std::string,bufferlist>& out_omap = reply_obj.omap;
if (left > 0 && !cursor.omap_complete) {
assert(cursor.data_complete);
+ if (cursor.omap_offset.empty()) {
+ osd->store->omap_get_header(coll, oi.soid, &reply_obj.omap_header);
+ }
ObjectMap::ObjectMapIterator iter =
osd->store->get_omap_iterator(coll, oi.soid);
assert(iter);
<< dendl;
reply_obj.cursor = cursor;
if (classic) {
+ if (reply_obj.omap_header.length() > 0) {
+ derr << oi.soid << " omap header being dropped by classic copy-get api"
+ << dendl;
+ }
reply_obj.encode_classic(osd_op.outdata);
} else {
::encode(reply_obj, osd_op.outdata);
op.copy_get(&cop->cursor, cct->_conf->osd_copyfrom_max_chunk,
&cop->results->object_size, &cop->results->mtime,
&cop->results->category,
- &cop->attrs, &cop->data, &cop->omap,
+ &cop->attrs, &cop->data, &cop->omap_header, &cop->omap,
&cop->rval);
C_Copyfrom *fin = new C_Copyfrom(this, obc->obs.oi.soid,
cop->data.clear();
}
if (!cop->temp_cursor.omap_complete) {
+ if (cop->omap_header.length()) {
+ t->omap_setheader(cop->temp_coll, cop->temp_oid, cop->omap_header);
+ cop->omap_header.clear();
+ }
t->omap_setkeys(cop->temp_coll, cop->temp_oid, cop->omap);
cop->omap.clear();
}
object_copy_cursor_t cursor;
map<string,bufferlist> attrs;
bufferlist data;
+ bufferlist omap_header;
map<string,bufferlist> omap;
int rval;
void object_copy_data_t::encode(bufferlist& bl) const
{
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
::encode(size, bl);
::encode(mtime, bl);
::encode(category, bl);
::encode(data, bl);
::encode(omap, bl);
::encode(cursor, bl);
+ ::encode(omap_header, bl);
ENCODE_FINISH(bl);
}
void object_copy_data_t::decode(bufferlist::iterator& bl)
{
- DECODE_START(1, bl);
+ DECODE_START(2, bl);
::decode(size, bl);
::decode(mtime, bl);
::decode(category, bl);
::decode(data, bl);
::decode(omap, bl);
::decode(cursor, bl);
+ if (struct_v >= 2)
+ ::decode(omap_header, bl);
DECODE_FINISH(bl);
}
o.back()->omap["why"] = bl2;
bufferptr databp("iamsomedatatocontain", 20);
o.back()->data.push_back(databp);
+ o.back()->omap_header.append("this is an omap header");
}
void object_copy_data_t::dump(Formatter *f) const
const-correctness prents that */
f->dump_int("attrs_size", attrs.size());
f->dump_int("omap_size", omap.size());
+ f->dump_int("omap_header_length", omap_header.length());
f->dump_int("data_length", data.length());
}
utime_t mtime;
map<string, bufferlist> attrs;
bufferlist data;
+ bufferlist omap_header;
map<string, bufferlist> omap;
string category;
public:
utime_t *out_mtime;
string *out_category;
std::map<std::string,bufferlist> *out_attrs;
- bufferlist *out_data;
+ bufferlist *out_data, *out_omap_header;
std::map<std::string,bufferlist> *out_omap;
int *prval;
C_ObjectOperation_copyget(object_copy_cursor_t *c,
utime_t *m,
string *cat,
std::map<std::string,bufferlist> *a,
- bufferlist *d,
+ bufferlist *d, bufferlist *oh,
std::map<std::string,bufferlist> *o,
int *r)
: cursor(c),
out_size(s), out_mtime(m), out_category(cat),
- out_attrs(a), out_data(d), out_omap(o), prval(r) {}
+ out_attrs(a), out_data(d), out_omap_header(oh),
+ out_omap(o), prval(r) {}
void finish(int r) {
if (r < 0)
return;
*out_attrs = copy_reply.attrs;
if (out_data)
out_data->claim_append(copy_reply.data);
+ if (out_omap_header)
+ out_omap_header->claim_append(copy_reply.omap_header);
if (out_omap)
*out_omap = copy_reply.omap;
*cursor = copy_reply.cursor;
string *out_category,
std::map<std::string,bufferlist> *out_attrs,
bufferlist *out_data,
+ bufferlist *out_omap_header,
std::map<std::string,bufferlist> *out_omap,
int *prval) {
OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_GET);
out_rval[p] = prval;
C_ObjectOperation_copyget *h =
new C_ObjectOperation_copyget(cursor, out_size, out_mtime, out_category,
- out_attrs, out_data, out_omap, prval);
+ out_attrs, out_data, out_omap_header,
+ out_omap, prval);
out_bl[p] = &h->bl;
out_handler[p] = h;
}