summaryrefslogtreecommitdiff
path: root/src/mongo/db/write_concern.cpp
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2015-11-24 14:32:25 -0500
committerRandolph Tan <randolph@10gen.com>2015-11-25 10:15:23 -0500
commit4afeb91fb45bb343583a218e23b971cf7b3c33f1 (patch)
tree578a7278159e2a94b3d149d00aa584f16d48b10b /src/mongo/db/write_concern.cpp
parent3b3ef4253a6c5d5d3f18127ac2272a9696488aec (diff)
downloadmongo-4afeb91fb45bb343583a218e23b971cf7b3c33f1.tar.gz
SERVER-21604 v3.0 mongos fails to ping config.mongos if config servers are v3.2
Diffstat (limited to 'src/mongo/db/write_concern.cpp')
-rw-r--r--src/mongo/db/write_concern.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp
index e5e700fa49e..6f447d8b666 100644
--- a/src/mongo/db/write_concern.cpp
+++ b/src/mongo/db/write_concern.cpp
@@ -42,6 +42,7 @@
#include "mongo/db/stats/timer_stats.h"
#include "mongo/db/storage/storage_engine.h"
#include "mongo/db/write_concern_options.h"
+#include "mongo/rpc/protocol.h"
namespace mongo {
@@ -78,7 +79,8 @@ void addJournalSyncForWMajority(WriteConcernOptions* writeConcern) {
const std::string kLocalDB = "local";
} // namespace
-StatusWith<WriteConcernOptions> extractWriteConcern(const BSONObj& cmdObj,
+StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* txn,
+ const BSONObj& cmdObj,
const std::string& dbName) {
// The default write concern if empty is w : 1
// Specifying w : 0 is/was allowed, but is interpreted identically to w : 1
@@ -111,7 +113,7 @@ StatusWith<WriteConcernOptions> extractWriteConcern(const BSONObj& cmdObj,
return wcStatus;
}
- wcStatus = validateWriteConcern(writeConcern, dbName);
+ wcStatus = validateWriteConcern(txn, writeConcern, dbName);
if (!wcStatus.isOK()) {
return wcStatus;
}
@@ -121,7 +123,9 @@ StatusWith<WriteConcernOptions> extractWriteConcern(const BSONObj& cmdObj,
return writeConcern;
}
-Status validateWriteConcern(const WriteConcernOptions& writeConcern, const std::string& dbName) {
+Status validateWriteConcern(OperationContext* txn,
+ const WriteConcernOptions& writeConcern,
+ const std::string& dbName) {
const bool isJournalEnabled = getGlobalServiceContext()->getGlobalStorageEngine()->isDurable();
if (writeConcern.syncMode == WriteConcernOptions::JOURNAL && !isJournalEnabled) {
@@ -135,6 +139,15 @@ Status validateWriteConcern(const WriteConcernOptions& writeConcern, const std::
repl::getGlobalReplicationCoordinator()->getReplicationMode();
if (isConfigServer) {
+ auto protocol = rpc::getOperationProtocol(txn);
+ // This here only for v3.0 backwards compatibility.
+ if (serverGlobalParams.configsvrMode != CatalogManager::ConfigServerMode::CSRS &&
+ replMode != repl::ReplicationCoordinator::modeReplSet &&
+ protocol == rpc::Protocol::kOpQuery && writeConcern.wNumNodes == 0 &&
+ writeConcern.wMode.empty()) {
+ return Status::OK();
+ }
+
if (!writeConcern.validForConfigServers()) {
return Status(
ErrorCodes::BadValue,
@@ -224,7 +237,7 @@ Status waitForWriteConcern(OperationContext* txn,
WriteConcernResult* result) {
// We assume all options have been validated earlier, if not, programming error.
// Passing localDB name is a hack to avoid more rigorous check that performed for non local DB.
- dassert(validateWriteConcern(writeConcern, kLocalDB).isOK());
+ dassert(validateWriteConcern(txn, writeConcern, kLocalDB).isOK());
// We should never be waiting for write concern while holding any sort of lock, because this may
// lead to situations where the replication heartbeats are stalled.