diff options
author | Tess Avitabile <tess.avitabile@mongodb.com> | 2020-01-16 17:15:43 +0000 |
---|---|---|
committer | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2020-01-27 15:40:35 -0500 |
commit | 80b8ef11f5adff50088d9d35f7022d168e2a594f (patch) | |
tree | 120386118c40a04a9014d0368dcdeeab8f92e094 | |
parent | 188bd77b02965519b02b631aee13572957e7937c (diff) | |
download | mongo-80b8ef11f5adff50088d9d35f7022d168e2a594f.tar.gz |
SERVER-45006 LockerImpl::wasGlobalLockTaken() returns correct value
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency_test.cpp | 14 | ||||
-rw-r--r-- | src/mongo/db/concurrency/lock_state.cpp | 2 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/mongo/db/concurrency/d_concurrency_test.cpp b/src/mongo/db/concurrency/d_concurrency_test.cpp index c19883a2b17..46216f388de 100644 --- a/src/mongo/db/concurrency/d_concurrency_test.cpp +++ b/src/mongo/db/concurrency/d_concurrency_test.cpp @@ -477,64 +477,76 @@ TEST_F(DConcurrencyTestFixture, GlobalLockXSetsGlobalWriteLockedOnOperationConte auto clients = makeKClientsWithLockers(1); auto opCtx = clients[0].second.get(); ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); { Lock::GlobalLock globalWrite(opCtx, MODE_X, Date_t::now(), Lock::InterruptBehavior::kThrow); ASSERT(globalWrite.isLocked()); } ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTaken()); } TEST_F(DConcurrencyTestFixture, GlobalLockIXSetsGlobalWriteLockedOnOperationContext) { auto clients = makeKClientsWithLockers(1); auto opCtx = clients[0].second.get(); ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); { Lock::GlobalLock globalWrite( opCtx, MODE_IX, Date_t::now(), Lock::InterruptBehavior::kThrow); ASSERT(globalWrite.isLocked()); } ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTaken()); } TEST_F(DConcurrencyTestFixture, GlobalLockSDoesNotSetGlobalWriteLockedOnOperationContext) { auto clients = makeKClientsWithLockers(1); auto opCtx = clients[0].second.get(); ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); { Lock::GlobalLock globalRead(opCtx, MODE_S, Date_t::now(), Lock::InterruptBehavior::kThrow); ASSERT(globalRead.isLocked()); } ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTaken()); } TEST_F(DConcurrencyTestFixture, GlobalLockISDoesNotSetGlobalWriteLockedOnOperationContext) { auto clients = makeKClientsWithLockers(1); auto opCtx = clients[0].second.get(); ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); { Lock::GlobalLock globalRead(opCtx, MODE_IS, Date_t::now(), Lock::InterruptBehavior::kThrow); ASSERT(globalRead.isLocked()); } ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTaken()); } TEST_F(DConcurrencyTestFixture, DBLockXSetsGlobalWriteLockedOnOperationContext) { auto clients = makeKClientsWithLockers(1); auto opCtx = clients[0].second.get(); ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); { Lock::DBLock dbWrite(opCtx, "db", MODE_X); } ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTaken()); } TEST_F(DConcurrencyTestFixture, DBLockSDoesNotSetGlobalWriteLockedOnOperationContext) { auto clients = makeKClientsWithLockers(1); auto opCtx = clients[0].second.get(); ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); { Lock::DBLock dbRead(opCtx, "db", MODE_S); } ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_TRUE(opCtx->lockState()->wasGlobalLockTaken()); } TEST_F(DConcurrencyTestFixture, GlobalLockXDoesNotSetGlobalWriteLockedWhenLockAcquisitionTimesOut) { @@ -547,6 +559,7 @@ TEST_F(DConcurrencyTestFixture, GlobalLockXDoesNotSetGlobalWriteLockedWhenLockAc auto opCtx = clients[1].second.get(); ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); { ASSERT_THROWS_CODE( Lock::GlobalLock( @@ -555,6 +568,7 @@ TEST_F(DConcurrencyTestFixture, GlobalLockXDoesNotSetGlobalWriteLockedWhenLockAc ErrorCodes::LockTimeout); } ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTakenForWrite()); + ASSERT_FALSE(opCtx->lockState()->wasGlobalLockTaken()); } TEST_F(DConcurrencyTestFixture, GlobalLockSSetsGlobalLockTakenInModeConflictingWithWrites) { diff --git a/src/mongo/db/concurrency/lock_state.cpp b/src/mongo/db/concurrency/lock_state.cpp index 6cc0f0ee260..3f98a7322b3 100644 --- a/src/mongo/db/concurrency/lock_state.cpp +++ b/src/mongo/db/concurrency/lock_state.cpp @@ -645,7 +645,7 @@ bool LockerImpl::wasGlobalLockTakenInModeConflictingWithWrites() const { } bool LockerImpl::wasGlobalLockTaken() const { - return _globalLockMode; + return _globalLockMode != (1 << MODE_NONE); } void LockerImpl::setGlobalLockTakenInMode(LockMode mode) { |