CEPH_OSD_FLAG_IGNORE_CACHE = 0x8000, /* ignore cache logic */
CEPH_OSD_FLAG_SKIPRWLOCKS = 0x10000, /* skip rw locks */
CEPH_OSD_FLAG_IGNORE_OVERLAY =0x20000, /* ignore pool overlay */
+ CEPH_OSD_FLAG_FLUSH = 0x40000, /* this is part of flush */
};
enum {
CEPH_OSD_CMPXATTR_MODE_U64 = 2
};
+enum {
+ CEPH_OSD_COPY_FROM_FLAG_FLUSH = 1, /* part of a flush operation */
+ CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY = 2, /* ignore pool overlay */
+ CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE = 4, /* ignore osd cache logic */
+};
+
/*
* an individual object operation. each may be accompanied by some data
* payload
struct {
__le64 snapid;
__le64 src_version;
+ __u8 flags;
} __attribute__ ((packed)) copy_from;
struct {
struct ceph_timespec stamp;
* @param src_ioctx ioctx for the source object
* @param version current version of the source object
*/
- void copy_from(const std::string& src, const IoCtx& src_ioctx, uint64_t src_version);
+ void copy_from(const std::string& src, const IoCtx& src_ioctx,
+ uint64_t src_version);
/**
* undirty an object
uint64_t src_version)
{
::ObjectOperation *o = (::ObjectOperation *)impl;
- o->copy_from(object_t(src), src_ioctx.io_ctx_impl->snap_seq, src_ioctx.io_ctx_impl->oloc, src_version);
+ o->copy_from(object_t(src), src_ioctx.io_ctx_impl->snap_seq,
+ src_ioctx.io_ctx_impl->oloc, src_version, 0);
}
void librados::ObjectWriteOperation::undirty()
PromoteCallback *cb = new PromoteCallback(op, obc, temp_target, this);
object_locator_t oloc(m->get_object_locator());
oloc.pool = pool.info.tier_of;
- start_copy(cb, obc, obc->obs.oi.soid, oloc, 0, temp_target);
+ start_copy(cb, obc, obc->obs.oi.soid, oloc, 0,
+ CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY |
+ CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE,
+ temp_target);
assert(obc->is_blocked());
wait_for_blocked_object(obc->obs.oi.soid, op);
CopyFromCallback *cb = new CopyFromCallback(ctx, temp_target);
ctx->copy_cb = cb;
start_copy(cb, ctx->obc, src, src_oloc, src_version,
- temp_target);
+ op.copy_from.flags,
+ temp_target);
result = -EINPROGRESS;
} else {
// finish
}
void ReplicatedPG::start_copy(CopyCallback *cb, ObjectContextRef obc,
- hobject_t src, object_locator_t oloc, version_t version,
- const hobject_t& temp_dest_oid)
+ hobject_t src, object_locator_t oloc,
+ version_t version, unsigned flags,
+ const hobject_t& temp_dest_oid)
{
const hobject_t& dest = obc->obs.oi.soid;
dout(10) << __func__ << " " << dest
<< " from " << src << " " << oloc << " v" << version
+ << " flags " << flags
<< dendl;
// cancel a previous in-progress copy?
cancel_copy(cop, false);
}
- CopyOpRef cop(new CopyOp(cb, obc, src, oloc, version, temp_dest_oid));
+ CopyOpRef cop(new CopyOp(cb, obc, src, oloc, version, flags, temp_dest_oid));
copy_ops[dest] = cop;
++obc->copyfrom_readside;
C_Copyfrom *fin = new C_Copyfrom(this, obc->obs.oi.soid,
get_last_peering_reset());
+
+ unsigned flags = 0;
+ if (cop->flags & CEPH_OSD_COPY_FROM_FLAG_FLUSH)
+ flags |= CEPH_OSD_FLAG_FLUSH;
+ if (cop->flags & CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE)
+ flags |= CEPH_OSD_FLAG_IGNORE_CACHE;
+ if (cop->flags & CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY)
+ flags |= CEPH_OSD_FLAG_IGNORE_OVERLAY;
+
osd->objecter_lock.Lock();
tid_t tid = osd->objecter->read(cop->src.oid, cop->oloc, op,
cop->src.snap, NULL,
- CEPH_OSD_FLAG_IGNORE_OVERLAY,
+ flags,
new C_OnFinisher(fin,
&osd->objecter_finisher),
// discover the object version if we don't know it yet
ObjectContextRef obc;
hobject_t src;
object_locator_t oloc;
+ unsigned flags;
CopyResults *results;
hobject_t temp_oid;
object_copy_cursor_t temp_cursor;
- CopyOp(CopyCallback *cb_, ObjectContextRef _obc, hobject_t s, object_locator_t l,
- version_t v, const hobject_t& dest)
- : cb(cb_), obc(_obc), src(s), oloc(l),
+ CopyOp(CopyCallback *cb_, ObjectContextRef _obc, hobject_t s,
+ object_locator_t l,
+ version_t v,
+ unsigned f,
+ const hobject_t& dest)
+ : cb(cb_), obc(_obc), src(s), oloc(l), flags(f),
results(NULL),
objecter_tid(0),
rval(-1),
* @param temp_dest_oid: the temporary object to use for large objects
*/
void start_copy(CopyCallback *cb, ObjectContextRef obc, hobject_t src,
- object_locator_t oloc, version_t version,
- const hobject_t& temp_dest_oid);
+ object_locator_t oloc, version_t version, unsigned flags,
+ const hobject_t& temp_dest_oid);
void process_copy_chunk(hobject_t oid, tid_t tid, int r);
void _write_copy_chunk(CopyOpRef cop, ObjectStore::Transaction *t);
void _copy_some(ObjectContextRef obc, CopyOpRef cop);
case CEPH_OSD_FLAG_IGNORE_CACHE: return "ignore_cache";
case CEPH_OSD_FLAG_SKIPRWLOCKS: return "skiprwlocks";
case CEPH_OSD_FLAG_IGNORE_OVERLAY: return "ignore_overlay";
+ case CEPH_OSD_FLAG_FLUSH: return "flush";
default: return "???";
}
}
osd_op.op.snap.snapid = snapid;
}
- void copy_from(object_t src, snapid_t snapid, object_locator_t src_oloc, version_t src_version) {
+ void copy_from(object_t src, snapid_t snapid, object_locator_t src_oloc,
+ version_t src_version, unsigned flags) {
OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_FROM);
osd_op.op.copy_from.snapid = snapid;
osd_op.op.copy_from.src_version = src_version;
+ osd_op.op.copy_from.flags = flags;
::encode(src, osd_op.indata);
::encode(src_oloc, osd_op.indata);
}