summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorJack Mulrow <jack.mulrow@mongodb.com>2018-11-12 10:47:21 -0500
committerJack Mulrow <jack.mulrow@mongodb.com>2018-11-15 10:51:03 -0500
commit922e2f27c087cc017bb612a5c86eedb2cfa52a75 (patch)
treed0789f8a6d0b2b0108f97756c2b2c102c69d4cda /src/mongo
parent06dd323b423deccb5fbb650ddbed0135c00191d2 (diff)
downloadmongo-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.cpp3
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp19
-rw-r--r--src/mongo/db/write_concern_options.cpp3
-rw-r--r--src/mongo/db/write_concern_options.h4
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;