From: Sage Weil Date: Mon, 23 Jul 2012 23:29:07 +0000 (-0700) Subject: librados: make snap create/destroy handle client-side errors X-Git-Tag: v0.51~59^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=507f99e9a0ec853a192dec659dc399fb5df19e56;p=ceph.git librados: make snap create/destroy handle client-side errors Signed-off-by: Sage Weil --- diff --git a/src/librados/IoCtxImpl.cc b/src/librados/IoCtxImpl.cc index cf295cb139c1..3f22e878bad4 100644 --- a/src/librados/IoCtxImpl.cc +++ b/src/librados/IoCtxImpl.cc @@ -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; } diff --git a/src/test/rados-api/snapshots.cc b/src/test/rados-api/snapshots.cc index 4c7572ff4ead..80d1aa9f514a 100644 --- a/src/test/rados-api/snapshots.cc +++ b/src/test/rados-api/snapshots.cc @@ -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);