diff options
author | James Wahlin <james@mongodb.com> | 2018-12-14 09:28:25 -0500 |
---|---|---|
committer | James Wahlin <james@mongodb.com> | 2018-12-14 12:08:54 -0500 |
commit | 7416ce3c3e6e1a84d8ccc111bf1cd3895bada6f3 (patch) | |
tree | 0b3245c6e20950572389b8429d87526a158c6e5d /src/mongo/db/pipeline | |
parent | 177c1d3d5f9e4f67ef17ef9506aaf0e0c5a14703 (diff) | |
download | mongo-7416ce3c3e6e1a84d8ccc111bf1cd3895bada6f3.tar.gz |
SERVER-32308 Address ASAN failure due to leaked Pipeline in attachCursorSourceToPipeline
Diffstat (limited to 'src/mongo/db/pipeline')
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 { |