summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency/lock_state_test.cpp
diff options
context:
space:
mode:
authorDianna Hohensee <dianna.hohensee@10gen.com>2018-05-04 15:23:21 -0400
committerDianna Hohensee <dianna.hohensee@10gen.com>2018-05-14 09:46:06 -0400
commitd12afa4fdda9c6b113e7be3b4d67d757b07b50b5 (patch)
treeaa6b55026327e6d4138b501b2d775e582e7e7d28 /src/mongo/db/concurrency/lock_state_test.cpp
parentf7d2c58c2d04c40c561a7a8d176510450edbcdb9 (diff)
downloadmongo-d12afa4fdda9c6b113e7be3b4d67d757b07b50b5.tar.gz
SERVER-33244 All lock acquisitions for transaction operations obey maxTransactionLockRequestTimeoutMillis, which defaults to 0 millis
Diffstat (limited to 'src/mongo/db/concurrency/lock_state_test.cpp')
-rw-r--r--src/mongo/db/concurrency/lock_state_test.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/mongo/db/concurrency/lock_state_test.cpp b/src/mongo/db/concurrency/lock_state_test.cpp
index 7e299d7cc7f..00e7e2e0755 100644
--- a/src/mongo/db/concurrency/lock_state_test.cpp
+++ b/src/mongo/db/concurrency/lock_state_test.cpp
@@ -367,6 +367,77 @@ TEST(LockerImpl, MODE_SLocksUseTwoPhaseLockingWhenSharedLocksShouldTwoPhaseLockI
locker.unlockGlobal();
}
+TEST(LockerImpl, OverrideLockRequestTimeout) {
+ const ResourceId resIdFirstDB(RESOURCE_DATABASE, "FirstDB"_sd);
+ const ResourceId resIdSecondDB(RESOURCE_DATABASE, "SecondDB"_sd);
+
+ DefaultLockerImpl locker1;
+ DefaultLockerImpl locker2;
+
+ // Set up locker2 to override lock requests' provided timeout if greater than 1000 milliseconds.
+ locker2.setMaxLockTimeout(Milliseconds(1000));
+
+ ASSERT_EQ(LOCK_OK, locker1.lockGlobal(MODE_IX));
+ ASSERT_EQ(LOCK_OK, locker2.lockGlobal(MODE_IX));
+
+ // locker1 acquires FirstDB under an exclusive lock.
+ ASSERT_EQ(LOCK_OK, locker1.lock(resIdFirstDB, MODE_X));
+ ASSERT_TRUE(locker1.isLockHeldForMode(resIdFirstDB, MODE_X));
+
+ // locker2's attempt to acquire FirstDB with unlimited wait time should timeout after 1000
+ // milliseconds and throw because _maxLockRequestTimeout is set to 1000 milliseconds.
+ ASSERT_THROWS_CODE(locker2.lock(resIdFirstDB, MODE_X, Date_t::max()),
+ AssertionException,
+ ErrorCodes::LockTimeout);
+
+ // locker2's attempt to acquire an uncontested lock should still succeed normally.
+ ASSERT_EQ(LOCK_OK, locker2.lock(resIdSecondDB, MODE_X));
+
+ ASSERT_TRUE(locker1.unlock(resIdFirstDB));
+ ASSERT_TRUE(locker1.isLockHeldForMode(resIdFirstDB, MODE_NONE));
+ ASSERT_TRUE(locker2.unlock(resIdSecondDB));
+ ASSERT_TRUE(locker2.isLockHeldForMode(resIdSecondDB, MODE_NONE));
+
+ ASSERT(locker1.unlockGlobal());
+ ASSERT(locker2.unlockGlobal());
+}
+
+TEST(LockerImpl, DoNotWaitForLockAcquisition) {
+ const ResourceId resIdFirstDB(RESOURCE_DATABASE, "FirstDB"_sd);
+ const ResourceId resIdSecondDB(RESOURCE_DATABASE, "SecondDB"_sd);
+
+ DefaultLockerImpl locker1;
+ DefaultLockerImpl locker2;
+
+ // Set up locker2 to immediately return if a lock is unavailable, regardless of supplied
+ // deadlines in the lock request.
+ locker2.setMaxLockTimeout(Milliseconds(0));
+
+ ASSERT_EQ(LOCK_OK, locker1.lockGlobal(MODE_IX));
+ ASSERT_EQ(LOCK_OK, locker2.lockGlobal(MODE_IX));
+
+ // locker1 acquires FirstDB under an exclusive lock.
+ ASSERT_EQ(LOCK_OK, locker1.lock(resIdFirstDB, MODE_X));
+ ASSERT_TRUE(locker1.isLockHeldForMode(resIdFirstDB, MODE_X));
+
+ // locker2's attempt to acquire FirstDB with unlimited wait time should fail immediately and
+ // throw because _maxLockRequestTimeout was set to 0.
+ ASSERT_THROWS_CODE(locker2.lock(resIdFirstDB, MODE_X, Date_t::max()),
+ AssertionException,
+ ErrorCodes::LockTimeout);
+
+ // locker2's attempt to acquire an uncontested lock should still succeed normally.
+ ASSERT_EQ(LOCK_OK, locker2.lock(resIdSecondDB, MODE_X));
+
+ ASSERT_TRUE(locker1.unlock(resIdFirstDB));
+ ASSERT_TRUE(locker1.isLockHeldForMode(resIdFirstDB, MODE_NONE));
+ ASSERT_TRUE(locker2.unlock(resIdSecondDB));
+ ASSERT_TRUE(locker2.isLockHeldForMode(resIdSecondDB, MODE_NONE));
+
+ ASSERT(locker1.unlockGlobal());
+ ASSERT(locker2.unlockGlobal());
+}
+
TEST(LockerImpl, MODE_SLocksDoNotUseTwoPhaseLockingWhenSharedLocksShouldTwoPhaseLockIsFalse) {
const ResourceId resId(RESOURCE_COLLECTION, "TestDB.collection"_sd);