summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDianna Hohensee <dianna.hohensee@mongodb.com>2021-01-13 15:08:38 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-01-14 21:44:10 +0000
commitbc41e7992d3c4e84a532e3833623b8e237a281e4 (patch)
treea613777247666b4d21d5b1a2182cb3c3726305d1
parente36fe5b84c5b07dbc0676bf8175f1ae7dc3cd662 (diff)
downloadmongo-bc41e7992d3c4e84a532e3833623b8e237a281e4.tar.gz
SERVER-51359 unit test that AutoGetCollectionLockFree can run concurrently with exclusive locks
-rw-r--r--src/mongo/db/catalog_raii_test.cpp66
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 {