summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline
diff options
context:
space:
mode:
authorJames Wahlin <james@mongodb.com>2018-12-14 09:28:25 -0500
committerJames Wahlin <james@mongodb.com>2018-12-14 12:08:54 -0500
commit7416ce3c3e6e1a84d8ccc111bf1cd3895bada6f3 (patch)
tree0b3245c6e20950572389b8429d87526a158c6e5d /src/mongo/db/pipeline
parent177c1d3d5f9e4f67ef17ef9506aaf0e0c5a14703 (diff)
downloadmongo-7416ce3c3e6e1a84d8ccc111bf1cd3895bada6f3.tar.gz
SERVER-32308 Address ASAN failure due to leaked Pipeline in attachCursorSourceToPipeline
Diffstat (limited to 'src/mongo/db/pipeline')
-rw-r--r--src/mongo/db/pipeline/document_source_check_resume_token_test.cpp6
-rw-r--r--src/mongo/db/pipeline/document_source_graph_lookup_test.cpp6
-rw-r--r--src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp6
-rw-r--r--src/mongo/db/pipeline/document_source_lookup_test.cpp7
-rw-r--r--src/mongo/db/pipeline/mongos_process_interface.cpp14
-rw-r--r--src/mongo/db/pipeline/process_interface_standalone.cpp9
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 {