diff options
author | Mathias Stearn <mathias@10gen.com> | 2018-01-08 17:42:04 -0500 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2018-01-17 17:10:47 -0500 |
commit | 84c3f83421b262028081296e4c387d29691ea376 (patch) | |
tree | 802785c4a4cd2f6a2f7ffb8c2a2193f7c06e1313 /src/mongo/s/commands/commands_public.cpp | |
parent | 076a499621f7b423d6541dc96254e7c947c33413 (diff) | |
download | mongo-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.cpp | 96 |
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); |