summaryrefslogtreecommitdiff
path: root/src/mongo/s/commands/commands_public.cpp
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2018-01-08 17:42:04 -0500
committerMathias Stearn <mathias@10gen.com>2018-01-17 17:10:47 -0500
commit84c3f83421b262028081296e4c387d29691ea376 (patch)
tree802785c4a4cd2f6a2f7ffb8c2a2193f7c06e1313 /src/mongo/s/commands/commands_public.cpp
parent076a499621f7b423d6541dc96254e7c947c33413 (diff)
downloadmongo-84c3f83421b262028081296e4c387d29691ea376.tar.gz
SERVER-32586 Convert ResolvedView to use ErrorExtraInfo
Diffstat (limited to 'src/mongo/s/commands/commands_public.cpp')
-rw-r--r--src/mongo/s/commands/commands_public.cpp96
1 files changed, 37 insertions, 59 deletions
diff --git a/src/mongo/s/commands/commands_public.cpp b/src/mongo/s/commands/commands_public.cpp
index cbc8d772b79..0a6033bd584 100644
--- a/src/mongo/s/commands/commands_public.cpp
+++ b/src/mongo/s/commands/commands_public.cpp
@@ -275,13 +275,13 @@ public:
const NamespaceString nss(CommandHelpers::parseNsCollectionRequired(dbName, cmdObj));
LOG(1) << "dropIndexes: " << nss << " cmd:" << redact(cmdObj);
- auto shardResponses = uassertStatusOK(scatterGatherOnlyVersionIfUnsharded(
+ auto shardResponses = scatterGatherOnlyVersionIfUnsharded(
opCtx,
dbName,
nss,
CommandHelpers::filterCommandRequestForPassthrough(cmdObj),
ReadPreferenceSetting::get(opCtx),
- Shard::RetryPolicy::kNotIdempotent));
+ Shard::RetryPolicy::kNotIdempotent);
return appendRawResponses(
opCtx, &errmsg, &output, std::move(shardResponses), {ErrorCodes::NamespaceNotFound});
}
@@ -321,13 +321,13 @@ public:
uassertStatusOK(createShardDatabase(opCtx, dbName));
- auto shardResponses = uassertStatusOK(scatterGatherOnlyVersionIfUnsharded(
+ auto shardResponses = scatterGatherOnlyVersionIfUnsharded(
opCtx,
dbName,
nss,
CommandHelpers::filterCommandRequestForPassthrough(cmdObj),
ReadPreferenceSetting::get(opCtx),
- Shard::RetryPolicy::kNoRetry));
+ Shard::RetryPolicy::kNoRetry);
return appendRawResponses(opCtx,
&errmsg,
&output,
@@ -368,13 +368,13 @@ public:
const NamespaceString nss(CommandHelpers::parseNsCollectionRequired(dbName, cmdObj));
LOG(1) << "reIndex: " << nss << " cmd:" << redact(cmdObj);
- auto shardResponses = uassertStatusOK(scatterGatherOnlyVersionIfUnsharded(
+ auto shardResponses = scatterGatherOnlyVersionIfUnsharded(
opCtx,
dbName,
nss,
CommandHelpers::filterCommandRequestForPassthrough(cmdObj),
ReadPreferenceSetting::get(opCtx),
- Shard::RetryPolicy::kNoRetry));
+ Shard::RetryPolicy::kNoRetry);
return appendRawResponses(
opCtx, &errmsg, &output, std::move(shardResponses), {ErrorCodes::NamespaceNotFound});
}
@@ -411,13 +411,13 @@ public:
const NamespaceString nss(CommandHelpers::parseNsCollectionRequired(dbName, cmdObj));
LOG(1) << "collMod: " << nss << " cmd:" << redact(cmdObj);
- auto shardResponses = uassertStatusOK(scatterGatherOnlyVersionIfUnsharded(
+ auto shardResponses = scatterGatherOnlyVersionIfUnsharded(
opCtx,
dbName,
nss,
CommandHelpers::filterCommandRequestForPassthrough(cmdObj),
ReadPreferenceSetting::get(opCtx),
- Shard::RetryPolicy::kNoRetry));
+ Shard::RetryPolicy::kNoRetry);
return appendRawResponses(
opCtx, &errmsg, &output, std::move(shardResponses), {ErrorCodes::NamespaceNotFound});
}
@@ -1112,27 +1112,20 @@ public:
const auto routingInfo =
uassertStatusOK(Grid::get(opCtx)->catalogCache()->getCollectionRoutingInfo(opCtx, nss));
- BSONObj viewDefinition;
- auto swShardResponses = scatterGatherVersionedTargetByRoutingTable(
- opCtx,
- dbName,
- nss,
- CommandHelpers::filterCommandRequestForPassthrough(cmdObj),
- ReadPreferenceSetting::get(opCtx),
- Shard::RetryPolicy::kIdempotent,
- query,
- collation,
- &viewDefinition);
-
- if (ErrorCodes::CommandOnShardedViewNotSupportedOnMongod == swShardResponses.getStatus()) {
- uassert(ErrorCodes::InternalError,
- str::stream() << "Missing resolved view definition, but remote returned "
- << ErrorCodes::errorString(swShardResponses.getStatus().code()),
- !viewDefinition.isEmpty());
-
- auto resolvedView = ResolvedView::fromBSON(viewDefinition);
+ std::vector<AsyncRequestsSender::Response> shardResponses;
+ try {
+ shardResponses = scatterGatherVersionedTargetByRoutingTable(
+ opCtx,
+ dbName,
+ nss,
+ CommandHelpers::filterCommandRequestForPassthrough(cmdObj),
+ ReadPreferenceSetting::get(opCtx),
+ Shard::RetryPolicy::kIdempotent,
+ query,
+ collation);
+ } catch (const ExceptionFor<ErrorCodes::CommandOnShardedViewNotSupportedOnMongod>& ex) {
auto parsedDistinct = ParsedDistinct::parse(
- opCtx, resolvedView.getNamespace(), cmdObj, ExtensionsCallbackNoop(), true);
+ opCtx, ex->getNamespace(), cmdObj, ExtensionsCallbackNoop(), true);
if (!parsedDistinct.isOK()) {
return CommandHelpers::appendCommandStatus(result, parsedDistinct.getStatus());
}
@@ -1147,8 +1140,7 @@ public:
return CommandHelpers::appendCommandStatus(result, aggRequestOnView.getStatus());
}
- auto resolvedAggRequest =
- resolvedView.asExpandedViewAggregation(aggRequestOnView.getValue());
+ auto resolvedAggRequest = ex->asExpandedViewAggregation(aggRequestOnView.getValue());
auto resolvedAggCmd = resolvedAggRequest.serializeToCommandObj().toBson();
BSONObj aggResult = CommandHelpers::runCommandDirectly(
@@ -1162,9 +1154,6 @@ public:
return true;
}
- uassertStatusOK(swShardResponses.getStatus());
- auto shardResponses = std::move(swShardResponses.getValue());
-
BSONObjComparator bsonCmp(
BSONObj(),
BSONObjComparator::FieldNamesMode::kConsider,
@@ -1230,29 +1219,20 @@ public:
// We will time how long it takes to run the commands on the shards.
Timer timer;
- BSONObj viewDefinition;
- auto swShardResponses =
- scatterGatherVersionedTargetByRoutingTable(opCtx,
- dbname,
- nss,
- explainCmd,
- ReadPreferenceSetting::get(opCtx),
- Shard::RetryPolicy::kIdempotent,
- targetingQuery,
- targetingCollation,
- &viewDefinition);
-
- long long millisElapsed = timer.millis();
-
- if (ErrorCodes::CommandOnShardedViewNotSupportedOnMongod == swShardResponses.getStatus()) {
- uassert(ErrorCodes::InternalError,
- str::stream() << "Missing resolved view definition, but remote returned "
- << ErrorCodes::errorString(swShardResponses.getStatus().code()),
- !viewDefinition.isEmpty());
-
- auto resolvedView = ResolvedView::fromBSON(viewDefinition);
+ std::vector<AsyncRequestsSender::Response> shardResponses;
+ try {
+ shardResponses =
+ scatterGatherVersionedTargetByRoutingTable(opCtx,
+ dbname,
+ nss,
+ explainCmd,
+ ReadPreferenceSetting::get(opCtx),
+ Shard::RetryPolicy::kIdempotent,
+ targetingQuery,
+ targetingCollation);
+ } catch (const ExceptionFor<ErrorCodes::CommandOnShardedViewNotSupportedOnMongod>& ex) {
auto parsedDistinct = ParsedDistinct::parse(
- opCtx, resolvedView.getNamespace(), cmdObj, ExtensionsCallbackNoop(), true);
+ opCtx, ex->getNamespace(), cmdObj, ExtensionsCallbackNoop(), true);
if (!parsedDistinct.isOK()) {
return parsedDistinct.getStatus();
}
@@ -1268,8 +1248,7 @@ public:
return aggRequestOnView.getStatus();
}
- auto resolvedAggRequest =
- resolvedView.asExpandedViewAggregation(aggRequestOnView.getValue());
+ auto resolvedAggRequest = ex->asExpandedViewAggregation(aggRequestOnView.getValue());
auto resolvedAggCmd = resolvedAggRequest.serializeToCommandObj().toBson();
ClusterAggregate::Namespaces nsStruct;
@@ -1280,8 +1259,7 @@ public:
opCtx, nsStruct, resolvedAggRequest, resolvedAggCmd, out);
}
- uassertStatusOK(swShardResponses.getStatus());
- auto shardResponses = std::move(swShardResponses.getValue());
+ long long millisElapsed = timer.millis();
const char* mongosStageName =
ClusterExplain::getStageNameForReadOp(shardResponses.size(), cmdObj);