summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency/lock_state_test.cpp
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
commit4cb8841196d0625dfa3825aa326f071cd27c7b8b (patch)
tree1682a647d4463397c119183369ae6f750d5fdcff /src/mongo/db/concurrency/lock_state_test.cpp
parentaa03c6362cbaa767638e6eed9b031d86dd2643d1 (diff)
parent8f0827553e09872941945a093b647a4211a9db7f (diff)
Update upstream source from tag 'upstream/6.0.0'master
Update to upstream version '6.0.0' with Debian dir 5604a80ec1c96ca76f25f40d78e6ef855abec322
Diffstat (limited to 'src/mongo/db/concurrency/lock_state_test.cpp')
-rw-r--r--src/mongo/db/concurrency/lock_state_test.cpp47
1 files changed, 19 insertions, 28 deletions
diff --git a/src/mongo/db/concurrency/lock_state_test.cpp b/src/mongo/db/concurrency/lock_state_test.cpp
index 211bb902265..32d819899e1 100644
--- a/src/mongo/db/concurrency/lock_state_test.cpp
+++ b/src/mongo/db/concurrency/lock_state_test.cpp
@@ -233,16 +233,18 @@ TEST_F(LockerImplTest, ReadTransaction) {
TEST_F(LockerImplTest, saveAndRestoreGlobal) {
auto opCtx = makeOperationContext();
+ Locker::LockSnapshot lockInfo;
+
LockerImpl locker(opCtx->getServiceContext());
// No lock requests made, no locks held.
- ASSERT_FALSE(locker.canSaveLockState());
+ locker.saveLockStateAndUnlock(&lockInfo);
+ ASSERT_EQUALS(0U, lockInfo.locks.size());
// Lock the global lock, but just once.
locker.lockGlobal(opCtx.get(), MODE_IX);
// We've locked the global lock. This should be reflected in the lockInfo.
- Locker::LockSnapshot lockInfo;
locker.saveLockStateAndUnlock(&lockInfo);
ASSERT(!locker.isLocked());
ASSERT_EQUALS(MODE_IX, lockInfo.globalMode);
@@ -299,17 +301,20 @@ TEST_F(LockerImplTest, saveAndRestoreRSTL) {
TEST_F(LockerImplTest, saveAndRestoreGlobalAcquiredTwice) {
auto opCtx = makeOperationContext();
+ Locker::LockSnapshot lockInfo;
+
LockerImpl locker(opCtx->getServiceContext());
// No lock requests made, no locks held.
- ASSERT_FALSE(locker.canSaveLockState());
+ locker.saveLockStateAndUnlock(&lockInfo);
+ ASSERT_EQUALS(0U, lockInfo.locks.size());
// Lock the global lock.
locker.lockGlobal(opCtx.get(), MODE_IX);
locker.lockGlobal(opCtx.get(), MODE_IX);
// This shouldn't actually unlock as we're in a nested scope.
- ASSERT_FALSE(locker.canSaveLockState());
+ ASSERT(!locker.saveLockStateAndUnlock(&lockInfo));
ASSERT(locker.isLocked());
@@ -371,7 +376,7 @@ TEST_F(LockerImplTest, releaseWriteUnitOfWork) {
ASSERT_FALSE(locker.unlock(resIdDatabase));
ASSERT_FALSE(locker.unlockGlobal());
- locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo);
+ ASSERT(locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo));
// Things shouldn't be locked anymore.
ASSERT_EQUALS(MODE_NONE, locker.getLockMode(resIdDatabase));
@@ -401,7 +406,7 @@ TEST_F(LockerImplTest, restoreWriteUnitOfWork) {
ASSERT_FALSE(locker.unlock(resIdDatabase));
ASSERT_FALSE(locker.unlockGlobal());
- locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo);
+ ASSERT(locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo));
// Things shouldn't be locked anymore.
ASSERT_EQUALS(MODE_NONE, locker.getLockMode(resIdDatabase));
@@ -564,7 +569,7 @@ TEST_F(LockerImplTest, releaseAndRestoreReadOnlyWriteUnitOfWork) {
ASSERT_EQ(3u, locker.numResourcesToUnlockAtEndUnitOfWorkForTest());
// Things shouldn't be locked anymore.
- locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo);
+ ASSERT_TRUE(locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo));
ASSERT_EQUALS(MODE_NONE, locker.getLockMode(resIdDatabase));
ASSERT_EQUALS(MODE_NONE, locker.getLockMode(resIdCollection));
@@ -595,10 +600,15 @@ TEST_F(LockerImplTest, releaseAndRestoreEmptyWriteUnitOfWork) {
locker.beginWriteUnitOfWork();
// Nothing to yield.
- ASSERT_FALSE(locker.canSaveLockState());
+ ASSERT_FALSE(locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo));
+ ASSERT_FALSE(locker.isLocked());
+
+ // Restore lock state.
+ locker.restoreWriteUnitOfWorkAndLock(nullptr, lockInfo);
ASSERT_FALSE(locker.isLocked());
locker.endWriteUnitOfWork();
+ ASSERT_FALSE(locker.isLocked());
}
TEST_F(LockerImplTest, releaseAndRestoreWriteUnitOfWorkWithRecursiveLocks) {
@@ -657,7 +667,7 @@ TEST_F(LockerImplTest, releaseAndRestoreWriteUnitOfWorkWithRecursiveLocks) {
ASSERT_EQ(locker.getRequestsForTest().find(resIdCollection).objAddr()->recursiveCount, 1U);
ASSERT_EQ(locker.getRequestsForTest().find(resIdCollection).objAddr()->unlockPending, 1U);
- locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo);
+ ASSERT(locker.releaseWriteUnitOfWorkAndUnlock(&lockInfo));
// Things shouldn't be locked anymore.
ASSERT_EQUALS(MODE_NONE, locker.getLockMode(resIdDatabase));
@@ -1255,23 +1265,4 @@ DEATH_TEST_F(LockerImplTest,
// 'locker' destructor should invariant because locks are still held.
}
-DEATH_TEST_F(LockerImplTest, SaveAndRestoreGlobalRecursivelyIsFatal, "7033800") {
- auto opCtx = makeOperationContext();
-
- Locker::LockSnapshot lockInfo;
-
- LockerImpl locker(opCtx->getServiceContext());
-
- // No lock requests made, no locks held.
- locker.saveLockStateAndUnlock(&lockInfo);
- ASSERT_EQUALS(0U, lockInfo.locks.size());
-
- // Lock the global lock.
- locker.lockGlobal(opCtx.get(), MODE_IX);
- locker.lockGlobal(opCtx.get(), MODE_IX);
-
- // Should invariant
- locker.saveLockStateAndUnlock(&lockInfo);
-}
-
} // namespace mongo