summaryrefslogtreecommitdiff
path: root/src/mongo/db/write_concern.cpp
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-07-25 10:35:01 -0400
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-07-25 15:16:17 -0400
commit8855c03bdf307ef74825e0274344b1ce8df0852b (patch)
tree7267e9725bff6495956229c5b661bfb297ef0406 /src/mongo/db/write_concern.cpp
parent72728d0429e74e1bec1715b4339f60159b0d6b4e (diff)
downloadmongo-8855c03bdf307ef74825e0274344b1ce8df0852b.tar.gz
SERVER-25204 Allow writeConcern w:1 for 'local' on CSRS config servers
Diffstat (limited to 'src/mongo/db/write_concern.cpp')
-rw-r--r--src/mongo/db/write_concern.cpp11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp
index a9c9adf1b99..6e986d87b19 100644
--- a/src/mongo/db/write_concern.cpp
+++ b/src/mongo/db/write_concern.cpp
@@ -83,7 +83,7 @@ StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* txn,
}
} else if (supportsWriteConcern) {
// If it supports writeConcern and does not use the default, validate the writeConcern.
- Status wcStatus = validateWriteConcern(txn, writeConcern);
+ Status wcStatus = validateWriteConcern(txn, writeConcern, dbName);
if (!wcStatus.isOK()) {
return wcStatus;
}
@@ -96,7 +96,9 @@ StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* txn,
return writeConcern;
}
-Status validateWriteConcern(OperationContext* txn, const WriteConcernOptions& writeConcern) {
+Status validateWriteConcern(OperationContext* txn,
+ const WriteConcernOptions& writeConcern,
+ StringData dbName) {
if (writeConcern.syncMode == WriteConcernOptions::SyncMode::JOURNAL &&
!txn->getServiceContext()->getGlobalStorageEngine()->isDurable()) {
return Status(ErrorCodes::BadValue,
@@ -107,7 +109,7 @@ Status validateWriteConcern(OperationContext* txn, const WriteConcernOptions& wr
// logic) should never be making non-majority writes against the config server, because sharding
// is not resilient against rollbacks of metadata writes.
if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer &&
- !writeConcern.validForConfigServers()) {
+ dbName != NamespaceString::kLocalDb && !writeConcern.validForConfigServers()) {
// The only cases where we allow non-majority writes are from within the config servers
// themselves, because these wait for write concern explicitly.
if (!txn->getClient()->isInDirectClient()) {
@@ -176,9 +178,6 @@ Status waitForWriteConcern(OperationContext* txn,
const OpTime& replOpTime,
const WriteConcernOptions& writeConcern,
WriteConcernResult* result) {
- // We assume all options have been validated earlier, if not, programming error
- dassertOK(validateWriteConcern(txn, writeConcern));
-
auto replCoord = repl::ReplicationCoordinator::get(txn);
// Next handle blocking on disk