summaryrefslogtreecommitdiff
path: root/src/mongo
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
parent72728d0429e74e1bec1715b4339f60159b0d6b4e (diff)
downloadmongo-8855c03bdf307ef74825e0274344b1ce8df0852b.tar.gz
SERVER-25204 Allow writeConcern w:1 for 'local' on CSRS config servers
Diffstat (limited to 'src/mongo')
-rw-r--r--src/mongo/db/commands/get_last_error.cpp6
-rw-r--r--src/mongo/db/namespace_string.cpp3
-rw-r--r--src/mongo/db/namespace_string.h6
-rw-r--r--src/mongo/db/write_concern.cpp11
-rw-r--r--src/mongo/db/write_concern.h6
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() {