summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2017-04-28 17:02:37 -0400
committerMathias Stearn <mathias@10gen.com>2017-05-12 12:07:30 -0400
commit486759fee5852abed5ee263583d6e867da9c0f5d (patch)
tree266ccf9fdfe6de8083fe0aef0350731164d4e6fc /src/mongo
parentcb3e9d87a1150fcfd90b7db3e289e298c5c70bff (diff)
downloadmongo-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.cpp1
-rw-r--r--src/mongo/db/commands.h6
-rw-r--r--src/mongo/db/commands/count_cmd.cpp1
-rw-r--r--src/mongo/db/commands/distinct.cpp1
-rw-r--r--src/mongo/db/commands/explain_cmd.cpp8
-rw-r--r--src/mongo/db/commands/find_and_modify.cpp1
-rw-r--r--src/mongo/db/commands/find_cmd.cpp1
-rw-r--r--src/mongo/db/commands/group_cmd.cpp1
-rw-r--r--src/mongo/db/commands/pipeline_command.cpp1
-rw-r--r--src/mongo/db/commands/write_commands/write_commands.cpp2
-rw-r--r--src/mongo/s/commands/cluster_count_cmd.cpp1
-rw-r--r--src/mongo/s/commands/cluster_explain_cmd.cpp11
-rw-r--r--src/mongo/s/commands/cluster_find_and_modify_cmd.cpp1
-rw-r--r--src/mongo/s/commands/cluster_find_cmd.cpp10
-rw-r--r--src/mongo/s/commands/cluster_pipeline_cmd.cpp3
-rw-r--r--src/mongo/s/commands/cluster_write_cmd.cpp1
-rw-r--r--src/mongo/s/commands/commands_public.cpp2
-rw-r--r--src/mongo/s/commands/strategy.cpp13
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);