summaryrefslogtreecommitdiff
path: root/src/mongo/db/write_concern.cpp
diff options
context:
space:
mode:
authorSiyuan Zhou <siyuan.zhou@mongodb.com>2015-04-23 16:21:37 -0400
committerSiyuan Zhou <siyuan.zhou@mongodb.com>2015-04-30 17:00:19 -0400
commit673bb299696b4afc16c2e2ebaa9a35600ec2969c (patch)
tree3826e0b76bd3e2d1b769dcc005cf54a2d1daf5a5 /src/mongo/db/write_concern.cpp
parent9da229e234c2f903ff2569f3d9422b60d28dbf4e (diff)
downloadmongo-673bb299696b4afc16c2e2ebaa9a35600ec2969c.tar.gz
SERVER-5218 Batch oplog writes always wait for journal.
Diffstat (limited to 'src/mongo/db/write_concern.cpp')
-rw-r--r--src/mongo/db/write_concern.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp
index a16352b34fc..7bb8edd0fa2 100644
--- a/src/mongo/db/write_concern.cpp
+++ b/src/mongo/db/write_concern.cpp
@@ -62,6 +62,18 @@ namespace mongo {
}
}
+ namespace {
+ // The consensus protocol requires that w: majority implies j: true on all nodes.
+ void addJournalSyncForWMajority(WriteConcernOptions* writeConcern) {
+ if (repl::getGlobalReplicationCoordinator()->isV1ElectionProtocol()
+ && writeConcern->wMode == WriteConcernOptions::kMajority
+ && writeConcern->syncMode == WriteConcernOptions::NONE)
+ {
+ writeConcern->syncMode = WriteConcernOptions::JOURNAL;
+ }
+ }
+ } // namespace
+
StatusWith<WriteConcernOptions> extractWriteConcern(const BSONObj& cmdObj) {
// The default write concern if empty is w : 1
// Specifying w : 0 is/was allowed, but is interpreted identically to w : 1
@@ -70,6 +82,8 @@ namespace mongo {
if (writeConcern.wNumNodes == 0 && writeConcern.wMode.empty()) {
writeConcern.wNumNodes = 1;
}
+ // Upgrade default write concern if necessary.
+ addJournalSyncForWMajority(&writeConcern);
BSONElement writeConcernElement;
Status wcStatus = bsonExtractTypedField(cmdObj,
@@ -100,6 +114,9 @@ namespace mongo {
return wcStatus;
}
+ // Upgrade parsed write concern if necessary.
+ addJournalSyncForWMajority(&writeConcern);
+
return writeConcern;
}
@@ -130,7 +147,7 @@ namespace mongo {
if ( replMode != repl::ReplicationCoordinator::modeReplSet &&
!writeConcern.wMode.empty() &&
- writeConcern.wMode != "majority" ) {
+ writeConcern.wMode != WriteConcernOptions::kMajority ) {
return Status( ErrorCodes::BadValue,
string( "cannot use non-majority 'w' mode " ) + writeConcern.wMode
+ " when a host is not a member of a replica set" );