diff options
author | Jack Mulrow <jack.mulrow@mongodb.com> | 2018-11-12 10:47:21 -0500 |
---|---|---|
committer | Jack Mulrow <jack.mulrow@mongodb.com> | 2018-11-15 10:51:03 -0500 |
commit | 922e2f27c087cc017bb612a5c86eedb2cfa52a75 (patch) | |
tree | d0789f8a6d0b2b0108f97756c2b2c102c69d4cda /src/mongo | |
parent | 06dd323b423deccb5fbb650ddbed0135c00191d2 (diff) | |
download | mongo-922e2f27c087cc017bb612a5c86eedb2cfa52a75.tar.gz |
SERVER-38094 Add write concern that waits for majority commit point but not committed snapshot
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/repl/repl_set_config.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.cpp | 19 | ||||
-rw-r--r-- | src/mongo/db/write_concern_options.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/write_concern_options.h | 4 |
4 files changed, 25 insertions, 4 deletions
diff --git a/src/mongo/db/repl/repl_set_config.cpp b/src/mongo/db/repl/repl_set_config.cpp index 0ae3ca2635d..e79ffa8fe89 100644 --- a/src/mongo/db/repl/repl_set_config.cpp +++ b/src/mongo/db/repl/repl_set_config.cpp @@ -609,7 +609,8 @@ Status ReplSetConfig::validate() const { Status ReplSetConfig::checkIfWriteConcernCanBeSatisfied( const WriteConcernOptions& writeConcern) const { - if (!writeConcern.wMode.empty() && writeConcern.wMode != WriteConcernOptions::kMajority) { + if (!writeConcern.wMode.empty() && writeConcern.wMode != WriteConcernOptions::kMajority && + writeConcern.wMode != WriteConcernOptions::kInternalMajorityNoSnapshot) { StatusWith<ReplSetTagPattern> tagPatternStatus = findCustomWriteMode(writeConcern.wMode); if (!tagPatternStatus.isOK()) { return tagPatternStatus.getStatus(); diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp index 48304b9234c..824db78c888 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl.cpp @@ -1478,9 +1478,24 @@ bool ReplicationCoordinatorImpl::_doneWaitingForReplication_inlock( opTime, writeConcern.wNumNodes, useDurableOpTime); } + const bool modeIsMajorityNoSnapshot = + writeConcern.wMode == WriteConcernOptions::kInternalMajorityNoSnapshot; + StringData patternName; - if (writeConcern.wMode == WriteConcernOptions::kMajority) { - if (_externalState->snapshotsEnabled() && !testingSnapshotBehaviorInIsolation) { + if (writeConcern.wMode == WriteConcernOptions::kMajority || modeIsMajorityNoSnapshot) { + if (modeIsMajorityNoSnapshot) { + // The internal majority no snapshot write concern waits for an opTime to be majority + // committed, but not necessarily in the committed snapshot. + const auto lastCommittedOpTime = _topCoord->getLastCommittedOpTime(); + if (lastCommittedOpTime < opTime) { + LOG(1) << "Required optime: " << opTime + << " is not yet majority committed, last committed optime: " + << lastCommittedOpTime; + return false; + } + + // Fall through to wait for "majority" write concern. + } else if (_externalState->snapshotsEnabled() && !testingSnapshotBehaviorInIsolation) { // Make sure we have a valid "committed" snapshot up to the needed optime. if (!_currentCommittedSnapshot) { return false; diff --git a/src/mongo/db/write_concern_options.cpp b/src/mongo/db/write_concern_options.cpp index 37103194a60..59fb840ec9a 100644 --- a/src/mongo/db/write_concern_options.cpp +++ b/src/mongo/db/write_concern_options.cpp @@ -67,10 +67,13 @@ const int WriteConcernOptions::kNoWaiting(-1); const StringData WriteConcernOptions::kWriteConcernField = "writeConcern"_sd; const char WriteConcernOptions::kMajority[] = "majority"; +const char WriteConcernOptions::kInternalMajorityNoSnapshot[] = "internalMajorityNoSnapshot"; const BSONObj WriteConcernOptions::Default = BSONObj(); const BSONObj WriteConcernOptions::Acknowledged(BSON("w" << W_NORMAL)); const BSONObj WriteConcernOptions::Unacknowledged(BSON("w" << W_NONE)); +const BSONObj WriteConcernOptions::InternalMajorityNoSnapshot( + BSON("w" << WriteConcernOptions::kInternalMajorityNoSnapshot)); const BSONObj WriteConcernOptions::Majority(BSON("w" << WriteConcernOptions::kMajority)); const Seconds WriteConcernOptions::kWriteConcernTimeoutSystem{15}; const Seconds WriteConcernOptions::kWriteConcernTimeoutMigration{30}; diff --git a/src/mongo/db/write_concern_options.h b/src/mongo/db/write_concern_options.h index 80d85d305dc..8a68a39bf8e 100644 --- a/src/mongo/db/write_concern_options.h +++ b/src/mongo/db/write_concern_options.h @@ -49,9 +49,11 @@ public: static const BSONObj Acknowledged; static const BSONObj Unacknowledged; static const BSONObj Majority; + static const BSONObj InternalMajorityNoSnapshot; static const StringData kWriteConcernField; - static const char kMajority[]; // = "majority" + static const char kMajority[]; // = "majority" + static const char kInternalMajorityNoSnapshot[]; // = "internalMajorityNoSnapshot" static const Seconds kWriteConcernTimeoutSystem; static const Seconds kWriteConcernTimeoutMigration; |