]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: make snap create/destroy handle client-side errors
authorSage Weil <sage@inktank.com>
Mon, 23 Jul 2012 23:29:07 +0000 (16:29 -0700)
committerSage Weil <sage@inktank.com>
Fri, 27 Jul 2012 17:43:26 +0000 (10:43 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
src/librados/IoCtxImpl.cc
src/test/rados-api/snapshots.cc

index cf295cb139c1f0519a1ec9da76007c8b1c188d9c..3f22e878bad47cd74e98d9ec15215e3a2022ed00 100644 (file)
@@ -102,15 +102,19 @@ int librados::IoCtxImpl::snap_create(const char *snapName)
   Mutex mylock ("IoCtxImpl::snap_create::mylock");
   Cond cond;
   bool done;
+  Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &reply);
   lock->Lock();
-  objecter->create_pool_snap(poolid,
-                            sName,
-                            new C_SafeCond(&mylock, &cond, &done, &reply));
+  reply = objecter->create_pool_snap(poolid, sName, onfinish);
   lock->Unlock();
 
-  mylock.Lock();
-  while(!done) cond.Wait(mylock);
-  mylock.Unlock();
+  if (reply < 0) {
+    delete onfinish;
+  } else {
+    mylock.Lock();
+    while (!done)
+      cond.Wait(mylock);
+    mylock.Unlock();
+  }
   return reply;
 }
 
@@ -121,17 +125,22 @@ int librados::IoCtxImpl::selfmanaged_snap_create(uint64_t *psnapid)
   Mutex mylock("IoCtxImpl::selfmanaged_snap_create::mylock");
   Cond cond;
   bool done;
-  lock->Lock();
+  Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &reply);
   snapid_t snapid;
-  objecter->allocate_selfmanaged_snap(poolid, &snapid,
-                                     new C_SafeCond(&mylock, &cond, &done, &reply));
+  lock->Lock();
+  reply = objecter->allocate_selfmanaged_snap(poolid, &snapid, onfinish);
   lock->Unlock();
 
-  mylock.Lock();
-  while (!done) cond.Wait(mylock);
-  mylock.Unlock();
-  if (reply == 0)
-    *psnapid = snapid;
+  if (reply < 0) {
+    delete onfinish;
+  } else {
+    mylock.Lock();
+    while (!done)
+      cond.Wait(mylock);
+    mylock.Unlock();
+    if (reply == 0)
+      *psnapid = snapid;
+  }
   return reply;
 }
 
@@ -143,15 +152,19 @@ int librados::IoCtxImpl::snap_remove(const char *snapName)
   Mutex mylock ("IoCtxImpl::snap_remove::mylock");
   Cond cond;
   bool done;
+  Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &reply);
   lock->Lock();
-  objecter->delete_pool_snap(poolid,
-                            sName,
-                            new C_SafeCond(&mylock, &cond, &done, &reply));
+  reply = objecter->delete_pool_snap(poolid, sName, onfinish);
   lock->Unlock();
 
-  mylock.Lock();
-  while(!done) cond.Wait(mylock);
-  mylock.Unlock();
+  if (reply < 0) {
+    delete onfinish; 
+  } else {
+    mylock.Lock();
+    while(!done)
+      cond.Wait(mylock);
+    mylock.Unlock();
+  }
   return reply;
 }
 
index 4c7572ff4eadc7b2beb2dc79b2b6dfa4d0549961..80d1aa9f514a8d8d7b100ed1f38eced1f425a0b5 100644 (file)
@@ -63,6 +63,7 @@ TEST(LibRadosSnapshots, SnapRemove) {
   ASSERT_EQ(0, rados_ioctx_snap_create(ioctx, "snap1"));
   rados_snap_t rid;
   ASSERT_EQ(0, rados_ioctx_snap_lookup(ioctx, "snap1", &rid));
+  ASSERT_EQ(-EEXIST, rados_ioctx_snap_create(ioctx, "snap1"));
   ASSERT_EQ(0, rados_ioctx_snap_remove(ioctx, "snap1"));
   ASSERT_EQ(-ENOENT, rados_ioctx_snap_lookup(ioctx, "snap1", &rid));
   rados_ioctx_destroy(ioctx);