* +--------------------------------------+
*/
+namespace librados {
+
+struct ObjectOperationImpl {
+ ::ObjectOperation o;
+ real_time rt;
+ real_time *prt;
+
+ ObjectOperationImpl() : prt(NULL) {}
+};
+
+}
+
size_t librados::ObjectOperation::size()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
return o->size();
}
//deprcated
void librados::ObjectOperation::set_op_flags(ObjectOperationFlags flags)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
- ::set_op_flags(o, (int)flags);
+ ::set_op_flags(&impl->o, (int)flags);
}
void librados::ObjectOperation::set_op_flags2(int flags)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
::set_op_flags(o, flags);
}
void librados::ObjectOperation::cmpxattr(const char *name, uint8_t op, const bufferlist& v)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->cmpxattr(name, op, CEPH_OSD_CMPXATTR_MODE_STRING, v);
}
void librados::ObjectOperation::cmpxattr(const char *name, uint8_t op, uint64_t v)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
bufferlist bl;
::encode(v, bl);
o->cmpxattr(name, op, CEPH_OSD_CMPXATTR_MODE_U64, bl);
void librados::ObjectOperation::src_cmpxattr(const std::string& src_oid,
const char *name, int op, const bufferlist& v)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
object_t oid(src_oid);
o->src_cmpxattr(oid, CEPH_NOSNAP, name, v, op, CEPH_OSD_CMPXATTR_MODE_STRING);
}
void librados::ObjectOperation::src_cmpxattr(const std::string& src_oid,
const char *name, int op, uint64_t val)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
object_t oid(src_oid);
bufferlist bl;
::encode(val, bl);
void librados::ObjectOperation::assert_version(uint64_t ver)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->assert_version(ver);
}
void librados::ObjectOperation::assert_exists()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->stat(NULL, (ceph::real_time*) NULL, NULL);
}
void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->call(cls, method, inbl);
}
void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl, bufferlist *outbl, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->call(cls, method, inbl, outbl, NULL, prval);
}
void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl, librados::ObjectOperationCompletion *completion)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
ObjectOpCompletionCtx *ctx = new ObjectOpCompletionCtx(completion);
void librados::ObjectReadOperation::stat(uint64_t *psize, time_t *pmtime, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->stat(psize, pmtime, prval);
}
void librados::ObjectReadOperation::stat2(uint64_t *psize, struct timespec *pts, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->stat(psize, pts, prval);
}
void librados::ObjectReadOperation::stat2(uint64_t *psize, ceph_real_time_t *pmtime, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->stat(psize, (ceph::real_time *)pmtime, prval);
}
void librados::ObjectReadOperation::read(size_t off, uint64_t len, bufferlist *pbl, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->read(off, len, pbl, prval, NULL);
}
std::map<uint64_t,uint64_t> *m,
bufferlist *data_bl, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->sparse_read(off, len, m, data_bl, prval);
}
void librados::ObjectReadOperation::tmap_get(bufferlist *pbl, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->tmap_get(pbl, prval);
}
void librados::ObjectReadOperation::getxattr(const char *name, bufferlist *pbl, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->getxattr(name, pbl, prval);
}
std::map<std::string, bufferlist> *out_vals,
int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_get_vals(start_after, filter_prefix, max_return, out_vals, prval);
}
std::map<std::string, bufferlist> *out_vals,
int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_get_vals(start_after, "", max_return, out_vals, prval);
}
std::set<std::string> *out_keys,
int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_get_keys(start_after, max_return, out_keys, prval);
}
void librados::ObjectReadOperation::omap_get_header(bufferlist *bl, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_get_header(bl, prval);
}
std::map<std::string, bufferlist> *map,
int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_get_vals_by_keys(keys, map, prval);
}
const std::map<std::string, pair<bufferlist, int> > &assertions,
int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_cmp(assertions, prval);
}
list<obj_watch_t> *out_watchers,
int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->list_watchers(out_watchers, prval);
}
snap_set_t *out_snaps,
int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->list_snaps(out_snaps, prval);
}
void librados::ObjectReadOperation::is_dirty(bool *is_dirty, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->is_dirty(is_dirty, prval);
}
void librados::ObjectReadOperation::getxattrs(map<string, bufferlist> *pattrs, int *prval)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->getxattrs(pattrs, prval);
}
+void librados::ObjectWriteOperation::mtime(time_t *pt)
+{
+ if (pt) {
+ impl->rt = ceph::real_clock::from_time_t(*pt);
+ impl->prt = &impl->rt;
+ }
+}
+
+void librados::ObjectWriteOperation::mtime2(struct timespec *pts)
+{
+ if (pts) {
+ impl->rt = ceph::real_clock::from_timespec(*pts);
+ impl->prt = &impl->rt;
+ }
+}
+
+void librados::ObjectWriteOperation::mtime2(ceph_real_time_t *pmtime)
+{
+ impl->prt = (ceph::real_time *)pmtime;
+}
+
void librados::ObjectWriteOperation::create(bool exclusive)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->create(exclusive);
}
void librados::ObjectWriteOperation::create(bool exclusive,
const std::string& category) // unused
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->create(exclusive);
}
void librados::ObjectWriteOperation::write(uint64_t off, const bufferlist& bl)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->write(off, c);
}
void librados::ObjectWriteOperation::write_full(const bufferlist& bl)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->write_full(c);
}
void librados::ObjectWriteOperation::append(const bufferlist& bl)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->append(c);
}
void librados::ObjectWriteOperation::remove()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->remove();
}
void librados::ObjectWriteOperation::truncate(uint64_t off)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->truncate(off);
}
void librados::ObjectWriteOperation::zero(uint64_t off, uint64_t len)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->zero(off, len);
}
void librados::ObjectWriteOperation::rmxattr(const char *name)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->rmxattr(name);
}
void librados::ObjectWriteOperation::setxattr(const char *name, const bufferlist& v)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->setxattr(name, v);
}
void librados::ObjectWriteOperation::omap_set(
const map<string, bufferlist> &map)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_set(map);
}
void librados::ObjectWriteOperation::omap_set_header(const bufferlist &bl)
{
bufferlist c = bl;
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_set_header(c);
}
void librados::ObjectWriteOperation::omap_clear()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_clear();
}
void librados::ObjectWriteOperation::omap_rm_keys(
const std::set<std::string> &to_rm)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->omap_rm_keys(to_rm);
}
uint64_t src_version,
uint32_t src_fadvise_flags)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->copy_from(object_t(src), src_ioctx.io_ctx_impl->snap_seq,
src_ioctx.io_ctx_impl->oloc, src_version, 0, src_fadvise_flags);
}
void librados::ObjectWriteOperation::undirty()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->undirty();
}
void librados::ObjectReadOperation::cache_flush()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->cache_flush();
}
void librados::ObjectReadOperation::cache_try_flush()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->cache_try_flush();
}
void librados::ObjectReadOperation::cache_evict()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->cache_evict();
}
void librados::ObjectWriteOperation::tmap_put(const bufferlist &bl)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->tmap_put(c);
}
void librados::ObjectWriteOperation::tmap_update(const bufferlist& cmdbl)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
bufferlist c = cmdbl;
o->tmap_update(c);
}
const std::string& src_oid, uint64_t src_off,
size_t len)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->clone_range(src_oid, src_off, len, dst_off);
}
void librados::ObjectWriteOperation::selfmanaged_snap_rollback(snap_t snapid)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->rollback(snapid);
}
// You must specify the snapid not the name normally used with pool snapshots
void librados::ObjectWriteOperation::snap_rollback(snap_t snapid)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->rollback(snapid);
}
uint64_t expected_object_size,
uint64_t expected_write_size)
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->set_alloc_hint(expected_object_size, expected_write_size);
}
void librados::ObjectWriteOperation::cache_pin()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->cache_pin();
}
void librados::ObjectWriteOperation::cache_unpin()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
+ ::ObjectOperation *o = &impl->o;
o->cache_unpin();
}
int librados::IoCtx::operate(const std::string& oid, librados::ObjectWriteOperation *o)
{
object_t obj(oid);
- return io_ctx_impl->operate(obj, (::ObjectOperation*)o->impl, o->pmtime);
+ return io_ctx_impl->operate(obj, (::ObjectOperation*)o->impl, (ceph::real_time *)o->impl->prt);
}
int librados::IoCtx::operate(const std::string& oid, librados::ObjectReadOperation *o, bufferlist *pbl)
librados::ObjectOperation::ObjectOperation()
{
- impl = (ObjectOperationImpl *)new ::ObjectOperation;
+ impl = new ObjectOperationImpl;
}
librados::ObjectOperation::~ObjectOperation()
{
- ::ObjectOperation *o = (::ObjectOperation *)impl;
- if (o)
- delete o;
+ delete impl;
}
///////////////////////////// C API //////////////////////////////
object_t obj(oid);
::ObjectOperation *oo = (::ObjectOperation *) write_op;
librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
- int retval = ctx->operate(obj, oo, mtime, translate_flags(flags));
+
+ ceph::real_time *prt = NULL;
+ ceph::real_time rt;
+
+ if (mtime) {
+ rt = ceph::real_clock::from_time_t(*mtime);
+ prt = &rt;
+ }
+
+ int retval = ctx->operate(obj, oo, prt, translate_flags(flags));
+ tracepoint(librados, rados_write_op_operate_exit, retval);
+ return retval;
+}
+
+extern "C" int rados_write_op_operate2(rados_write_op_t write_op,
+ rados_ioctx_t io,
+ const char *oid,
+ struct timespec *ts,
+ int flags)
+{
+ tracepoint(librados, rados_write_op_operate2_enter, write_op, io, oid, ts, flags);
+ object_t obj(oid);
+ ::ObjectOperation *oo = (::ObjectOperation *) write_op;
+ librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+
+ ceph::real_time *prt = NULL;
+ ceph::real_time rt;
+
+ if (ts) {
+ rt = ceph::real_clock::from_timespec(*ts);
+ prt = &rt;
+ }
+
+ int retval = ctx->operate(obj, oo, prt, translate_flags(flags));
tracepoint(librados, rados_write_op_operate_exit, retval);
return retval;
}