mirror of
https://github.com/ceph/ceph
synced 2025-01-20 10:01:45 +00:00
Merge pull request #45762 from NitzanMordhai/wip-nitzan-test-cls-lock-expiered-locks
cls_lock: check expired lock before unlock Reviewed-by: Brad Hubbard <bhubbard@redhat.com>
This commit is contained in:
commit
3bc0354bc4
@ -63,6 +63,23 @@ void lock_info(IoCtx *ioctx, string& oid, string& name, map<locker_id_t, locker_
|
||||
lock_info(ioctx, oid, name, lockers, NULL, NULL);
|
||||
}
|
||||
|
||||
bool lock_expired(IoCtx *ioctx, string& oid, string& name)
|
||||
{
|
||||
ClsLockType lock_type = ClsLockType::NONE;
|
||||
string tag;
|
||||
map<locker_id_t, locker_info_t> lockers;
|
||||
if (0 == get_lock_info(ioctx, oid, name, &lockers, &lock_type, &tag))
|
||||
return false;
|
||||
utime_t now = ceph_clock_now();
|
||||
map<locker_id_t, locker_info_t>::iterator liter;
|
||||
for (liter = lockers.begin(); liter != lockers.end(); ++liter) {
|
||||
if (liter->second.expiration > now)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TEST(ClsLock, TestMultiLocking) {
|
||||
Rados cluster;
|
||||
std::string pool_name = get_temp_pool_name();
|
||||
@ -485,7 +502,9 @@ TEST(ClsLock, TestExclusiveEphemeralBasic) {
|
||||
ASSERT_EQ(0, l1.lock_exclusive_ephemeral(&ioctx, oid1));
|
||||
ASSERT_EQ(0, ioctx.stat(oid1, &size, &mod_time));
|
||||
sleep(2);
|
||||
ASSERT_EQ(0, l1.unlock(&ioctx, oid1));
|
||||
int r1 = l1.unlock(&ioctx, oid1);
|
||||
EXPECT_TRUE(r1 == 0 || ((r1 == -ENOENT) && (lock_expired(&ioctx, oid1, lock_name1))))
|
||||
<< "unlock should return 0 or -ENOENT return: " << r1;
|
||||
ASSERT_EQ(-ENOENT, ioctx.stat(oid1, &size, &mod_time));
|
||||
|
||||
// ***********************************************
|
||||
@ -497,7 +516,9 @@ TEST(ClsLock, TestExclusiveEphemeralBasic) {
|
||||
ASSERT_EQ(0, l2.lock_exclusive(&ioctx, oid2));
|
||||
ASSERT_EQ(0, ioctx.stat(oid2, &size, &mod_time));
|
||||
sleep(2);
|
||||
ASSERT_EQ(0, l2.unlock(&ioctx, oid2));
|
||||
int r2 = l2.unlock(&ioctx, oid2);
|
||||
EXPECT_TRUE(r2 == 0 || ((r2 == -ENOENT) && (lock_expired(&ioctx, oid2, lock_name2))))
|
||||
<< "unlock should return 0 or -ENOENT return: " << r2;
|
||||
ASSERT_EQ(0, ioctx.stat(oid2, &size, &mod_time));
|
||||
|
||||
ASSERT_EQ(0, destroy_one_pool_pp(pool_name, cluster));
|
||||
|
Loading…
Reference in New Issue
Block a user