]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rados: add 'remove' operation
authorYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 20 May 2009 21:13:43 +0000 (14:13 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 20 May 2009 21:13:43 +0000 (14:13 -0700)
src/include/librados.h
src/librados.cc
src/testradospp.cc

index ffb0535517ef6167a06f4f5f9108cc41161bd96b..0291e1b1d6abfbe47d640ba9af3f12c5de92cd08 100644 (file)
@@ -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);
index ffbdce0832d5fcf952328fffb01d57d6cc58dcdc..f47b5be79607c2b778a952d57b589e287ca192ba 100644 (file)
@@ -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;
index bc7c5f7c34e9c8a065cff9ec020be64777ada464..7f66a4d6e78f4bcb3f4f672d2c43ac729c3a36c4 100644 (file)
@@ -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;
 }