]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: add functions for client-managed snapshots in all the interfaces
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 9 Apr 2010 19:33:23 +0000 (12:33 -0700)
committerSage Weil <sage@newdream.net>
Fri, 23 Apr 2010 21:42:46 +0000 (14:42 -0700)
src/include/librados.hpp
src/librados.cc

index 9c9d2957f445f4a58c69983244f6f7275fd1dc82..75c18a24411ae996e52514653f4b08ee524a9844 100644 (file)
@@ -88,7 +88,9 @@ public:
   int change_pool_auid(const pool_t& pool, __u64 auid);
 
   int snap_create(const pool_t pool, const char *snapname);
+  __u64 selfmanaged_snap_create(const pool_t pool);
   int snap_remove(const pool_t pool, const char *snapname);
+  int selfmanaged_snap_remove(const pool_t pool, __u64 snapid);
   int snap_list(pool_t pool, std::vector<snap_t> *snaps);
   int snap_get_name(pool_t pool, snap_t snap, std::string *name);
   int snap_get_stamp(pool_t pool, snap_t snap, time_t *t);
index 236ccec29a94803f8490f42deff452cc2bfbf8bc..6cd2dcdb6db6cfe3372ec197178f387c0138fd33 100644 (file)
@@ -110,7 +110,9 @@ public:
   int snap_get_name(PoolCtx *pool, __u64 snapid, std::string *s);
   int snap_get_stamp(PoolCtx *pool, __u64 snapid, time_t *t);
   int snap_create(const rados_pool_t pool, const char* snapname);
+  __u64 selfmanaged_snap_create(rados_pool_t pool);
   int snap_remove(const rados_pool_t pool, const char* snapname);
+  int selfmanaged_snap_remove(rados_pool_t pool, __u64 snapid);
 
   // io
   int create(PoolCtx& pool, const object_t& oid, bool exclusive);
@@ -491,6 +493,25 @@ int RadosClient::snap_create( const rados_pool_t pool, const char *snapName)
   return reply;
 }
 
+__u64 RadosClient::selfmanaged_snap_create(rados_pool_t pool)
+{
+  int64_t reply;
+  int poolID = ((PoolCtx *)pool)->poolid;
+
+  Mutex mylock("RadosClient::selfmanaged_snap_create::mylock");
+  Cond cond;
+  bool done;
+  lock.Lock();
+  objecter->allocate_selfmanaged_snap(poolID,
+                                     new C_SafeCond(&mylock, &cond, &done, &reply));
+  lock.Unlock();
+
+  mylock.Lock();
+  while (!done) cond.Wait(mylock);
+  mylock.Unlock();
+  return (__u64)reply;
+}
+
 int RadosClient::snap_remove(const rados_pool_t pool, const char *snapName)
 {
   int reply;
@@ -512,6 +533,25 @@ int RadosClient::snap_remove(const rados_pool_t pool, const char *snapName)
   return reply;
 }
 
+int RadosClient::selfmanaged_snap_remove(rados_pool_t pool, __u64 snapid)
+{
+  int64_t reply;
+  int poolID = ((PoolCtx *)pool)->poolid;
+
+  Mutex mylock("RadosClient::selfmanaged_snap_remove::mylock");
+  Cond cond;
+  bool done;
+  lock.Lock();
+  objecter->delete_selfmanaged_snap(poolID, snapid_t(snapid),
+                                     new C_SafeCond(&mylock, &cond, &done, &reply));
+  lock.Unlock();
+
+  mylock.Lock();
+  while (!done) cond.Wait(mylock);
+  mylock.Unlock();
+  return (int)reply;
+}
+
 int RadosClient::create_pool(string& name, unsigned long long auid)
 {
   int reply;
@@ -1329,6 +1369,17 @@ int Rados::snap_remove(const rados_pool_t pool, const char *snapname) {
   return ((RadosClient *)client)->snap_remove(pool, snapname);
 }
 
+__u64 Rados::selfmanaged_snap_create(const rados_pool_t pool)
+{
+  if (!client) return -EINVAL;
+  return ((RadosClient *)client)->selfmanaged_snap_create(pool);
+}
+
+int Rados::selfmanaged_snap_remove(const rados_pool_t pool,
+                                  __u64 snapid) {
+  if (!client) return -EINVAL;
+  return ((RadosClient *)client)->selfmanaged_snap_remove(pool, snapid);
+}
 
 void Rados::set_snap(rados_pool_t pool, snap_t seq)
 {
@@ -1580,6 +1631,20 @@ extern "C" int rados_snap_remove(const rados_pool_t pool, const char *snapname)
   return radosp->snap_remove(ctx, snapname);
 }
 
+extern "C" __u64 rados_selfmanaged_snap_create(const rados_pool_t pool,
+                                            const char *snapname)
+{
+  RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
+  return radosp->selfmanaged_snap_create(ctx);
+}
+
+extern "C" int rados_selfmanaged_snap_remove(const rados_pool_t pool,
+                                            __u64 snapid)
+{
+  RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
+  return radosp->selfmanaged_snap_remove(ctx, snapid);
+}
+
 extern "C" int rados_snap_list(rados_pool_t pool, rados_snap_t *snaps, int maxlen)
 {
   RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;