CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY |
CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE |
CEPH_OSD_COPY_FROM_FLAG_MAP_SNAP_CLONE,
- obc->obs.oi.soid.snap == CEPH_NOSNAP);
+ obc->obs.oi.soid.snap == CEPH_NOSNAP,
+ 0, 0);
assert(obc->is_blocked());
ctx->copy_cb = cb;
start_copy(cb, ctx->obc, src, src_oloc, src_version,
op.copy_from.flags,
- false);
+ false,
+ op.copy_from.src_fadvise_flags,
+ op.flags);
result = -EINPROGRESS;
} else {
// finish
async_read_started = true;
ctx->pending_async_reads.push_back(
make_pair(
- boost::make_tuple(cursor.data_offset, left, 0),
+ boost::make_tuple(cursor.data_offset, left, osd_op.op.flags),
make_pair(&bl, cb)));
result = MIN(oi.size - cursor.data_offset, (uint64_t)left);
cb->len = result;
void ReplicatedPG::start_copy(CopyCallback *cb, ObjectContextRef obc,
hobject_t src, object_locator_t oloc,
version_t version, unsigned flags,
- bool mirror_snapset)
+ bool mirror_snapset,
+ unsigned src_obj_fadvise_flags,
+ unsigned dest_obj_fadvise_flags)
{
const hobject_t& dest = obc->obs.oi.soid;
dout(10) << __func__ << " " << dest
}
CopyOpRef cop(new CopyOp(cb, obc, src, oloc, version, flags,
- mirror_snapset));
+ mirror_snapset, src_obj_fadvise_flags,
+ dest_obj_fadvise_flags));
copy_ops[dest] = cop;
obc->start_block();
&cop->results.source_omap_digest,
&cop->results.reqids,
&cop->rval);
+ op.set_last_op_flags(cop->src_obj_fadvise_flags);
C_Copyfrom *fin = new C_Copyfrom(this, obc->obs.oi.soid,
get_last_peering_reset(), cop);
cop->temp_cursor.data_offset,
cop->data.length(),
cop->data,
- 0);
+ cop->dest_obj_fadvise_flags);
cop->data.clear();
}
if (!pool.info.require_rollback()) {
object_copy_cursor_t temp_cursor;
+ /*
+ * For CopyOp the process is:
+ * step1: read the data(attr/omap/data) from the source object
+ * step2: handle those data(w/ those data create a new object)
+ * src_obj_fadvise_flags used in step1;
+ * dest_obj_fadvise_flags used in step2
+ */
+ unsigned src_obj_fadvise_flags;
+ unsigned dest_obj_fadvise_flags;
+
CopyOp(CopyCallback *cb_, ObjectContextRef _obc, hobject_t s,
object_locator_t l,
version_t v,
unsigned f,
- bool ms)
+ bool ms,
+ unsigned src_obj_fadvise_flags,
+ unsigned dest_obj_fadvise_flags)
: cb(cb_), obc(_obc), src(s), oloc(l), flags(f),
mirror_snapset(ms),
objecter_tid(0),
objecter_tid2(0),
- rval(-1)
+ rval(-1),
+ src_obj_fadvise_flags(src_obj_fadvise_flags),
+ dest_obj_fadvise_flags(dest_obj_fadvise_flags)
{
results.user_version = v;
results.mirror_snapset = mirror_snapset;
*/
void start_copy(CopyCallback *cb, ObjectContextRef obc, hobject_t src,
object_locator_t oloc, version_t version, unsigned flags,
- bool mirror_snapset);
+ bool mirror_snapset, unsigned src_obj_fadvise_flags,
+ unsigned dest_obj_fadvise_flags);
void process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r);
void _write_copy_chunk(CopyOpRef cop, PGBackend::PGTransaction *t);
uint64_t get_copy_chunk_size() const {