]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: add aio_operate for reads and tmap_get for ObjectWriteOp
authorSamuel Just <rexludorum@gmail.com>
Tue, 7 Feb 2012 16:51:01 +0000 (08:51 -0800)
committerSage Weil <sage@newdream.net>
Tue, 14 Feb 2012 21:37:08 +0000 (13:37 -0800)
Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
src/include/rados/librados.hpp
src/librados.cc
src/osdc/Objecter.h

index e27f9fc3f78ff1f07f12be9af76a3aa8ad0fef0c..54baadfe198cd0fa061abc9563bf96357c1a8bb7 100644 (file)
@@ -191,6 +191,7 @@ namespace librados
     void getxattr(const char *name, bufferlist *pbl, int *prval);
     void getxattrs(std::map<std::string, bufferlist> *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,
index f3cad9d1c8730393ccf6d0b86bf8d99cffee4ad4..e7db7779fce3ee4f5a726fc81c34f45b935d6a85 100644 (file)
@@ -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)
 {
index 8a124f7d6c7de816efaf35407766bbc8dad09d2b..4995f995444b59fe60577a9c7ba43cd7c7f35728 100644 (file)
@@ -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);
   }