diff options
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/commands/get_last_error.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/namespace_string.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/namespace_string.h | 6 | ||||
-rw-r--r-- | src/mongo/db/write_concern.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/write_concern.h | 6 |
5 files changed, 22 insertions, 10 deletions
diff --git a/src/mongo/db/commands/get_last_error.cpp b/src/mongo/db/commands/get_last_error.cpp index 498d32d9d0c..899d081926d 100644 --- a/src/mongo/db/commands/get_last_error.cpp +++ b/src/mongo/db/commands/get_last_error.cpp @@ -221,8 +221,10 @@ public: // Validate write concern no matter what, this matches 2.4 behavior // if (status.isOK()) { - // Ensure options are valid for this host - status = validateWriteConcern(txn, writeConcern); + // Ensure options are valid for this host. Since getLastError doesn't do writes itself, + // treat it as if these are admin database writes, which need to be replicated so we do + // the strictest checks write concern checks. + status = validateWriteConcern(txn, writeConcern, NamespaceString::kAdminDb); } if (!status.isOK()) { diff --git a/src/mongo/db/namespace_string.cpp b/src/mongo/db/namespace_string.cpp index db22280231b..5b53b509c5f 100644 --- a/src/mongo/db/namespace_string.cpp +++ b/src/mongo/db/namespace_string.cpp @@ -96,6 +96,9 @@ bool legalClientSystemNS(StringData ns, bool write) { return false; } +const StringData NamespaceString::kAdminDb = "admin"_sd; +const StringData NamespaceString::kLocalDb = "local"_sd; + const NamespaceString NamespaceString::kConfigCollectionNamespace(kConfigCollection); bool NamespaceString::isListCollectionsCursorNS() const { diff --git a/src/mongo/db/namespace_string.h b/src/mongo/db/namespace_string.h index 3b21be69a90..7ffb802cb1e 100644 --- a/src/mongo/db/namespace_string.h +++ b/src/mongo/db/namespace_string.h @@ -57,6 +57,12 @@ class NamespaceString { public: // Reserved system namespaces + // Namespace for the admin database + static const StringData kAdminDb; + + // Namespace for the local database + static const StringData kLocalDb; + // Namespace for storing configuration data, which needs to be replicated if the server is // running as a replica set. Documents in this collection should represent some configuration // state of the server, which needs to be recovered/consulted at startup. Each document in this 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 diff --git a/src/mongo/db/write_concern.h b/src/mongo/db/write_concern.h index eeff284ec61..9a9720f26ee 100644 --- a/src/mongo/db/write_concern.h +++ b/src/mongo/db/write_concern.h @@ -52,9 +52,11 @@ StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* txn, const bool supportsWriteConcern); /** - * Verifies that a WriteConcern is valid for this particular host. + * Verifies that a WriteConcern is valid for this particular host and database. */ -Status validateWriteConcern(OperationContext* txn, const WriteConcernOptions& writeConcern); +Status validateWriteConcern(OperationContext* txn, + const WriteConcernOptions& writeConcern, + StringData dbName); struct WriteConcernResult { WriteConcernResult() { |