diff options
author | Mathias Stearn <mathias@10gen.com> | 2017-04-28 17:02:37 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2017-05-12 12:07:30 -0400 |
commit | 486759fee5852abed5ee263583d6e867da9c0f5d (patch) | |
tree | 266ccf9fdfe6de8083fe0aef0350731164d4e6fc /src/mongo | |
parent | cb3e9d87a1150fcfd90b7db3e289e298c5c70bff (diff) | |
download | mongo-486759fee5852abed5ee263583d6e867da9c0f5d.tar.gz |
SERVER-28814 Attach ServerSelectionMetadata to OpCtx in mongos
This eliminates the need to pass it in to Command::explain()
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/commands.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/commands.h | 6 | ||||
-rw-r--r-- | src/mongo/db/commands/count_cmd.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/distinct.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/explain_cmd.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/commands/find_and_modify.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/find_cmd.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/group_cmd.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/pipeline_command.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/write_commands/write_commands.cpp | 2 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_count_cmd.cpp | 1 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_explain_cmd.cpp | 11 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_find_and_modify_cmd.cpp | 1 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_find_cmd.cpp | 10 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_pipeline_cmd.cpp | 3 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_write_cmd.cpp | 1 | ||||
-rw-r--r-- | src/mongo/s/commands/commands_public.cpp | 2 | ||||
-rw-r--r-- | src/mongo/s/commands/strategy.cpp | 13 |
18 files changed, 22 insertions, 43 deletions
diff --git a/src/mongo/db/commands.cpp b/src/mongo/db/commands.cpp index f82b97562a3..e6eba884659 100644 --- a/src/mongo/db/commands.cpp +++ b/src/mongo/db/commands.cpp @@ -167,7 +167,6 @@ Status Command::explain(OperationContext* opCtx, const string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const { return {ErrorCodes::IllegalOperation, str::stream() << "Cannot explain cmd: " << getName()}; } diff --git a/src/mongo/db/commands.h b/src/mongo/db/commands.h index 05493e2c444..a6a53116bac 100644 --- a/src/mongo/db/commands.h +++ b/src/mongo/db/commands.h @@ -210,17 +210,11 @@ public: * * 2) Calling Explain::explainStages(...) on the PlanExecutor. This is the function * which knows how to convert an execution stage tree into explain output. - * - * TODO: Remove the 'serverSelectionMetadata' parameter in favor of reading the - * ServerSelectionMetadata off 'opCtx'. Once OP_COMMAND is implemented in mongos, this metadata - * will be parsed and attached as a decoration on the OperationContext, as is already done on - * the mongod side. */ virtual Status explain(OperationContext* opCtx, const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const; /** diff --git a/src/mongo/db/commands/count_cmd.cpp b/src/mongo/db/commands/count_cmd.cpp index 8ca762e2022..2af91e01876 100644 --- a/src/mongo/db/commands/count_cmd.cpp +++ b/src/mongo/db/commands/count_cmd.cpp @@ -104,7 +104,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata&, BSONObjBuilder* out) const { const bool isExplain = true; auto request = CountRequest::parseFromBSON(dbname, cmdObj, isExplain); diff --git a/src/mongo/db/commands/distinct.cpp b/src/mongo/db/commands/distinct.cpp index 6b67bd840c1..6c2bef4012a 100644 --- a/src/mongo/db/commands/distinct.cpp +++ b/src/mongo/db/commands/distinct.cpp @@ -116,7 +116,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata&, BSONObjBuilder* out) const { const NamespaceString nss(parseNsCollectionRequired(dbname, cmdObj)); diff --git a/src/mongo/db/commands/explain_cmd.cpp b/src/mongo/db/commands/explain_cmd.cpp index 9f49c8b38e7..59004e87e12 100644 --- a/src/mongo/db/commands/explain_cmd.cpp +++ b/src/mongo/db/commands/explain_cmd.cpp @@ -165,12 +165,8 @@ public: } // Actually call the nested command's explain(...) method. - Status explainStatus = commToExplain->explain(opCtx, - dbname, - explainObj, - verbosity.getValue(), - rpc::ServerSelectionMetadata::get(opCtx), - &result); + Status explainStatus = + commToExplain->explain(opCtx, dbname, explainObj, verbosity.getValue(), &result); if (!explainStatus.isOK()) { return appendCommandStatus(result, explainStatus); } diff --git a/src/mongo/db/commands/find_and_modify.cpp b/src/mongo/db/commands/find_and_modify.cpp index 05eedc835a8..ce8abf5ab8c 100644 --- a/src/mongo/db/commands/find_and_modify.cpp +++ b/src/mongo/db/commands/find_and_modify.cpp @@ -252,7 +252,6 @@ public: const std::string& dbName, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata&, BSONObjBuilder* out) const override { const NamespaceString fullNs = parseNsCollectionRequired(dbName, cmdObj); Status allowedWriteStatus = userAllowedWriteNS(fullNs.ns()); diff --git a/src/mongo/db/commands/find_cmd.cpp b/src/mongo/db/commands/find_cmd.cpp index b874eecaa99..dc6640989f9 100644 --- a/src/mongo/db/commands/find_cmd.cpp +++ b/src/mongo/db/commands/find_cmd.cpp @@ -134,7 +134,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata&, BSONObjBuilder* out) const override { const NamespaceString nss(parseNs(dbname, cmdObj)); if (!nss.isValid()) { diff --git a/src/mongo/db/commands/group_cmd.cpp b/src/mongo/db/commands/group_cmd.cpp index c7f0b70c6ba..ac17916ef31 100644 --- a/src/mongo/db/commands/group_cmd.cpp +++ b/src/mongo/db/commands/group_cmd.cpp @@ -124,7 +124,6 @@ private: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata&, BSONObjBuilder* out) const { GroupRequest groupRequest; Status parseRequestStatus = _parseRequest(dbname, cmdObj, &groupRequest); diff --git a/src/mongo/db/commands/pipeline_command.cpp b/src/mongo/db/commands/pipeline_command.cpp index a28bc7ae9c5..8a133a7185c 100644 --- a/src/mongo/db/commands/pipeline_command.cpp +++ b/src/mongo/db/commands/pipeline_command.cpp @@ -94,7 +94,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const override { return _runAggCommand(opCtx, dbname, cmdObj, verbosity, out); } diff --git a/src/mongo/db/commands/write_commands/write_commands.cpp b/src/mongo/db/commands/write_commands/write_commands.cpp index 905a93f0eb6..a3ecd02b36a 100644 --- a/src/mongo/db/commands/write_commands/write_commands.cpp +++ b/src/mongo/db/commands/write_commands/write_commands.cpp @@ -304,7 +304,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata&, BSONObjBuilder* out) const final { const auto batch = parseUpdateCommand(dbname, cmdObj); uassert(ErrorCodes::InvalidLength, @@ -375,7 +374,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata&, BSONObjBuilder* out) const final { const auto batch = parseDeleteCommand(dbname, cmdObj); uassert(ErrorCodes::InvalidLength, diff --git a/src/mongo/s/commands/cluster_count_cmd.cpp b/src/mongo/s/commands/cluster_count_cmd.cpp index 2389a7c9b97..ea66e57fef8 100644 --- a/src/mongo/s/commands/cluster_count_cmd.cpp +++ b/src/mongo/s/commands/cluster_count_cmd.cpp @@ -241,7 +241,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& ssm, BSONObjBuilder* out) const override { const NamespaceString nss(parseNs(dbname, cmdObj)); uassert(ErrorCodes::InvalidNamespace, diff --git a/src/mongo/s/commands/cluster_explain_cmd.cpp b/src/mongo/s/commands/cluster_explain_cmd.cpp index db053de01a0..6f03cecb53b 100644 --- a/src/mongo/s/commands/cluster_explain_cmd.cpp +++ b/src/mongo/s/commands/cluster_explain_cmd.cpp @@ -143,16 +143,9 @@ public: str::stream() << "Explain failed due to unknown command: " << cmdName}); } - auto readPref = ClusterFind::extractUnwrappedReadPref(cmdObj); - if (!readPref.isOK()) { - return appendCommandStatus(result, readPref.getStatus()); - } - const bool secondaryOk = (readPref.getValue().pref != ReadPreference::PrimaryOnly); - rpc::ServerSelectionMetadata metadata(secondaryOk, readPref.getValue()); - // Actually call the nested command's explain(...) method. - Status explainStatus = commToExplain->explain( - opCtx, dbName, explainObj, verbosity.getValue(), metadata, &result); + Status explainStatus = + commToExplain->explain(opCtx, dbName, explainObj, verbosity.getValue(), &result); if (!explainStatus.isOK()) { return appendCommandStatus(result, explainStatus); } diff --git a/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp b/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp index f16c508ca59..ee23438a2fb 100644 --- a/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp +++ b/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp @@ -84,7 +84,6 @@ public: const std::string& dbName, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const override { const NamespaceString nss(parseNsCollectionRequired(dbName, cmdObj)); diff --git a/src/mongo/s/commands/cluster_find_cmd.cpp b/src/mongo/s/commands/cluster_find_cmd.cpp index a09a839a94a..83598d92401 100644 --- a/src/mongo/s/commands/cluster_find_cmd.cpp +++ b/src/mongo/s/commands/cluster_find_cmd.cpp @@ -38,6 +38,7 @@ #include "mongo/db/stats/counters.h" #include "mongo/db/views/resolved_view.h" #include "mongo/rpc/get_status_from_command_result.h" +#include "mongo/rpc/metadata/server_selection_metadata.h" #include "mongo/s/commands/cluster_aggregate.h" #include "mongo/s/commands/strategy.h" #include "mongo/s/query/cluster_find.h" @@ -105,7 +106,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const final { const NamespaceString nss(parseNsCollectionRequired(dbname, cmdObj)); // Parse the command BSON to a QueryRequest. @@ -115,8 +115,12 @@ public: return qr.getStatus(); } - auto result = Strategy::explainFind( - opCtx, cmdObj, *qr.getValue(), verbosity, serverSelectionMetadata, out); + auto result = Strategy::explainFind(opCtx, + cmdObj, + *qr.getValue(), + verbosity, + rpc::ServerSelectionMetadata::get(opCtx), + out); if (result == ErrorCodes::CommandOnShardedViewNotSupportedOnMongod) { auto resolvedView = ResolvedView::fromBSON(out->asTempObj()); diff --git a/src/mongo/s/commands/cluster_pipeline_cmd.cpp b/src/mongo/s/commands/cluster_pipeline_cmd.cpp index dca24de659e..9841f87d6a4 100644 --- a/src/mongo/s/commands/cluster_pipeline_cmd.cpp +++ b/src/mongo/s/commands/cluster_pipeline_cmd.cpp @@ -80,13 +80,12 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const override { // Add the server selection metadata to the aggregate command in the "unwrapped" format that // runAggregate() expects: {aggregate: ..., $queryOptions: {$readPreference: ...}}. BSONObjBuilder aggCmdBuilder; aggCmdBuilder.appendElements(cmdObj); - if (auto readPref = serverSelectionMetadata.getReadPreference()) { + if (auto readPref = rpc::ServerSelectionMetadata::get(opCtx).getReadPreference()) { aggCmdBuilder.append(QueryRequest::kUnwrappedReadPrefField, BSON("$readPreference" << readPref->toBSON())); } diff --git a/src/mongo/s/commands/cluster_write_cmd.cpp b/src/mongo/s/commands/cluster_write_cmd.cpp index dc9ab0c27b9..96d40270a32 100644 --- a/src/mongo/s/commands/cluster_write_cmd.cpp +++ b/src/mongo/s/commands/cluster_write_cmd.cpp @@ -96,7 +96,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const { BatchedCommandRequest request(_writeType); diff --git a/src/mongo/s/commands/commands_public.cpp b/src/mongo/s/commands/commands_public.cpp index 208539821b9..80fbf479a93 100644 --- a/src/mongo/s/commands/commands_public.cpp +++ b/src/mongo/s/commands/commands_public.cpp @@ -888,7 +888,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& serverSelectionMetadata, BSONObjBuilder* out) const override { // We will time how long it takes to run the commands on the shards. Timer timer; @@ -1116,7 +1115,6 @@ public: const std::string& dbname, const BSONObj& cmdObj, ExplainOptions::Verbosity verbosity, - const rpc::ServerSelectionMetadata& ssm, BSONObjBuilder* out) const { const NamespaceString nss(parseNsCollectionRequired(dbname, cmdObj)); diff --git a/src/mongo/s/commands/strategy.cpp b/src/mongo/s/commands/strategy.cpp index 707b728efe4..59f899a88b1 100644 --- a/src/mongo/s/commands/strategy.cpp +++ b/src/mongo/s/commands/strategy.cpp @@ -353,15 +353,20 @@ DbResponse Strategy::clientCommandOp(OperationContext* opCtx, if (e.type() == Object && (e.fieldName()[0] == '$' ? str::equals("query", e.fieldName() + 1) : str::equals("query", e.fieldName()))) { // Extract the embedded query object. - if (cmdObj.hasField(Query::ReadPrefField.name())) { + if (auto readPrefElem = cmdObj[Query::ReadPrefField.name()]) { // The command has a read preference setting. We don't want to lose this information - // so we copy this to a new field called $queryOptions.$readPreference + // so we put it on the OperationContext and copy it to a new field called + // $queryOptions.$readPreference + auto readPref = + uassertStatusOK(ReadPreferenceSetting::fromBSON(readPrefElem.Obj())); + rpc::ServerSelectionMetadata::get(opCtx) = rpc::ServerSelectionMetadata( + readPref.pref != ReadPreference::PrimaryOnly, readPref); haveReadPref = true; BSONObjBuilder finalCmdObjBuilder; finalCmdObjBuilder.appendElements(e.embeddedObject()); BSONObjBuilder queryOptionsBuilder(finalCmdObjBuilder.subobjStart("$queryOptions")); - queryOptionsBuilder.append(cmdObj[Query::ReadPrefField.name()]); + queryOptionsBuilder.append(readPrefElem); queryOptionsBuilder.done(); cmdObj = finalCmdObjBuilder.obj(); @@ -373,6 +378,8 @@ DbResponse Strategy::clientCommandOp(OperationContext* opCtx, if (!haveReadPref && q.queryOptions & QueryOption_SlaveOk) { // If the slaveOK bit is set, behave as-if read preference secondary-preferred was // specified. + rpc::ServerSelectionMetadata::get(opCtx) = rpc::ServerSelectionMetadata( + true, ReadPreferenceSetting(ReadPreference::SecondaryPreferred)); BSONObjBuilder finalCmdObjBuilder; finalCmdObjBuilder.appendElements(cmdObj); |