diff options
author | Vesselina Ratcheva <vesselina.ratcheva@10gen.com> | 2019-07-09 17:53:43 -0400 |
---|---|---|
committer | Vesselina Ratcheva <vesselina.ratcheva@10gen.com> | 2019-07-10 14:21:37 -0400 |
commit | c91ee22877d56754df99563673bed49e59c6007c (patch) | |
tree | f664f894707d29233dba0cdfe7f5c998d728b38a | |
parent | c0f9667715e87634ba3d8d956e8bc9ae752518cf (diff) | |
download | mongo-c91ee22877d56754df99563673bed49e59c6007c.tar.gz |
SERVER-41036 Make ReadWriteAbility::_canAcceptNonLocalWrites an AtomicWord<bool>
(cherry-picked from commit 21746d3302f37a9d5716c2f249b99d7f0e273344)
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.cpp | 22 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.h | 2 |
2 files changed, 12 insertions, 12 deletions
diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp index 9b8990e91c7..3997add1882 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl.cpp @@ -1041,7 +1041,7 @@ void ReplicationCoordinatorImpl::signalDrainComplete(OperationContext* opCtx, _applierState = ApplierState::Stopped; invariant(_getMemberState_inlock().primary()); - invariant(!_canAcceptNonLocalWrites); + invariant(!_canAcceptNonLocalWrites.loadRelaxed()); { lk.unlock(); @@ -1114,7 +1114,7 @@ void ReplicationCoordinatorImpl::setMyLastAppliedOpTimeForward(const OpTime& opT opTime.getTimestamp() < myLastAppliedOpTime.getTimestamp()); } - if (consistency == DataConsistency::Consistent && _canAcceptNonLocalWrites && + if (consistency == DataConsistency::Consistent && _canAcceptNonLocalWrites.loadRelaxed() && _rsConfig.getWriteMajority() == 1) { // Single vote primaries may have a lagged stable timestamp due to paring back the // stable timestamp to the all committed timestamp. @@ -1763,7 +1763,7 @@ Status ReplicationCoordinatorImpl::stepDown(OperationContext* opCtx, // catch up without allowing new writes in. auto action = _updateMemberStateFromTopologyCoordinator_inlock(opCtx); invariant(action == PostMemberStateUpdateAction::kActionNone); - invariant(!_canAcceptNonLocalWrites); + invariant(!_canAcceptNonLocalWrites.loadRelaxed()); // Make sure that we leave _canAcceptNonLocalWrites in the proper state. auto updateMemberState = [&] { @@ -1953,7 +1953,7 @@ bool ReplicationCoordinatorImpl::canAcceptWritesForDatabase_UNSAFE(OperationCont // // Stand-alone nodes and drained replica set primaries can always accept writes. Writes are // always permitted to the "local" database. - if (_canAcceptNonLocalWrites || alwaysAllowNonLocalWrites(*opCtx)) { + if (_canAcceptNonLocalWrites.loadRelaxed() || alwaysAllowNonLocalWrites(*opCtx)) { return true; } if (dbName == kLocalDB) { @@ -1982,7 +1982,7 @@ bool ReplicationCoordinatorImpl::canAcceptWritesFor_UNSAFE(OperationContext* opC // If we can accept non local writes (ie we're PRIMARY) then we must not be in ROLLBACK. // This check is redundant of the check of _memberState below, but since this can be checked // without locking, we do it as an optimization. - if (_canAcceptNonLocalWrites || alwaysAllowNonLocalWrites(*opCtx)) { + if (_canAcceptNonLocalWrites.loadRelaxed() || alwaysAllowNonLocalWrites(*opCtx)) { return true; } @@ -2033,7 +2033,7 @@ Status ReplicationCoordinatorImpl::checkCanServeReadsFor_UNSAFE(OperationContext auto session = OperationContextSession::get(opCtx); if (session && session->inActiveOrKilledMultiDocumentTransaction()) { - if (!_canAcceptNonLocalWrites && !getTestCommandsEnabled()) { + if (!_canAcceptNonLocalWrites.loadRelaxed() && !getTestCommandsEnabled()) { return Status(ErrorCodes::NotMaster, "Multi-document transactions are only allowed on replica set primaries."); } @@ -2145,7 +2145,7 @@ void ReplicationCoordinatorImpl::fillIsMasterForReplSet( _currentCommittedSnapshot->getTimestamp().getSecs()); } - if (response->isMaster() && !_canAcceptNonLocalWrites) { + if (response->isMaster() && !_canAcceptNonLocalWrites.loadRelaxed()) { // Report that we are secondary to ismaster callers until drain completes. response->setIsMaster(false); response->setIsSecondary(true); @@ -2615,12 +2615,12 @@ ReplicationCoordinatorImpl::_updateMemberStateFromTopologyCoordinator_inlock( // have just failed a stepdown attempt and thus are staying in PRIMARY state but restoring // our ability to accept writes. bool canAcceptWrites = _topCoord->canAcceptWrites(); - if (canAcceptWrites != _canAcceptNonLocalWrites) { + if (canAcceptWrites != _canAcceptNonLocalWrites.loadRelaxed()) { // We must be holding the global X lock to change _canAcceptNonLocalWrites. invariant(opCtx); invariant(opCtx->lockState()->isW()); } - _canAcceptNonLocalWrites = canAcceptWrites; + _canAcceptNonLocalWrites.store(canAcceptWrites); } @@ -2646,7 +2646,7 @@ ReplicationCoordinatorImpl::_updateMemberStateFromTopologyCoordinator_inlock( _opTimeWaiterList.signalAll_inlock(); // _canAcceptNonLocalWrites should already be set above. - invariant(!_canAcceptNonLocalWrites); + invariant(!_canAcceptNonLocalWrites.loadRelaxed()); serverGlobalParams.validateFeaturesAsMaster.store(false); result = kActionCloseAllConnections; @@ -3233,7 +3233,7 @@ boost::optional<OpTime> ReplicationCoordinatorImpl::_calculateStableOpTime_inloc } auto maximumStableTimestamp = commitPoint.getTimestamp(); - if (_canAcceptNonLocalWrites && _storage->supportsDocLocking(_service)) { + if (_canAcceptNonLocalWrites.loadRelaxed() && _storage->supportsDocLocking(_service)) { // If the storage engine supports document level locking, then it is possible for oplog // writes to commit out of order. In that case, we don't want to set the stable timestamp // ahead of the all committed timestamp. This is not a problem for oplog application diff --git a/src/mongo/db/repl/replication_coordinator_impl.h b/src/mongo/db/repl/replication_coordinator_impl.h index 1dedf5a1e27..3c5cb4a9242 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.h +++ b/src/mongo/db/repl/replication_coordinator_impl.h @@ -1249,7 +1249,7 @@ private: // Flag that indicates whether writes to databases other than "local" are allowed. Used to // answer canAcceptWritesForDatabase() and canAcceptWritesFor() questions. // Always true for standalone nodes. - bool _canAcceptNonLocalWrites; // (GM) + AtomicWord<bool> _canAcceptNonLocalWrites; // (GM) // Flag that indicates whether reads from databases other than "local" are allowed. Unlike // _canAcceptNonLocalWrites, above, this question is about admission control on secondaries, |