return;
if (r && (r != -ENOENT || !obc)) {
+ // copy the reqids for copy get on ENOENT
+ if (r == -ENOENT &&
+ (m->ops[0].op.op == CEPH_OSD_OP_COPY_GET_CLASSIC ||
+ m->ops[0].op.op == CEPH_OSD_OP_COPY_GET)) {
+ bool classic = false;
+ if (m->ops[0].op.op == CEPH_OSD_OP_COPY_GET_CLASSIC) {
+ classic = true;
+ }
+ fill_in_copy_get_noent(op, oid, m->ops[0], classic);
+ return;
+ }
dout(20) << __func__ << "find_object_context got error " << r << dendl;
osd->reply_op_error(op, r);
return;
(!obc->obs.exists ||
((m->get_snapid() != CEPH_SNAPDIR) &&
obc->obs.oi.is_whiteout()))) {
+ // copy the reqids for copy get on ENOENT
+ if (m->ops[0].op.op == CEPH_OSD_OP_COPY_GET_CLASSIC ||
+ m->ops[0].op.op == CEPH_OSD_OP_COPY_GET) {
+ bool classic = false;
+ if (m->ops[0].op.op == CEPH_OSD_OP_COPY_GET_CLASSIC) {
+ classic = true;
+ }
+ fill_in_copy_get_noent(op, oid, m->ops[0], classic);
+ close_op_ctx(ctx, -ENOENT);
+ return;
+ }
reply_ctx(ctx, -ENOENT);
return;
}
return result;
}
+void ReplicatedPG::fill_in_copy_get_noent(OpRequestRef& op, hobject_t oid,
+ OSDOp& osd_op, bool classic)
+{
+ MOSDOp *m = static_cast<MOSDOp*>(op->get_req());
+ uint64_t features = m->get_features();
+ object_copy_data_t reply_obj;
+
+ pg_log.get_log().get_object_reqids(oid, 10, &reply_obj.reqids);
+ dout(20) << __func__ << " got reqids " << reply_obj.reqids << dendl;
+ if (classic) {
+ reply_obj.encode_classic(osd_op.outdata);
+ } else {
+ ::encode(reply_obj, osd_op.outdata, features);
+ }
+ osd_op.rval = -ENOENT;
+ MOSDOpReply *reply = new MOSDOpReply(m, 0, get_osdmap()->get_epoch(), 0, false);
+ reply->claim_op_out_data(m->ops);
+ reply->set_result(-ENOENT);
+ reply->add_flags(CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK);
+ osd->send_message_osd_client(reply, m->get_connection());
+}
+
void ReplicatedPG::start_copy(CopyCallback *cb, ObjectContextRef obc,
hobject_t src, object_locator_t oloc,
version_t version, unsigned flags,
out_flags(flags), out_data_digest(dd), out_omap_digest(od),
out_reqids(oreqids), prval(r) {}
void finish(int r) {
- if (r < 0)
+ // reqids are copied on ENOENT
+ if (r < 0 && r != -ENOENT)
return;
try {
bufferlist::iterator p = bl.begin();
object_copy_data_t copy_reply;
::decode(copy_reply, p);
+ if (r == -ENOENT) {
+ if (out_reqids)
+ *out_reqids = copy_reply.reqids;
+ return;
+ }
if (out_size)
*out_size = copy_reply.size;
if (out_mtime)