diff options
6 files changed, 29 insertions, 19 deletions
diff --git a/src/mongo/db/pipeline/document_source_check_resume_token_test.cpp b/src/mongo/db/pipeline/document_source_check_resume_token_test.cpp index a94179c1431..ca7bcde333b 100644 --- a/src/mongo/db/pipeline/document_source_check_resume_token_test.cpp +++ b/src/mongo/db/pipeline/document_source_check_resume_token_test.cpp @@ -480,9 +480,11 @@ public: } std::unique_ptr<Pipeline, PipelineDeleter> attachCursorSourceToPipeline( - const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* pipeline) final { + const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* ownedPipeline) final { + std::unique_ptr<Pipeline, PipelineDeleter> pipeline(ownedPipeline, + PipelineDeleter(expCtx->opCtx)); pipeline->addInitialSource(DocumentSourceMock::create(_mockResults)); - return std::unique_ptr<Pipeline, PipelineDeleter>(pipeline, PipelineDeleter(expCtx->opCtx)); + return pipeline; } private: diff --git a/src/mongo/db/pipeline/document_source_graph_lookup_test.cpp b/src/mongo/db/pipeline/document_source_graph_lookup_test.cpp index 47f37939f73..1841015fa2d 100644 --- a/src/mongo/db/pipeline/document_source_graph_lookup_test.cpp +++ b/src/mongo/db/pipeline/document_source_graph_lookup_test.cpp @@ -81,9 +81,11 @@ public: } std::unique_ptr<Pipeline, PipelineDeleter> attachCursorSourceToPipeline( - const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* pipeline) final { + const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* ownedPipeline) final { + std::unique_ptr<Pipeline, PipelineDeleter> pipeline(ownedPipeline, + PipelineDeleter(expCtx->opCtx)); pipeline->addInitialSource(DocumentSourceMock::create(_results)); - return std::unique_ptr<Pipeline, PipelineDeleter>(pipeline, PipelineDeleter(expCtx->opCtx)); + return pipeline; } private: diff --git a/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp b/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp index 4ba36f69939..fba701166e7 100644 --- a/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp +++ b/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp @@ -107,9 +107,11 @@ public: } std::unique_ptr<Pipeline, PipelineDeleter> attachCursorSourceToPipeline( - const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* pipeline) final { + const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* ownedPipeline) final { + std::unique_ptr<Pipeline, PipelineDeleter> pipeline(ownedPipeline, + PipelineDeleter(expCtx->opCtx)); pipeline->addInitialSource(DocumentSourceMock::create(_mockResults)); - return std::unique_ptr<Pipeline, PipelineDeleter>(pipeline, PipelineDeleter(expCtx->opCtx)); + return pipeline; } boost::optional<Document> lookupSingleDocument( diff --git a/src/mongo/db/pipeline/document_source_lookup_test.cpp b/src/mongo/db/pipeline/document_source_lookup_test.cpp index bacfc5c6cda..027a06c5e15 100644 --- a/src/mongo/db/pipeline/document_source_lookup_test.cpp +++ b/src/mongo/db/pipeline/document_source_lookup_test.cpp @@ -562,7 +562,10 @@ public: } std::unique_ptr<Pipeline, PipelineDeleter> attachCursorSourceToPipeline( - const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* pipeline) final { + const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* ownedPipeline) final { + std::unique_ptr<Pipeline, PipelineDeleter> pipeline(ownedPipeline, + PipelineDeleter(expCtx->opCtx)); + while (_removeLeadingQueryStages && !pipeline->getSources().empty()) { if (pipeline->popFrontWithName("$match") || pipeline->popFrontWithName("$sort") || pipeline->popFrontWithName("$project")) { @@ -572,7 +575,7 @@ public: } pipeline->addInitialSource(DocumentSourceMock::create(_mockResults)); - return std::unique_ptr<Pipeline, PipelineDeleter>(pipeline, PipelineDeleter(expCtx->opCtx)); + return pipeline; } private: diff --git a/src/mongo/db/pipeline/mongos_process_interface.cpp b/src/mongo/db/pipeline/mongos_process_interface.cpp index 6336910029c..05ae84b17a5 100644 --- a/src/mongo/db/pipeline/mongos_process_interface.cpp +++ b/src/mongo/db/pipeline/mongos_process_interface.cpp @@ -528,12 +528,15 @@ std::unique_ptr<Pipeline, PipelineDeleter> MongoSInterface::makePipeline( std::unique_ptr<Pipeline, PipelineDeleter> MongoSInterface::attachCursorSourceToPipeline( - const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* pipeline) { + const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* ownedPipeline) { + std::unique_ptr<Pipeline, PipelineDeleter> pipeline(ownedPipeline, + PipelineDeleter(expCtx->opCtx)); + invariant(pipeline->getSources().empty() || !dynamic_cast<DocumentSourceMergeCursors*>(pipeline->getSources().front().get())); // Generate the command object for the targeted shards. - std::vector<BSONObj> rawStages = [pipeline]() { + std::vector<BSONObj> rawStages = [&pipeline]() { auto serialization = pipeline->serialize(); std::vector<BSONObj> stages; stages.reserve(serialization.size()); @@ -549,12 +552,7 @@ std::unique_ptr<Pipeline, PipelineDeleter> MongoSInterface::attachCursorSourceTo AggregationRequest aggRequest(expCtx->ns, rawStages); LiteParsedPipeline liteParsedPipeline(aggRequest); auto shardDispatchResults = MongoSInterface::dispatchShardPipeline( - expCtx, - expCtx->ns, - aggRequest, - liteParsedPipeline, - std::unique_ptr<Pipeline, PipelineDeleter>(pipeline, PipelineDeleter(expCtx->opCtx)), - expCtx->collation); + expCtx, expCtx->ns, aggRequest, liteParsedPipeline, std::move(pipeline), expCtx->collation); std::vector<ShardId> targetedShards; targetedShards.reserve(shardDispatchResults.remoteCursors.size()); diff --git a/src/mongo/db/pipeline/process_interface_standalone.cpp b/src/mongo/db/pipeline/process_interface_standalone.cpp index 1eb3af3aa97..ab9caa05c93 100644 --- a/src/mongo/db/pipeline/process_interface_standalone.cpp +++ b/src/mongo/db/pipeline/process_interface_standalone.cpp @@ -292,7 +292,10 @@ std::unique_ptr<Pipeline, PipelineDeleter> MongoInterfaceStandalone::makePipelin } unique_ptr<Pipeline, PipelineDeleter> MongoInterfaceStandalone::attachCursorSourceToPipeline( - const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* pipeline) { + const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* ownedPipeline) { + std::unique_ptr<Pipeline, PipelineDeleter> pipeline(ownedPipeline, + PipelineDeleter(expCtx->opCtx)); + invariant(pipeline->getSources().empty() || !dynamic_cast<DocumentSourceCursor*>(pipeline->getSources().front().get())); @@ -321,13 +324,13 @@ unique_ptr<Pipeline, PipelineDeleter> MongoInterfaceStandalone::attachCursorSour str::stream() << "from collection (" << expCtx->ns.ns() << ") cannot be sharded", !css->getMetadataForOperation(expCtx->opCtx)->isSharded()); - PipelineD::prepareCursorSource(autoColl->getCollection(), expCtx->ns, nullptr, pipeline); + PipelineD::prepareCursorSource(autoColl->getCollection(), expCtx->ns, nullptr, pipeline.get()); // Optimize again, since there may be additional optimizations that can be done after adding // the initial cursor stage. pipeline->optimizePipeline(); - return std::unique_ptr<Pipeline, PipelineDeleter>(pipeline, PipelineDeleter(expCtx->opCtx)); + return pipeline; } std::string MongoInterfaceStandalone::getShardName(OperationContext* opCtx) const { |