diff options
author | Gregory Noma <gregory.noma@gmail.com> | 2018-07-12 14:48:46 -0400 |
---|---|---|
committer | Gregory Noma <gregory.noma@gmail.com> | 2018-07-24 13:56:03 -0400 |
commit | 0136f88d1c7d3e49f0e089f826e0b19af45f3b89 (patch) | |
tree | 77306a28d4b4c7946c1158dd127a916ab146cd0f /src/mongo/s/commands | |
parent | 9d31d0caa167e9661aaf0f10f260313133bd2a02 (diff) | |
download | mongo-0136f88d1c7d3e49f0e089f826e0b19af45f3b89.tar.gz |
SERVER-36020 Redesign CursorResponseBuilder to allow usage of DocumentSequence
Co-authored-by: Anthony Roy <anthony.roy@10gen.com>
Diffstat (limited to 'src/mongo/s/commands')
-rw-r--r-- | src/mongo/s/commands/cluster_aggregate.cpp | 14 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_count_cmd.cpp | 8 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_distinct_cmd.cpp | 8 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_explain_cmd.cpp | 5 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_find_and_modify_cmd.cpp | 11 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_find_cmd.cpp | 16 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_pipeline_cmd.cpp | 5 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_write_cmd.cpp | 5 |
8 files changed, 44 insertions, 28 deletions
diff --git a/src/mongo/s/commands/cluster_aggregate.cpp b/src/mongo/s/commands/cluster_aggregate.cpp index dcbd8074319..1aa3045ea5f 100644 --- a/src/mongo/s/commands/cluster_aggregate.cpp +++ b/src/mongo/s/commands/cluster_aggregate.cpp @@ -33,6 +33,7 @@ #include "mongo/s/commands/cluster_aggregate.h" #include <boost/intrusive_ptr.hpp> +#include <mongo/rpc/op_msg_rpc_impls.h> #include "mongo/bson/util/bson_extract.h" #include "mongo/db/auth/authorization_session.h" @@ -543,9 +544,12 @@ BSONObj establishMergingMongosCursor(OperationContext* opCtx, opCtx, Grid::get(opCtx)->getExecutorPool()->getArbitraryExecutor(), std::move(params)); auto cursorState = ClusterCursorManager::CursorState::NotExhausted; - BSONObjBuilder cursorResponse; - CursorResponseBuilder responseBuilder(true, &cursorResponse); + rpc::OpMsgReplyBuilder replyBuilder; + CursorResponseBuilder::Options options; + options.isInitialResponse = true; + + CursorResponseBuilder responseBuilder(&replyBuilder, options); for (long long objCount = 0; objCount < request.getBatchSize(); ++objCount) { ClusterQueryResult next; @@ -609,9 +613,11 @@ BSONObj establishMergingMongosCursor(OperationContext* opCtx, responseBuilder.done(clusterCursorId, requestedNss.ns()); - CommandHelpers::appendSimpleCommandStatus(cursorResponse, true); + auto bodyBuilder = replyBuilder.getBodyBuilder(); + CommandHelpers::appendSimpleCommandStatus(bodyBuilder, true); + bodyBuilder.doneFast(); - return cursorResponse.obj(); + return replyBuilder.releaseBody(); } /** diff --git a/src/mongo/s/commands/cluster_count_cmd.cpp b/src/mongo/s/commands/cluster_count_cmd.cpp index f443c297905..6fdd4a2d0f0 100644 --- a/src/mongo/s/commands/cluster_count_cmd.cpp +++ b/src/mongo/s/commands/cluster_count_cmd.cpp @@ -214,7 +214,7 @@ public: Status explain(OperationContext* opCtx, const OpMsgRequest& request, ExplainOptions::Verbosity verbosity, - BSONObjBuilder* out) const override { + rpc::ReplyBuilderInterface* result) const override { std::string dbname = request.getDatabase().toString(); const BSONObj& cmdObj = request.body; const NamespaceString nss(parseNs(dbname, cmdObj)); @@ -282,8 +282,9 @@ public: nsStruct.requestedNss = nss; nsStruct.executionNss = resolvedAggRequest.getNamespaceString(); + auto bodyBuilder = result->getBodyBuilder(); return ClusterAggregate::runAggregate( - opCtx, nsStruct, resolvedAggRequest, resolvedAggCmd, out); + opCtx, nsStruct, resolvedAggRequest, resolvedAggCmd, &bodyBuilder); } long long millisElapsed = timer.millis(); @@ -291,12 +292,13 @@ public: const char* mongosStageName = ClusterExplain::getStageNameForReadOp(shardResponses.size(), cmdObj); + auto bodyBuilder = result->getBodyBuilder(); return ClusterExplain::buildExplainResult( opCtx, ClusterExplain::downconvert(opCtx, shardResponses), mongosStageName, millisElapsed, - out); + &bodyBuilder); } private: diff --git a/src/mongo/s/commands/cluster_distinct_cmd.cpp b/src/mongo/s/commands/cluster_distinct_cmd.cpp index 09ab87aa48b..cffde0ec3b0 100644 --- a/src/mongo/s/commands/cluster_distinct_cmd.cpp +++ b/src/mongo/s/commands/cluster_distinct_cmd.cpp @@ -86,7 +86,7 @@ public: Status explain(OperationContext* opCtx, const OpMsgRequest& opMsgRequest, ExplainOptions::Verbosity verbosity, - BSONObjBuilder* out) const override { + rpc::ReplyBuilderInterface* result) const override { std::string dbname = opMsgRequest.getDatabase().toString(); const BSONObj& cmdObj = opMsgRequest.body; const NamespaceString nss(parseNs(dbname, cmdObj)); @@ -138,8 +138,9 @@ public: nsStruct.requestedNss = nss; nsStruct.executionNss = resolvedAggRequest.getNamespaceString(); + auto bodyBuilder = result->getBodyBuilder(); return ClusterAggregate::runAggregate( - opCtx, nsStruct, resolvedAggRequest, resolvedAggCmd, out); + opCtx, nsStruct, resolvedAggRequest, resolvedAggCmd, &bodyBuilder); } long long millisElapsed = timer.millis(); @@ -147,12 +148,13 @@ public: const char* mongosStageName = ClusterExplain::getStageNameForReadOp(shardResponses.size(), cmdObj); + auto bodyBuilder = result->getBodyBuilder(); return ClusterExplain::buildExplainResult( opCtx, ClusterExplain::downconvert(opCtx, shardResponses), mongosStageName, millisElapsed, - out); + &bodyBuilder); } bool run(OperationContext* opCtx, diff --git a/src/mongo/s/commands/cluster_explain_cmd.cpp b/src/mongo/s/commands/cluster_explain_cmd.cpp index a04c138ddba..0b7f4c1f286 100644 --- a/src/mongo/s/commands/cluster_explain_cmd.cpp +++ b/src/mongo/s/commands/cluster_explain_cmd.cpp @@ -96,13 +96,12 @@ public: private: void run(OperationContext* opCtx, rpc::ReplyBuilderInterface* result) override { - auto bob = result->getBodyBuilder(); - _innerInvocation->explain(opCtx, _verbosity, &bob); + _innerInvocation->explain(opCtx, _verbosity, result); } void explain(OperationContext* opCtx, ExplainOptions::Verbosity verbosity, - BSONObjBuilder* result) override { + rpc::ReplyBuilderInterface* result) override { uasserted(ErrorCodes::IllegalOperation, "Explain cannot explain itself."); } 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 8393517bac7..75347473ce3 100644 --- a/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp +++ b/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp @@ -105,7 +105,7 @@ public: Status explain(OperationContext* opCtx, const OpMsgRequest& request, ExplainOptions::Verbosity verbosity, - BSONObjBuilder* out) const override { + rpc::ReplyBuilderInterface* result) const override { std::string dbName = request.getDatabase().toString(); const BSONObj& cmdObj = request.body; const NamespaceString nss(CommandHelpers::parseNsCollectionRequired(dbName, cmdObj)); @@ -134,25 +134,26 @@ public: // Time how long it takes to run the explain command on the shard. Timer timer; - BSONObjBuilder result; + BSONObjBuilder bob; _runCommand(opCtx, shard->getId(), (chunkMgr ? chunkMgr->getVersion(shard->getId()) : ChunkVersion::UNSHARDED()), nss, explainCmd, - &result); + &bob); const auto millisElapsed = timer.millis(); Strategy::CommandResult cmdResult; cmdResult.shardTargetId = shard->getId(); cmdResult.target = shard->getConnString(); - cmdResult.result = result.obj(); + cmdResult.result = bob.obj(); std::vector<Strategy::CommandResult> shardResults; shardResults.push_back(cmdResult); + auto bodyBuilder = result->getBodyBuilder(); return ClusterExplain::buildExplainResult( - opCtx, shardResults, ClusterExplain::kSingleShard, millisElapsed, out); + opCtx, shardResults, ClusterExplain::kSingleShard, millisElapsed, &bodyBuilder); } bool run(OperationContext* opCtx, diff --git a/src/mongo/s/commands/cluster_find_cmd.cpp b/src/mongo/s/commands/cluster_find_cmd.cpp index f879e3f1b96..a69d1e4a44f 100644 --- a/src/mongo/s/commands/cluster_find_cmd.cpp +++ b/src/mongo/s/commands/cluster_find_cmd.cpp @@ -119,7 +119,7 @@ public: void explain(OperationContext* opCtx, ExplainOptions::Verbosity verbosity, - BSONObjBuilder* result) override { + rpc::ReplyBuilderInterface* result) override { // Parse the command BSON to a QueryRequest. bool isExplain = true; auto qr = @@ -150,15 +150,17 @@ public: const char* mongosStageName = ClusterExplain::getStageNameForReadOp(shardResponses.size(), _request.body); + auto bodyBuilder = result->getBodyBuilder(); uassertStatusOK(ClusterExplain::buildExplainResult( opCtx, ClusterExplain::downconvert(opCtx, shardResponses), mongosStageName, millisElapsed, - result)); + &bodyBuilder)); } catch (const ExceptionFor<ErrorCodes::CommandOnShardedViewNotSupportedOnMongod>& ex) { - result->resetToEmpty(); + auto bodyBuilder = result->getBodyBuilder(); + bodyBuilder.resetToEmpty(); auto aggCmdOnView = uassertStatusOK(qr->asAggregationCommand()); @@ -173,7 +175,7 @@ public: nsStruct.executionNss = std::move(ex->getNamespace()); uassertStatusOK(ClusterAggregate::runAggregate( - opCtx, nsStruct, resolvedAggRequest, resolvedAggCmd, result)); + opCtx, nsStruct, resolvedAggRequest, resolvedAggCmd, &bodyBuilder)); } } @@ -199,9 +201,11 @@ public: std::vector<BSONObj> batch; auto cursorId = ClusterFind::runQuery(opCtx, *cq, ReadPreferenceSetting::get(opCtx), &batch); - auto bodyBuilder = result->getBodyBuilder(); + // Build the response document. - CursorResponseBuilder firstBatch(/*firstBatch*/ true, &bodyBuilder); + CursorResponseBuilder::Options options; + options.isInitialResponse = true; + CursorResponseBuilder firstBatch(result, options); for (const auto& obj : batch) { firstBatch.append(obj); } diff --git a/src/mongo/s/commands/cluster_pipeline_cmd.cpp b/src/mongo/s/commands/cluster_pipeline_cmd.cpp index 897d4b4091b..ead254ff71f 100644 --- a/src/mongo/s/commands/cluster_pipeline_cmd.cpp +++ b/src/mongo/s/commands/cluster_pipeline_cmd.cpp @@ -85,8 +85,9 @@ public: void explain(OperationContext* opCtx, ExplainOptions::Verbosity verbosity, - BSONObjBuilder* out) override { - _runAggCommand(opCtx, _dbName, _request.body, verbosity, out); + rpc::ReplyBuilderInterface* result) override { + auto bodyBuilder = result->getBodyBuilder(); + _runAggCommand(opCtx, _dbName, _request.body, verbosity, &bodyBuilder); } void doCheckAuthorization(OperationContext* opCtx) const override { diff --git a/src/mongo/s/commands/cluster_write_cmd.cpp b/src/mongo/s/commands/cluster_write_cmd.cpp index b4bbc66d893..f4f3f789038 100644 --- a/src/mongo/s/commands/cluster_write_cmd.cpp +++ b/src/mongo/s/commands/cluster_write_cmd.cpp @@ -311,7 +311,7 @@ private: void explain(OperationContext* opCtx, ExplainOptions::Verbosity verbosity, - BSONObjBuilder* result) override { + rpc::ReplyBuilderInterface* result) override { uassert(ErrorCodes::InvalidLength, "explained write batches must be of size 1", _batchedRequest.sizeWriteOps() == 1U); @@ -329,8 +329,9 @@ private: explainCmd, targetingBatchItem, &shardResults)); + auto bodyBuilder = result->getBodyBuilder(); uassertStatusOK(ClusterExplain::buildExplainResult( - opCtx, shardResults, ClusterExplain::kWriteOnShards, timer.millis(), result)); + opCtx, shardResults, ClusterExplain::kWriteOnShards, timer.millis(), &bodyBuilder)); } NamespaceString ns() const override { |