summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTess Avitabile <tess.avitabile@mongodb.com>2020-01-16 17:15:43 +0000
committerA. Jesse Jiryu Davis <jesse@mongodb.com>2020-01-27 15:40:35 -0500
commit80b8ef11f5adff50088d9d35f7022d168e2a594f (patch)
tree120386118c40a04a9014d0368dcdeeab8f92e094
parent188bd77b02965519b02b631aee13572957e7937c (diff)
downloadmongo-80b8ef11f5adff50088d9d35f7022d168e2a594f.tar.gz
SERVER-45006 LockerImpl::wasGlobalLockTaken() returns correct value
-rw-r--r--src/mongo/db/concurrency/d_concurrency_test.cpp14
-rw-r--r--src/mongo/db/concurrency/lock_state.cpp2
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) {