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:
Yuri Weinstein 2022-05-11 07:34:42 -07:00 committed by GitHub
commit 3bc0354bc4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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