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;
}
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;
}
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;
}
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);