diff options
author | Pavi Vetriselvan <pavithra.vetriselvan@mongodb.com> | 2020-08-06 09:49:48 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-12 12:17:48 +0000 |
commit | 8d495ce686890719e96c66ee6f3d1ddbf7704e78 (patch) | |
tree | b266c1463978393bf2cc28608819ca28b4361a29 /src | |
parent | b7d2e619b374113283e6bd7f67fb4da9883b5f21 (diff) | |
download | mongo-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.cpp | 7 | ||||
-rw-r--r-- | src/mongo/s/mongos_is_master_response.cpp | 9 | ||||
-rw-r--r-- | src/mongo/s/mongos_is_master_response.h | 7 |
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; |