]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: implement write_full
authorYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 10 Jun 2010 21:04:07 +0000 (14:04 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 10 Jun 2010 21:04:07 +0000 (14:04 -0700)
src/include/librados.h
src/librados.cc

index 2f825d4770ce17d91b3dda090ca4abd582030004..c9c1c71c98d6b9c93cc934651e7b8979b40352c7 100644 (file)
@@ -75,6 +75,7 @@ int rados_snap_get_name(rados_pool_t pool, rados_snap_t id, char *name, int maxl
 
 /* sync io */
 int rados_write(rados_pool_t pool, const char *oid, off_t off, const char *buf, size_t len);
+int rados_write_full(rados_pool_t pool, const char *oid, off_t off, const char *buf, size_t len);
 int rados_read(rados_pool_t pool, const char *oid, off_t off, char *buf, size_t len);
 int rados_remove(rados_pool_t pool, const char *oid);
 
@@ -103,6 +104,9 @@ void rados_aio_release(rados_completion_t c);
 int rados_aio_write(rados_pool_t pool, const char *oid,
                    off_t off, const char *buf, size_t len,
                    rados_completion_t completion);
+int rados_aio_write_full(rados_pool_t pool, const char *oid,
+                        off_t off, const char *buf, size_t len,
+                        rados_completion_t completion);
 int rados_aio_read(rados_pool_t pool, const char *oid,
                   off_t off, char *buf, size_t len,
                   rados_completion_t completion);
index bbd266621158636690e629d9517f3d3ea05d5e22..6edae18a31e4354c8ffe9573f87f65c0b78ac831 100644 (file)
@@ -301,6 +301,9 @@ public:
   int aio_write(PoolCtx& pool, object_t oid, off_t off, const bufferlist& bl, size_t len,
                AioCompletion *c);
 
+  int aio_write_full(PoolCtx& pool, object_t oid, const bufferlist& bl,
+                   AioCompletion *c);
+
   AioCompletion *aio_create_completion() {
     return new AioCompletion;
   }
@@ -925,6 +928,24 @@ int RadosClient::aio_write(PoolCtx& pool, const object_t oid, off_t off, const b
   return 0;
 }
 
+int RadosClient::aio_write_full(PoolCtx& pool, const object_t oid, const bufferlist& bl,
+                              AioCompletion *c)
+{
+  SnapContext snapc;
+  utime_t ut = g_clock.now();
+
+  Context *onack = new C_aio_Ack(c);
+  Context *onsafe = new C_aio_Safe(c);
+
+  Mutex::Locker l(lock);
+  ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
+  objecter->write_full(oid, layout,
+                 pool.snapc, bl, ut, 0,
+                 onack, onsafe);
+
+  return 0;
+}
+
 int RadosClient::remove(PoolCtx& pool, const object_t& oid)
 {
   SnapContext snapc;
@@ -1683,6 +1704,15 @@ extern "C" int rados_write(rados_pool_t pool, const char *o, off_t off, const ch
   return radosp->write(*ctx, oid, off, bl, len);
 }
 
+extern "C" int rados_write_full(rados_pool_t pool, const char *o, off_t off, const char *buf, size_t len)
+{
+  RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
+  object_t oid(o);
+  bufferlist bl;
+  bl.append(buf, len);
+  return radosp->write_full(*ctx, oid, bl);
+}
+
 extern "C" int rados_remove(rados_pool_t pool, const char *o)
 {
   RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
@@ -1976,3 +2006,13 @@ extern "C" int rados_aio_write(rados_pool_t pool, const char *o,
   return radosp->aio_write(*ctx, oid, off, bl, len, (RadosClient::AioCompletion*)completion);
 }
 
+extern "C" int rados_aio_write_full(rados_pool_t pool, const char *o,
+                              off_t off, const char *buf, size_t len,
+                              rados_completion_t completion)
+{
+  RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
+  object_t oid(o);
+  bufferlist bl;
+  bl.append(buf, len);
+  return radosp->aio_write_full(*ctx, oid, bl, (RadosClient::AioCompletion*)completion);
+}