From: Samuel Just Date: Tue, 7 Feb 2012 16:51:01 +0000 (-0800) Subject: librados: add aio_operate for reads and tmap_get for ObjectWriteOp X-Git-Tag: v0.43~96 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7842bf1246efe15a6eb889fb74fadd06e78b05f7;p=ceph.git librados: add aio_operate for reads and tmap_get for ObjectWriteOp Signed-off-by: Samuel Just --- diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index e27f9fc3f78f..54baadfe198c 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -191,6 +191,7 @@ namespace librados void getxattr(const char *name, bufferlist *pbl, int *prval); void getxattrs(std::map *pattrs, int *prval); void read(size_t off, uint64_t len, bufferlist *pbl, int *prval); + void tmap_get(bufferlist *pbl); }; @@ -308,7 +309,9 @@ namespace librados // compound object operations int operate(const std::string& oid, ObjectWriteOperation *op); int operate(const std::string& oid, ObjectReadOperation *op, bufferlist *pbl); - int aio_operate(const std::string& oid, AioCompletion *c, ObjectOperation *op); + int aio_operate(const std::string& oid, AioCompletion *c, ObjectWriteOperation *op); + int aio_operate(const std::string& oid, AioCompletion *c, ObjectReadOperation *op, + bufferlist *pbl); // watch/notify int watch(const std::string& o, uint64_t ver, uint64_t *handle, diff --git a/src/librados.cc b/src/librados.cc index f3cad9d1c873..e7db7779fce3 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -200,6 +200,12 @@ void librados::ObjectReadOperation::read(size_t off, uint64_t len, bufferlist *p o->read(off, len, pbl, prval); } +void librados::ObjectReadOperation::tmap_get(bufferlist *pbl) +{ + ::ObjectOperation *o = (::ObjectOperation *)impl; + o->tmap_get(pbl); +} + void librados::ObjectReadOperation::getxattr(const char *name, bufferlist *pbl, int *prval) { ::ObjectOperation *o = (::ObjectOperation *)impl; @@ -631,6 +637,7 @@ public: int operate(IoCtxImpl& io, const object_t& oid, ::ObjectOperation *o, time_t *pmtime); int operate_read(IoCtxImpl& io, const object_t& oid, ::ObjectOperation *o, bufferlist *pbl); int aio_operate(IoCtxImpl& io, const object_t& oid, ::ObjectOperation *o, AioCompletionImpl *c); + int aio_operate_read(IoCtxImpl& io, const object_t& oid, ::ObjectOperation *o, AioCompletionImpl *c, bufferlist *pbl); struct C_aio_Ack : public Context { AioCompletionImpl *c; @@ -1786,6 +1793,21 @@ int librados::RadosClient::operate_read(IoCtxImpl& io, const object_t& oid, return r; } +int librados::RadosClient::aio_operate_read(IoCtxImpl& io, const object_t &oid, + ::ObjectOperation *o, + AioCompletionImpl *c, bufferlist *pbl) +{ + Context *onack = new C_aio_Ack(c); + + c->pbl = pbl; + + Mutex::Locker l(lock); + objecter->read(oid, io.oloc, + *o, io.snap_seq, pbl, 0, + onack, 0); + return 0; +} + int librados::RadosClient::aio_operate(IoCtxImpl& io, const object_t& oid, ::ObjectOperation *o, AioCompletionImpl *c) { @@ -2078,8 +2100,8 @@ int librados::RadosClient::tmap_get(IoCtxImpl& io, const object_t& oid, bufferli lock.Lock(); ::ObjectOperation rd; prepare_assert_ops(&io, &rd); - rd.tmap_get(); - objecter->read(oid, io.oloc, rd, io.snap_seq, &bl, 0, onack, &ver); + rd.tmap_get(&bl); + objecter->read(oid, io.oloc, rd, io.snap_seq, 0, 0, onack, &ver); lock.Unlock(); mylock.Lock(); @@ -2941,12 +2963,17 @@ int librados::IoCtx::operate(const std::string& oid, librados::ObjectReadOperati return io_ctx_impl->client->operate_read(*io_ctx_impl, obj, (::ObjectOperation*)o->impl, pbl); } -int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c, librados::ObjectOperation *o) +int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c, librados::ObjectWriteOperation *o) { object_t obj(oid); return io_ctx_impl->client->aio_operate(*io_ctx_impl, obj, (::ObjectOperation*)o->impl, c->pc); } +int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c, librados::ObjectReadOperation *o, bufferlist *pbl) +{ + object_t obj(oid); + return io_ctx_impl->client->aio_operate_read(*io_ctx_impl, obj, (::ObjectOperation*)o->impl, c->pc, pbl); +} void librados::IoCtx::snap_set_read(snap_t seq) { diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 8a124f7d6c7d..4995f995444b 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -330,6 +330,11 @@ struct ObjectOperation { void tmap_put(bufferlist& bl) { add_data(CEPH_OSD_OP_TMAPPUT, 0, bl.length(), bl); } + void tmap_get(bufferlist *pbl) { + add_op(CEPH_OSD_OP_TMAPGET); + unsigned p = ops.size() - 1; + out_bl[p] = pbl; + } void tmap_get() { add_op(CEPH_OSD_OP_TMAPGET); }