From 33d5b98ed1e6d2168cf4b5e6a211c14a58c9e3fe Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 20 May 2009 14:13:43 -0700 Subject: [PATCH] rados: add 'remove' operation --- src/include/librados.h | 2 ++ src/librados.cc | 43 +++++++++++++++++++++++++++++++++++++++--- src/testradospp.cc | 10 ++++++---- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/include/librados.h b/src/include/librados.h index ffb0535517ef6..0291e1b1d6abf 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -28,6 +28,7 @@ int rados_close_pool(rados_pool_t pool); /* read/write objects */ int rados_write(rados_pool_t pool, struct ceph_object *oid, off_t off, const char *buf, size_t len); int rados_read(rados_pool_t pool, struct ceph_object *oid, off_t off, char *buf, size_t len); +int rados_remove(rados_pool_t pool, struct ceph_object *oid); int rados_exec(rados_pool_t pool, struct ceph_object *o, const char *cls, const char *method, const char *in_buf, size_t in_len, char *buf, size_t out_len); @@ -49,6 +50,7 @@ public: int write(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, size_t len); int read(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, size_t len); + int remove(rados_pool_t pool, object_t& oid); int exec(rados_pool_t pool, object_t& oid, const char *cls, const char *method, bufferlist& inbl, size_t in_len, bufferlist& outbl, size_t out_len); diff --git a/src/librados.cc b/src/librados.cc index ffbdce0832d5f..f47b5be79607c 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -70,6 +70,7 @@ public: int write(int pool, object_t& oid, off_t off, bufferlist& bl, size_t len); int read(int pool, object_t& oid, off_t off, bufferlist& bl, size_t len); + int remove(int pool, object_t& oid); int exec(int pool, object_t& oid, const char *cls, const char *method, bufferlist& inbl, size_t in_len, bufferlist& outbl, size_t out_len); }; @@ -193,9 +194,6 @@ int RadosClient::write(int pool, object_t& oid, off_t off, bufferlist& bl, size_ bool done; int r; Context *onack = new C_SafeCond(&lock, &cond, &done, &r); -#if 0 - bl.append(&buf[off], len); -#endif ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool); dout(0) << "going to write" << dendl; @@ -211,6 +209,31 @@ int RadosClient::write(int pool, object_t& oid, off_t off, bufferlist& bl, size_ return len; } +int RadosClient::remove(int pool, object_t& oid) +{ + SnapContext snapc; + utime_t ut = g_clock.now(); + + Mutex lock("RadosClient::remove"); + Cond cond; + bool done; + int r; + Context *onack = new C_SafeCond(&lock, &cond, &done, &r); + ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool); + + dout(0) << "going to write" << dendl; + + lock.Lock(); + objecter->remove(oid, layout, + snapc, ut, 0, + onack, NULL); + while (!done) + cond.Wait(lock); + lock.Unlock(); + + return r; +} + int RadosClient::exec(int pool, object_t& oid, const char *cls, const char *method, bufferlist& inbl, size_t in_len, bufferlist& outbl, size_t out_len) { SnapContext snapc; @@ -308,6 +331,14 @@ int Rados::write(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, si return client->write(pool, oid, off, bl, len); } +int Rados::remove(rados_pool_t pool, object_t& oid) +{ + if (!client) + return -EINVAL; + + return client->remove(pool, oid); +} + int Rados::read(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, size_t len) { if (!client) @@ -421,6 +452,12 @@ extern "C" int rados_write(rados_pool_t pool, ceph_object *o, off_t off, const c return radosp->write(pool, oid, off, bl, len); } +extern "C" int rados_remove(rados_pool_t pool, ceph_object *o) +{ + object_t oid(*o); + return radosp->remove(pool, oid); +} + extern "C" int rados_read(rados_pool_t pool, ceph_object *o, off_t off, char *buf, size_t len) { int ret; diff --git a/src/testradospp.cc b/src/testradospp.cc index bc7c5f7c34e9c..7f66a4d6e78f4 100644 --- a/src/testradospp.cc +++ b/src/testradospp.cc @@ -41,18 +41,20 @@ int main(int argc, const char **argv) rados_pool_t pool; int r = rados.open_pool("data", &pool); - printf("open pool result = %d, pool = %d\n", r, pool); + cout << "open pool result = " << r << " pool = " << pool << std::endl; rados.write(pool, oid, 0, bl, bl.length()); rados.exec(pool, oid, "test", "foo", bl, bl.length(), bl2, 1024); - printf("exec result=%s\n", bl2.c_str()); + cout << "exec result=" << bl2.c_str() << std::endl; int size = rados.read(pool, oid, 0, bl2, 128); - rados.close_pool(pool); - cout << "read result=" << bl2.c_str() << std::endl; cout << "size=" << size << std::endl; + r = rados.remove(pool, oid); + cout << "remove result=" << r << std::endl; + rados.close_pool(pool); + return 0; } -- 2.39.5