diff options
author | Dianna Hohensee <dianna.hohensee@mongodb.com> | 2021-01-13 15:08:38 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-01-14 21:44:10 +0000 |
commit | bc41e7992d3c4e84a532e3833623b8e237a281e4 (patch) | |
tree | a613777247666b4d21d5b1a2182cb3c3726305d1 | |
parent | e36fe5b84c5b07dbc0676bf8175f1ae7dc3cd662 (diff) | |
download | mongo-bc41e7992d3c4e84a532e3833623b8e237a281e4.tar.gz |
SERVER-51359 unit test that AutoGetCollectionLockFree can run concurrently with exclusive locks
-rw-r--r-- | src/mongo/db/catalog_raii_test.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/mongo/db/catalog_raii_test.cpp b/src/mongo/db/catalog_raii_test.cpp index bc4d0358872..531e6af2e2a 100644 --- a/src/mongo/db/catalog_raii_test.cpp +++ b/src/mongo/db/catalog_raii_test.cpp @@ -206,6 +206,21 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDeadlineMin) { Milliseconds(0)); } +TEST_F(CatalogRAIITestFixture, AutoGetCollectionNotCompatibleWithRSTLExclusiveLock) { + Lock::GlobalLock gLock1(client1.second.get(), MODE_X); + ASSERT(client1.second->lockState()->isLocked()); + + failsWithLockTimeout( + [&] { + AutoGetCollection coll(client2.second.get(), + nss, + MODE_IX, + AutoGetCollectionViewMode::kViewsForbidden, + Date_t::now() + timeoutMs); + }, + timeoutMs); +} + TEST_F(CatalogRAIITestFixture, AutoGetCollectionDBLockCompatibleX) { Lock::DBLock dbLock1(client1.second.get(), nss.db(), MODE_IX); ASSERT(client1.second->lockState()->isDbLockedForMode(nss.db(), MODE_IX)); @@ -213,6 +228,57 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDBLockCompatibleX) { AutoGetCollection coll(client2.second.get(), nss, MODE_X); } +TEST_F(CatalogRAIITestFixture, AutoGetCollectionLockFreeGlobalLockDeadline) { + Lock::GlobalLock gLock1(client1.second.get(), MODE_X); + ASSERT(client1.second->lockState()->isLocked()); + failsWithLockTimeout( + [&] { + AutoGetCollectionLockFree coll( + client2.second.get(), + nss, + [](std::shared_ptr<const Collection>&, OperationContext*, CollectionUUID) {}, + AutoGetCollectionViewMode::kViewsForbidden, + Date_t::now() + timeoutMs); + }, + timeoutMs); +} + +TEST_F(CatalogRAIITestFixture, AutoGetCollectionLockFreeCompatibleWithCollectionExclusiveLock) { + Lock::DBLock dbLock1(client1.second.get(), nss.db(), MODE_IX); + ASSERT(client1.second->lockState()->isDbLockedForMode(nss.db(), MODE_IX)); + Lock::CollectionLock collLock1(client1.second.get(), nss, MODE_X); + ASSERT(client1.second->lockState()->isCollectionLockedForMode(nss, MODE_X)); + + AutoGetCollectionLockFree coll( + client2.second.get(), + nss, + [](std::shared_ptr<const Collection>&, OperationContext*, CollectionUUID) {}); + ASSERT(client2.second->lockState()->isLocked()); +} + +TEST_F(CatalogRAIITestFixture, AutoGetCollectionLockFreeCompatibleWithDatabaseExclusiveLock) { + Lock::DBLock dbLock1(client1.second.get(), nss.db(), MODE_X); + ASSERT(client1.second->lockState()->isDbLockedForMode(nss.db(), MODE_X)); + + AutoGetCollectionLockFree coll( + client2.second.get(), + nss, + [](std::shared_ptr<const Collection>&, OperationContext*, CollectionUUID) {}); + ASSERT(client2.second->lockState()->isLocked()); +} + +TEST_F(CatalogRAIITestFixture, AutoGetCollectionLockFreeCompatibleWithRSTLExclusiveLock) { + Lock::ResourceLock rstl( + client1.second->lockState(), resourceIdReplicationStateTransitionLock, MODE_X); + ASSERT(client1.second->lockState()->isRSTLExclusive()); + + AutoGetCollectionLockFree coll( + client2.second.get(), + nss, + [](std::shared_ptr<const Collection>&, OperationContext*, CollectionUUID) {}); + ASSERT(client2.second->lockState()->isLocked()); +} + using ReadSource = RecoveryUnit::ReadSource; class RecoveryUnitMock : public RecoveryUnitNoop { |