From: Yehuda Sadeh Date: Thu, 10 Jun 2010 21:04:07 +0000 (-0700) Subject: librados: implement write_full X-Git-Tag: v0.21~383 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d1c779c96a0afeaf245ade6c5d4c8de818fcd66b;p=ceph.git librados: implement write_full --- diff --git a/src/include/librados.h b/src/include/librados.h index 2f825d4770ce..c9c1c71c98d6 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -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); diff --git a/src/librados.cc b/src/librados.cc index bbd266621158..6edae18a31e4 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -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); +}