diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-11 15:07:35 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-11 15:07:35 -0300 |
| commit | 4cb8841196d0625dfa3825aa326f071cd27c7b8b (patch) | |
| tree | 1682a647d4463397c119183369ae6f750d5fdcff /src/mongo/db/concurrency/lock_state_test.cpp | |
| parent | aa03c6362cbaa767638e6eed9b031d86dd2643d1 (diff) | |
| parent | 8f0827553e09872941945a093b647a4211a9db7f (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.cpp | 47 |
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 |
