From 52a9ea63209fd6c2620f3ef56b608b9ed7daca3b Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 16 Jun 2009 16:39:10 -0700 Subject: [PATCH] librados: added a write-full method. Switched ./rados to use it for put. --- src/include/librados.h | 1 + src/librados.cc | 43 ++++++++++++++++++++++++++++++++++++++++++ src/osdc/Objecter.h | 2 +- src/rados.cc | 2 +- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/include/librados.h b/src/include/librados.h index dad9c33ac52dc..0d2dccd365b74 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -97,6 +97,7 @@ public: void set_snap(rados_pool_t pool, snapid_t seq); int write(rados_pool_t pool, const object_t& oid, off_t off, bufferlist& bl, size_t len); + int write_full(rados_pool_t pool, const object_t& oid, bufferlist& bl); int read(rados_pool_t pool, const object_t& oid, off_t off, bufferlist& bl, size_t len); int remove(rados_pool_t pool, const object_t& oid); diff --git a/src/librados.cc b/src/librados.cc index dcb3f84303088..99b59fe3800c6 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -100,6 +100,7 @@ public: // io int write(PoolCtx& pool, const object_t& oid, off_t off, bufferlist& bl, size_t len); + int write_full(PoolCtx& pool, const object_t& oid, bufferlist& bl); int read(PoolCtx& pool, const object_t& oid, off_t off, bufferlist& bl, size_t len); int remove(PoolCtx& pool, const object_t& oid); @@ -672,6 +673,40 @@ int RadosClient::write(PoolCtx& pool, const object_t& oid, off_t off, bufferlist return len; } +int RadosClient::write_full(PoolCtx& pool, const object_t& oid, bufferlist& bl) +{ + utime_t ut = g_clock.now(); + + /* can't write to a snapshot */ + if (pool.snap_seq != CEPH_NOSNAP) + return -EINVAL; + + Mutex mylock("RadosClient::write_full::mylock"); + Cond cond; + bool done; + int r; + + Context *onack = new C_SafeCond(&mylock, &cond, &done, &r); + + dout(0) << "going to write_full" << dendl; + + lock.Lock(); + ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid); + objecter->write_full(oid, layout, + pool.snapc, bl, ut, 0, + onack, NULL); + lock.Unlock(); + + mylock.Lock(); + while (!done) + cond.Wait(mylock); + mylock.Unlock(); + + dout(0) << "did write_full" << dendl; + + return r; +} + int RadosClient::aio_read(PoolCtx& pool, const object_t oid, off_t off, bufferlist *pbl, size_t len, AioCompletion **pc) { @@ -890,6 +925,14 @@ int Rados::write(rados_pool_t pool, const object_t& oid, off_t off, bufferlist& return client->write(*(RadosClient::PoolCtx *)pool, oid, off, bl, len); } +int Rados::write_full(rados_pool_t pool, const object_t& oid, bufferlist& bl) +{ + if (!client) + return -EINVAL; + + return client->write_full(*(RadosClient::PoolCtx *)pool, oid, bl); +} + int Rados::remove(rados_pool_t pool, const object_t& oid) { if (!client) diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 2d279d0e8244c..bef8233ad93bd 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -430,7 +430,7 @@ private: return op_submit(o); } tid_t write_full(const object_t& oid, ceph_object_layout ol, - const SnapContext& snapc, bufferlist &bl, utime_t mtime, int flags, + const SnapContext& snapc, const bufferlist &bl, utime_t mtime, int flags, Context *onack, Context *oncommit) { vector ops(1); ops[0].op.op = CEPH_OSD_OP_WRITEFULL; diff --git a/src/rados.cc b/src/rados.cc index 2819049df2328..e3da86fbea1d3 100644 --- a/src/rados.cc +++ b/src/rados.cc @@ -375,7 +375,7 @@ int main(int argc, const char **argv) usage(); } object_t oid(nargs[1]); - int r = rados.write(p, oid, 0, indata, indata.length()); + int r = rados.write_full(p, oid, indata); if (r < 0) { cerr << "error writing " << oid << " to pool " << pool << ": " << strerror(-r) << std::endl; exit(0); -- 2.39.5