summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency/lock_state_test.cpp
diff options
context:
space:
mode:
authorJudah Schvimer <judah@mongodb.com>2018-11-18 15:50:40 -0500
committerJudah Schvimer <judah@mongodb.com>2018-11-18 15:50:40 -0500
commit2b71741cfee235cdbfb69c101bb6ac06a5da436c (patch)
treeab42093c4256016351b0d52e1db939f386ed70c9 /src/mongo/db/concurrency/lock_state_test.cpp
parentd167e6129256d6b60f01a19ed14bde5604255df7 (diff)
downloadmongo-2b71741cfee235cdbfb69c101bb6ac06a5da436c.tar.gz
SERVER-37989 introduce a new ReplicationStateTransitionLock resource
Diffstat (limited to 'src/mongo/db/concurrency/lock_state_test.cpp')
-rw-r--r--src/mongo/db/concurrency/lock_state_test.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/mongo/db/concurrency/lock_state_test.cpp b/src/mongo/db/concurrency/lock_state_test.cpp
index e2055f11724..a0094d3d485 100644
--- a/src/mongo/db/concurrency/lock_state_test.cpp
+++ b/src/mongo/db/concurrency/lock_state_test.cpp
@@ -1,4 +1,3 @@
-
/**
* Copyright (C) 2018-present MongoDB, Inc.
*
@@ -162,6 +161,43 @@ TEST(LockerImpl, saveAndRestoreGlobal) {
}
/**
+ * Test that saveLockerImpl can save and restore the RSTL.
+ */
+TEST(LockerImpl, saveAndRestoreRSTL) {
+ Locker::LockSnapshot lockInfo;
+
+ LockerImpl locker;
+
+ const ResourceId resIdDatabase(RESOURCE_DATABASE, "TestDB"_sd);
+
+ // Acquire locks.
+ ASSERT_EQUALS(LOCK_OK, locker.lock(resourceIdReplicationStateTransitionLock, MODE_IX));
+ locker.lockGlobal(MODE_IX);
+ ASSERT_EQUALS(LOCK_OK, locker.lock(resIdDatabase, MODE_IX));
+
+ // Save the lock state.
+ locker.saveLockStateAndUnlock(&lockInfo);
+ ASSERT(!locker.isLocked());
+ ASSERT_EQUALS(MODE_IX, lockInfo.globalMode);
+
+ // Check locks are unlocked.
+ ASSERT_EQUALS(MODE_NONE, locker.getLockMode(resourceIdReplicationStateTransitionLock));
+ ASSERT(!locker.isLocked());
+ ASSERT_EQUALS(MODE_NONE, locker.getLockMode(resIdDatabase));
+
+ // Restore the lock(s) we had.
+ locker.restoreLockState(lockInfo);
+
+ // Check locks are re-locked.
+ ASSERT(locker.isLocked());
+ ASSERT_EQUALS(MODE_IX, locker.getLockMode(resIdDatabase));
+ ASSERT_EQUALS(MODE_IX, locker.getLockMode(resourceIdReplicationStateTransitionLock));
+
+ ASSERT(locker.unlockGlobal());
+ ASSERT(locker.unlock(resourceIdReplicationStateTransitionLock));
+}
+
+/**
* Test that we don't unlock when we have the global lock more than once.
*/
TEST(LockerImpl, saveAndRestoreGlobalAcquiredTwice) {