summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPavi Vetriselvan <pavithra.vetriselvan@mongodb.com>2020-08-06 09:49:48 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-12 12:17:48 +0000
commit8d495ce686890719e96c66ee6f3d1ddbf7704e78 (patch)
treeb266c1463978393bf2cc28608819ca28b4361a29 /src
parentb7d2e619b374113283e6bd7f67fb4da9883b5f21 (diff)
downloadmongo-8d495ce686890719e96c66ee6f3d1ddbf7704e78.tar.gz
SERVER-49988 Rename response fields if hello command is sent on mongos
Diffstat (limited to 'src')
-rw-r--r--src/mongo/s/commands/cluster_is_master_cmd.cpp7
-rw-r--r--src/mongo/s/mongos_is_master_response.cpp9
-rw-r--r--src/mongo/s/mongos_is_master_response.h7
3 files changed, 18 insertions, 5 deletions
diff --git a/src/mongo/s/commands/cluster_is_master_cmd.cpp b/src/mongo/s/commands/cluster_is_master_cmd.cpp
index 5e864ec3532..68ffe4281f0 100644
--- a/src/mongo/s/commands/cluster_is_master_cmd.cpp
+++ b/src/mongo/s/commands/cluster_is_master_cmd.cpp
@@ -102,6 +102,11 @@ public:
waitInIsMaster.pauseWhileSet(opCtx);
+ // Parse the command name, which should be one of the following: hello, isMaster, or
+ // ismaster. If the command is "hello", we must attach an "isWritablePrimary" response field
+ // instead of "ismaster".
+ bool useLegacyResponseFields = (cmdObj.firstElementFieldNameStringData() != kHelloString);
+
auto& clientMetadataIsMasterState = ClientMetadataIsMasterState::get(opCtx->getClient());
bool seenIsMaster = clientMetadataIsMasterState.hasSeenIsMaster();
if (!seenIsMaster) {
@@ -170,7 +175,7 @@ public:
auto mongosIsMasterResponse =
mongosTopCoord->awaitIsMasterResponse(opCtx, clientTopologyVersion, deadline);
- mongosIsMasterResponse->appendToBuilder(&result);
+ mongosIsMasterResponse->appendToBuilder(&result, useLegacyResponseFields);
// The isMaster response always includes a topologyVersion.
auto currentMongosTopologyVersion = mongosIsMasterResponse->getTopologyVersion();
diff --git a/src/mongo/s/mongos_is_master_response.cpp b/src/mongo/s/mongos_is_master_response.cpp
index 7a58489c9bb..11b0145f73c 100644
--- a/src/mongo/s/mongos_is_master_response.cpp
+++ b/src/mongo/s/mongos_is_master_response.cpp
@@ -39,8 +39,13 @@ MongosIsMasterResponse::MongosIsMasterResponse(TopologyVersion topologyVersion)
_msg = "isdbgrid";
}
-void MongosIsMasterResponse::appendToBuilder(BSONObjBuilder* builder) const {
- builder->append(kIsMasterFieldName, _isMaster);
+void MongosIsMasterResponse::appendToBuilder(BSONObjBuilder* builder,
+ bool useLegacyResponseFields) const {
+ if (useLegacyResponseFields) {
+ builder->append(kIsMasterFieldName, _isMaster);
+ } else {
+ builder->append(kIsWritablePrimaryFieldName, _isMaster);
+ }
builder->append(kMsgFieldName, _msg);
BSONObjBuilder topologyVersionBuilder(builder->subobjStart(kTopologyVersionFieldName));
diff --git a/src/mongo/s/mongos_is_master_response.h b/src/mongo/s/mongos_is_master_response.h
index aa9d523a845..00413126377 100644
--- a/src/mongo/s/mongos_is_master_response.h
+++ b/src/mongo/s/mongos_is_master_response.h
@@ -47,6 +47,7 @@ class MongosIsMasterResponse {
public:
static constexpr StringData kTopologyVersionFieldName = "topologyVersion"_sd;
static constexpr StringData kIsMasterFieldName = "ismaster"_sd;
+ static constexpr StringData kIsWritablePrimaryFieldName = "isWritablePrimary"_sd;
static constexpr StringData kMsgFieldName = "msg"_sd;
/**
@@ -55,9 +56,11 @@ public:
MongosIsMasterResponse(TopologyVersion topologyVersion);
/**
- * Appends MongosIsMasterResponse fields to "builder".
+ * Appends MongosIsMasterResponse fields to "builder". When true, "useLegacyResponseFields"
+ * indicates that we are responding to an isMaster command and not a hello command. Attach
+ * the legacy "ismaster" field if true, and the "isWritablePrimary" field otherwise.
*/
- void appendToBuilder(BSONObjBuilder* builder) const;
+ void appendToBuilder(BSONObjBuilder* builder, bool useLegacyResponseFields) const;
TopologyVersion getTopologyVersion() const {
return _topologyVersion;