diff options
author | Siyuan Zhou <siyuan.zhou@mongodb.com> | 2015-04-23 16:21:37 -0400 |
---|---|---|
committer | Siyuan Zhou <siyuan.zhou@mongodb.com> | 2015-04-30 17:00:19 -0400 |
commit | 673bb299696b4afc16c2e2ebaa9a35600ec2969c (patch) | |
tree | 3826e0b76bd3e2d1b769dcc005cf54a2d1daf5a5 /src/mongo/db/write_concern.cpp | |
parent | 9da229e234c2f903ff2569f3d9422b60d28dbf4e (diff) | |
download | mongo-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.cpp | 19 |
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" ); |