diff options
author | Rui Liu <rui.liu@mongodb.com> | 2022-06-22 09:52:36 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-06-22 10:42:32 +0000 |
commit | 2c2d85e73d0620d779544ce67218db171c154e8b (patch) | |
tree | c6172fde4fb0500c2254ceaf9cd92ac14c8b128d /src/mongo/db/exec/sbe/stages | |
parent | ad2b9ae23ad19f871f2033dc338c96ad9aa8d161 (diff) | |
download | mongo-2c2d85e73d0620d779544ce67218db171c154e8b.tar.gz |
SERVER-64432 Integrate SBE plan cache for $lookup
Diffstat (limited to 'src/mongo/db/exec/sbe/stages')
48 files changed, 271 insertions, 138 deletions
diff --git a/src/mongo/db/exec/sbe/stages/branch.cpp b/src/mongo/db/exec/sbe/stages/branch.cpp index bec12b12ee2..adbbd533273 100644 --- a/src/mongo/db/exec/sbe/stages/branch.cpp +++ b/src/mongo/db/exec/sbe/stages/branch.cpp @@ -42,8 +42,9 @@ BranchStage::BranchStage(std::unique_ptr<PlanStage> inputThen, value::SlotVector inputThenVals, value::SlotVector inputElseVals, value::SlotVector outputVals, - PlanNodeId planNodeId) - : PlanStage("branch"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("branch"_sd, planNodeId, participateInTrialRunTracking), _filter(std::move(filter)), _inputThenVals(std::move(inputThenVals)), _inputElseVals(std::move(inputElseVals)), @@ -61,7 +62,8 @@ std::unique_ptr<PlanStage> BranchStage::clone() const { _inputThenVals, _inputElseVals, _outputVals, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void BranchStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/branch.h b/src/mongo/db/exec/sbe/stages/branch.h index 67b5af8a517..df813e762a4 100644 --- a/src/mongo/db/exec/sbe/stages/branch.h +++ b/src/mongo/db/exec/sbe/stages/branch.h @@ -52,7 +52,8 @@ public: value::SlotVector inputThenVals, value::SlotVector inputElseVals, value::SlotVector outputVals, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/bson_scan.cpp b/src/mongo/db/exec/sbe/stages/bson_scan.cpp index c340071ba0e..3a4c3b50512 100644 --- a/src/mongo/db/exec/sbe/stages/bson_scan.cpp +++ b/src/mongo/db/exec/sbe/stages/bson_scan.cpp @@ -42,8 +42,9 @@ BSONScanStage::BSONScanStage(const char* bsonBegin, boost::optional<value::SlotId> recordSlot, std::vector<std::string> fields, value::SlotVector vars, - PlanNodeId planNodeId) - : PlanStage("bsonscan"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("bsonscan"_sd, planNodeId, participateInTrialRunTracking), _bsonBegin(bsonBegin), _bsonEnd(bsonEnd), _recordSlot(recordSlot), @@ -52,8 +53,13 @@ BSONScanStage::BSONScanStage(const char* bsonBegin, _bsonCurrent(bsonBegin) {} std::unique_ptr<PlanStage> BSONScanStage::clone() const { - return std::make_unique<BSONScanStage>( - _bsonBegin, _bsonEnd, _recordSlot, _fields, _vars, _commonStats.nodeId); + return std::make_unique<BSONScanStage>(_bsonBegin, + _bsonEnd, + _recordSlot, + _fields, + _vars, + _commonStats.nodeId, + _participateInTrialRunTracking); } void BSONScanStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/bson_scan.h b/src/mongo/db/exec/sbe/stages/bson_scan.h index 7804bcd4149..79238f695a2 100644 --- a/src/mongo/db/exec/sbe/stages/bson_scan.h +++ b/src/mongo/db/exec/sbe/stages/bson_scan.h @@ -51,7 +51,8 @@ public: boost::optional<value::SlotId> recordSlot, std::vector<std::string> fields, value::SlotVector vars, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/check_bounds.cpp b/src/mongo/db/exec/sbe/stages/check_bounds.cpp index 483e9f50260..bc62b089005 100644 --- a/src/mongo/db/exec/sbe/stages/check_bounds.cpp +++ b/src/mongo/db/exec/sbe/stages/check_bounds.cpp @@ -39,8 +39,9 @@ CheckBoundsStage::CheckBoundsStage(std::unique_ptr<PlanStage> input, value::SlotId inKeySlot, value::SlotId inRecordIdSlot, value::SlotId outSlot, - PlanNodeId planNodeId) - : PlanStage{"chkbounds"_sd, planNodeId}, + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage{"chkbounds"_sd, planNodeId, participateInTrialRunTracking}, _params{std::move(params)}, _inKeySlot{inKeySlot}, _inRecordIdSlot{inRecordIdSlot}, @@ -49,8 +50,13 @@ CheckBoundsStage::CheckBoundsStage(std::unique_ptr<PlanStage> input, } std::unique_ptr<PlanStage> CheckBoundsStage::clone() const { - return std::make_unique<CheckBoundsStage>( - _children[0]->clone(), _params, _inKeySlot, _inRecordIdSlot, _outSlot, _commonStats.nodeId); + return std::make_unique<CheckBoundsStage>(_children[0]->clone(), + _params, + _inKeySlot, + _inRecordIdSlot, + _outSlot, + _commonStats.nodeId, + _participateInTrialRunTracking); } void CheckBoundsStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/check_bounds.h b/src/mongo/db/exec/sbe/stages/check_bounds.h index 29f52faa523..dbdf87938f7 100644 --- a/src/mongo/db/exec/sbe/stages/check_bounds.h +++ b/src/mongo/db/exec/sbe/stages/check_bounds.h @@ -76,7 +76,8 @@ public: value::SlotId inKeySlot, value::SlotId inRecordIdSlot, value::SlotId outSlot, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/co_scan.cpp b/src/mongo/db/exec/sbe/stages/co_scan.cpp index 73e89a5e87e..9666d03cf01 100644 --- a/src/mongo/db/exec/sbe/stages/co_scan.cpp +++ b/src/mongo/db/exec/sbe/stages/co_scan.cpp @@ -34,11 +34,14 @@ #include "mongo/db/exec/sbe/expressions/expression.h" namespace mongo::sbe { -CoScanStage::CoScanStage(PlanNodeId planNodeId, PlanYieldPolicy* yieldPolicy) - : PlanStage("coscan"_sd, yieldPolicy, planNodeId) {} +CoScanStage::CoScanStage(PlanNodeId planNodeId, + PlanYieldPolicy* yieldPolicy, + bool participateInTrialRunTracking) + : PlanStage("coscan"_sd, yieldPolicy, planNodeId, participateInTrialRunTracking) {} std::unique_ptr<PlanStage> CoScanStage::clone() const { - return std::make_unique<CoScanStage>(_commonStats.nodeId); + return std::make_unique<CoScanStage>( + _commonStats.nodeId, _yieldPolicy, _participateInTrialRunTracking); } void CoScanStage::prepare(CompileCtx& ctx) {} value::SlotAccessor* CoScanStage::getAccessor(CompileCtx& ctx, value::SlotId slot) { diff --git a/src/mongo/db/exec/sbe/stages/co_scan.h b/src/mongo/db/exec/sbe/stages/co_scan.h index 4625b636a14..1f8c8d5404d 100644 --- a/src/mongo/db/exec/sbe/stages/co_scan.h +++ b/src/mongo/db/exec/sbe/stages/co_scan.h @@ -42,7 +42,9 @@ namespace mongo::sbe { */ class CoScanStage final : public PlanStage { public: - explicit CoScanStage(PlanNodeId, PlanYieldPolicy* yieldPolicy = nullptr); + explicit CoScanStage(PlanNodeId, + PlanYieldPolicy* yieldPolicy = nullptr, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/column_scan.cpp b/src/mongo/db/exec/sbe/stages/column_scan.cpp index 8058307a916..24f769fa2c7 100644 --- a/src/mongo/db/exec/sbe/stages/column_scan.cpp +++ b/src/mongo/db/exec/sbe/stages/column_scan.cpp @@ -59,8 +59,9 @@ ColumnScanStage::ColumnScanStage(UUID collectionUuid, std::vector<std::unique_ptr<EExpression>> pathExprs, value::SlotId rowStoreSlot, PlanYieldPolicy* yieldPolicy, - PlanNodeId nodeId) - : PlanStage("columnscan"_sd, yieldPolicy, nodeId), + PlanNodeId nodeId, + bool participateInTrialRunTracking) + : PlanStage("columnscan"_sd, yieldPolicy, nodeId, participateInTrialRunTracking), _collUuid(collectionUuid), _columnIndexName(columnIndexName), _fieldSlots(std::move(fieldSlots)), @@ -89,7 +90,8 @@ std::unique_ptr<PlanStage> ColumnScanStage::clone() const { std::move(pathExprs), _rowStoreSlot, _yieldPolicy, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void ColumnScanStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/column_scan.h b/src/mongo/db/exec/sbe/stages/column_scan.h index d00d4641171..1efeef25bca 100644 --- a/src/mongo/db/exec/sbe/stages/column_scan.h +++ b/src/mongo/db/exec/sbe/stages/column_scan.h @@ -53,7 +53,8 @@ public: std::vector<std::unique_ptr<EExpression>> pathExprs, value::SlotId internalSlot, PlanYieldPolicy* yieldPolicy, - PlanNodeId nodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/exchange.cpp b/src/mongo/db/exec/sbe/stages/exchange.cpp index 8cd7b065559..fdbb6531913 100644 --- a/src/mongo/db/exec/sbe/stages/exchange.cpp +++ b/src/mongo/db/exec/sbe/stages/exchange.cpp @@ -171,8 +171,9 @@ ExchangeConsumer::ExchangeConsumer(std::unique_ptr<PlanStage> input, ExchangePolicy policy, std::unique_ptr<EExpression> partition, std::unique_ptr<EExpression> orderLess, - PlanNodeId planNodeId) - : PlanStage("exchange"_sd, planNodeId) { + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("exchange"_sd, planNodeId, participateInTrialRunTracking) { _children.emplace_back(std::move(input)); _state = std::make_shared<ExchangeState>( numOfProducers, std::move(fields), policy, std::move(partition), std::move(orderLess)); @@ -186,13 +187,16 @@ ExchangeConsumer::ExchangeConsumer(std::unique_ptr<PlanStage> input, uassert(5922202, "partition expression must not be present", !_state->partitionExpr()); } } -ExchangeConsumer::ExchangeConsumer(std::shared_ptr<ExchangeState> state, PlanNodeId planNodeId) - : PlanStage("exchange"_sd, planNodeId), _state(state) { +ExchangeConsumer::ExchangeConsumer(std::shared_ptr<ExchangeState> state, + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("exchange"_sd, planNodeId, participateInTrialRunTracking), _state(state) { _tid = _state->addConsumer(this); _orderPreserving = _state->isOrderPreserving(); } std::unique_ptr<PlanStage> ExchangeConsumer::clone() const { - return std::make_unique<ExchangeConsumer>(_state, _commonStats.nodeId); + return std::make_unique<ExchangeConsumer>( + _state, _commonStats.nodeId, _participateInTrialRunTracking); } void ExchangeConsumer::prepare(CompileCtx& ctx) { for (size_t idx = 0; idx < _state->fields().size(); ++idx) { @@ -486,8 +490,9 @@ void ExchangeProducer::closePipes() { ExchangeProducer::ExchangeProducer(std::unique_ptr<PlanStage> input, std::shared_ptr<ExchangeState> state, - PlanNodeId planNodeId) - : PlanStage("exchangep"_sd, planNodeId), _state(state) { + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("exchangep"_sd, planNodeId, participateInTrialRunTracking), _state(state) { _children.emplace_back(std::move(input)); _tid = _state->addProducer(this); diff --git a/src/mongo/db/exec/sbe/stages/exchange.h b/src/mongo/db/exec/sbe/stages/exchange.h index b94b4968f66..15928cd50fb 100644 --- a/src/mongo/db/exec/sbe/stages/exchange.h +++ b/src/mongo/db/exec/sbe/stages/exchange.h @@ -261,9 +261,12 @@ public: ExchangePolicy policy, std::unique_ptr<EExpression> partition, std::unique_ptr<EExpression> orderLess, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); - ExchangeConsumer(std::shared_ptr<ExchangeState> state, PlanNodeId planNodeId); + ExchangeConsumer(std::shared_ptr<ExchangeState> state, + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; @@ -311,7 +314,8 @@ class ExchangeProducer final : public PlanStage { public: ExchangeProducer(std::unique_ptr<PlanStage> input, std::shared_ptr<ExchangeState> state, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); static void start(OperationContext* opCtx, CompileCtx& ctx, diff --git a/src/mongo/db/exec/sbe/stages/filter.h b/src/mongo/db/exec/sbe/stages/filter.h index 2120be1c062..059dd1c7ab4 100644 --- a/src/mongo/db/exec/sbe/stages/filter.h +++ b/src/mongo/db/exec/sbe/stages/filter.h @@ -58,16 +58,21 @@ class FilterStage final : public PlanStage { public: FilterStage(std::unique_ptr<PlanStage> input, std::unique_ptr<EExpression> filter, - PlanNodeId planNodeId) - : PlanStage(IsConst ? "cfilter"_sd : (IsEof ? "efilter" : "filter"_sd), planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true) + : PlanStage(IsConst ? "cfilter"_sd : (IsEof ? "efilter" : "filter"_sd), + planNodeId, + participateInTrialRunTracking), _filter(std::move(filter)) { static_assert(!IsEof || !IsConst); _children.emplace_back(std::move(input)); } std::unique_ptr<PlanStage> clone() const final { - return std::make_unique<FilterStage<IsConst, IsEof>>( - _children[0]->clone(), _filter->clone(), _commonStats.nodeId); + return std::make_unique<FilterStage<IsConst, IsEof>>(_children[0]->clone(), + _filter->clone(), + _commonStats.nodeId, + _participateInTrialRunTracking); } void prepare(CompileCtx& ctx) final { diff --git a/src/mongo/db/exec/sbe/stages/hash_agg.cpp b/src/mongo/db/exec/sbe/stages/hash_agg.cpp index 1dcbc500ec8..f930d4b5e95 100644 --- a/src/mongo/db/exec/sbe/stages/hash_agg.cpp +++ b/src/mongo/db/exec/sbe/stages/hash_agg.cpp @@ -47,8 +47,9 @@ HashAggStage::HashAggStage(std::unique_ptr<PlanStage> input, bool optimizedClose, boost::optional<value::SlotId> collatorSlot, bool allowDiskUse, - PlanNodeId planNodeId) - : PlanStage("group"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("group"_sd, planNodeId, participateInTrialRunTracking), _gbs(std::move(gbs)), _aggs(std::move(aggs)), _collatorSlot(collatorSlot), @@ -74,7 +75,8 @@ std::unique_ptr<PlanStage> HashAggStage::clone() const { _optimizedClose, _collatorSlot, _allowDiskUse, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void HashAggStage::doSaveState(bool relinquishCursor) { diff --git a/src/mongo/db/exec/sbe/stages/hash_agg.h b/src/mongo/db/exec/sbe/stages/hash_agg.h index 19fbca9d1c7..d200c4b9c3d 100644 --- a/src/mongo/db/exec/sbe/stages/hash_agg.h +++ b/src/mongo/db/exec/sbe/stages/hash_agg.h @@ -75,7 +75,8 @@ public: bool optimizedClose, boost::optional<value::SlotId> collatorSlot, bool allowDiskUse, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/hash_join.cpp b/src/mongo/db/exec/sbe/stages/hash_join.cpp index 86675029c0e..bad53262acb 100644 --- a/src/mongo/db/exec/sbe/stages/hash_join.cpp +++ b/src/mongo/db/exec/sbe/stages/hash_join.cpp @@ -44,8 +44,9 @@ HashJoinStage::HashJoinStage(std::unique_ptr<PlanStage> outer, value::SlotVector innerCond, value::SlotVector innerProjects, boost::optional<value::SlotId> collatorSlot, - PlanNodeId planNodeId) - : PlanStage("hj"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("hj"_sd, planNodeId, participateInTrialRunTracking), _outerCond(std::move(outerCond)), _outerProjects(std::move(outerProjects)), _innerCond(std::move(innerCond)), @@ -68,7 +69,8 @@ std::unique_ptr<PlanStage> HashJoinStage::clone() const { _innerCond, _innerProjects, _collatorSlot, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void HashJoinStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/hash_join.h b/src/mongo/db/exec/sbe/stages/hash_join.h index ed4781116d9..a3997074db0 100644 --- a/src/mongo/db/exec/sbe/stages/hash_join.h +++ b/src/mongo/db/exec/sbe/stages/hash_join.h @@ -66,7 +66,8 @@ public: value::SlotVector innerCond, value::SlotVector innerProjects, boost::optional<value::SlotId> collatorSlot, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/hash_lookup.cpp b/src/mongo/db/exec/sbe/stages/hash_lookup.cpp index a65f2f8bd89..16e61d68630 100644 --- a/src/mongo/db/exec/sbe/stages/hash_lookup.cpp +++ b/src/mongo/db/exec/sbe/stages/hash_lookup.cpp @@ -47,8 +47,9 @@ HashLookupStage::HashLookupStage(std::unique_ptr<PlanStage> outer, value::SlotVector innerProjects, value::SlotMap<std::unique_ptr<EExpression>> innerAggs, boost::optional<value::SlotId> collatorSlot, - PlanNodeId planNodeId) - : PlanStage("hash_lookup"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("hash_lookup"_sd, planNodeId, participateInTrialRunTracking), _outerCond(outerCond), _innerCond(innerCond), _innerProjects(innerProjects), @@ -72,7 +73,8 @@ std::unique_ptr<PlanStage> HashLookupStage::clone() const { _innerProjects, std::move(innerAggs), _collatorSlot, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void HashLookupStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/hash_lookup.h b/src/mongo/db/exec/sbe/stages/hash_lookup.h index 2e3f0b34816..611c5603606 100644 --- a/src/mongo/db/exec/sbe/stages/hash_lookup.h +++ b/src/mongo/db/exec/sbe/stages/hash_lookup.h @@ -86,7 +86,8 @@ public: value::SlotVector innerProjects, value::SlotMap<std::unique_ptr<EExpression>> innerAggs, boost::optional<value::SlotId> collatorSlot, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/ix_scan.cpp b/src/mongo/db/exec/sbe/stages/ix_scan.cpp index bfad6d9a2ae..2029ac4d356 100644 --- a/src/mongo/db/exec/sbe/stages/ix_scan.cpp +++ b/src/mongo/db/exec/sbe/stages/ix_scan.cpp @@ -50,8 +50,12 @@ IndexScanStage::IndexScanStage(UUID collUuid, boost::optional<value::SlotId> seekKeySlotLow, boost::optional<value::SlotId> seekKeySlotHigh, PlanYieldPolicy* yieldPolicy, - PlanNodeId nodeId) - : PlanStage(seekKeySlotLow ? "ixseek"_sd : "ixscan"_sd, yieldPolicy, nodeId), + PlanNodeId nodeId, + bool participateInTrialRunTracking) + : PlanStage(seekKeySlotLow ? "ixseek"_sd : "ixscan"_sd, + yieldPolicy, + nodeId, + participateInTrialRunTracking), _collUuid(collUuid), _indexName(indexName), _forward(forward), @@ -81,7 +85,8 @@ std::unique_ptr<PlanStage> IndexScanStage::clone() const { _seekKeySlotLow, _seekKeySlotHigh, _yieldPolicy, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void IndexScanStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/ix_scan.h b/src/mongo/db/exec/sbe/stages/ix_scan.h index ce00ef17128..da61cb544ec 100644 --- a/src/mongo/db/exec/sbe/stages/ix_scan.h +++ b/src/mongo/db/exec/sbe/stages/ix_scan.h @@ -83,7 +83,8 @@ public: boost::optional<value::SlotId> seekKeySlotLow, boost::optional<value::SlotId> seekKeySlotHigh, PlanYieldPolicy* yieldPolicy, - PlanNodeId nodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/limit_skip.cpp b/src/mongo/db/exec/sbe/stages/limit_skip.cpp index 359355582ac..8343f56ca96 100644 --- a/src/mongo/db/exec/sbe/stages/limit_skip.cpp +++ b/src/mongo/db/exec/sbe/stages/limit_skip.cpp @@ -37,8 +37,9 @@ namespace mongo::sbe { LimitSkipStage::LimitSkipStage(std::unique_ptr<PlanStage> input, boost::optional<long long> limit, boost::optional<long long> skip, - PlanNodeId planNodeId) - : PlanStage(!skip ? "limit"_sd : "limitskip"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage(!skip ? "limit"_sd : "limitskip"_sd, planNodeId, participateInTrialRunTracking), _limit(limit), _skip(skip), _current(0), @@ -51,7 +52,7 @@ LimitSkipStage::LimitSkipStage(std::unique_ptr<PlanStage> input, std::unique_ptr<PlanStage> LimitSkipStage::clone() const { return std::make_unique<LimitSkipStage>( - _children[0]->clone(), _limit, _skip, _commonStats.nodeId); + _children[0]->clone(), _limit, _skip, _commonStats.nodeId, _participateInTrialRunTracking); } void LimitSkipStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/limit_skip.h b/src/mongo/db/exec/sbe/stages/limit_skip.h index f0f62b34239..7fc366a2174 100644 --- a/src/mongo/db/exec/sbe/stages/limit_skip.h +++ b/src/mongo/db/exec/sbe/stages/limit_skip.h @@ -50,7 +50,8 @@ public: LimitSkipStage(std::unique_ptr<PlanStage> input, boost::optional<long long> limit, boost::optional<long long> skip, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/loop_join.cpp b/src/mongo/db/exec/sbe/stages/loop_join.cpp index 6c49f2e700a..3df5e179a09 100644 --- a/src/mongo/db/exec/sbe/stages/loop_join.cpp +++ b/src/mongo/db/exec/sbe/stages/loop_join.cpp @@ -41,7 +41,8 @@ LoopJoinStage::LoopJoinStage(std::unique_ptr<PlanStage> outer, value::SlotVector outerProjects, value::SlotVector outerCorrelated, std::unique_ptr<EExpression> predicate, - PlanNodeId nodeId) + PlanNodeId nodeId, + bool participateInTrialRunTracking) : LoopJoinStage(std::move(outer), std::move(inner), std::move(outerProjects), @@ -49,7 +50,8 @@ LoopJoinStage::LoopJoinStage(std::unique_ptr<PlanStage> outer, value::SlotVector{}, std::move(predicate), JoinType::Inner, - nodeId) {} + nodeId, + participateInTrialRunTracking) {} LoopJoinStage::LoopJoinStage(std::unique_ptr<PlanStage> outer, std::unique_ptr<PlanStage> inner, @@ -58,8 +60,9 @@ LoopJoinStage::LoopJoinStage(std::unique_ptr<PlanStage> outer, value::SlotVector innerProjects, std::unique_ptr<EExpression> predicate, JoinType joinType, - PlanNodeId nodeId) - : PlanStage("nlj"_sd, nodeId), + PlanNodeId nodeId, + bool participateInTrialRunTracking) + : PlanStage("nlj"_sd, nodeId, participateInTrialRunTracking), _outerProjects(std::move(outerProjects)), _outerCorrelated(std::move(outerCorrelated)), _innerProjects(std::move(innerProjects)), @@ -80,7 +83,8 @@ std::unique_ptr<PlanStage> LoopJoinStage::clone() const { _innerProjects, _predicate ? _predicate->clone() : nullptr, _joinType, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void LoopJoinStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/loop_join.h b/src/mongo/db/exec/sbe/stages/loop_join.h index 076655bca4c..c69010071fd 100644 --- a/src/mongo/db/exec/sbe/stages/loop_join.h +++ b/src/mongo/db/exec/sbe/stages/loop_join.h @@ -63,7 +63,8 @@ public: value::SlotVector outerProjects, value::SlotVector outerCorrelated, std::unique_ptr<EExpression> predicate, - PlanNodeId nodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); LoopJoinStage(std::unique_ptr<PlanStage> outer, std::unique_ptr<PlanStage> inner, @@ -72,7 +73,8 @@ public: value::SlotVector innerProjects, std::unique_ptr<EExpression> predicate, JoinType joinType, - PlanNodeId nodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/makeobj.cpp b/src/mongo/db/exec/sbe/stages/makeobj.cpp index cefd83d0035..0c84fde3083 100644 --- a/src/mongo/db/exec/sbe/stages/makeobj.cpp +++ b/src/mongo/db/exec/sbe/stages/makeobj.cpp @@ -46,8 +46,11 @@ MakeObjStageBase<O>::MakeObjStageBase(std::unique_ptr<PlanStage> input, value::SlotVector projectVars, bool forceNewObject, bool returnOldObject, - PlanNodeId planNodeId) - : PlanStage(O == MakeObjOutputType::object ? "mkobj"_sd : "mkbson"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage(O == MakeObjOutputType::object ? "mkobj"_sd : "mkbson"_sd, + planNodeId, + participateInTrialRunTracking), _objSlot(objSlot), _rootSlot(rootSlot), _fieldBehavior(fieldBehavior), @@ -95,7 +98,8 @@ std::unique_ptr<PlanStage> MakeObjStageBase<O>::clone() const { _projectVars, _forceNewObject, _returnOldObject, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } template <MakeObjOutputType O> diff --git a/src/mongo/db/exec/sbe/stages/makeobj.h b/src/mongo/db/exec/sbe/stages/makeobj.h index 1f2dc183d97..3034470b95a 100644 --- a/src/mongo/db/exec/sbe/stages/makeobj.h +++ b/src/mongo/db/exec/sbe/stages/makeobj.h @@ -87,7 +87,8 @@ public: value::SlotVector projectVars, bool forceNewObject, bool returnOldObject, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); /** * A convenience constructor that takes a set instead of a vector for 'fields' and diff --git a/src/mongo/db/exec/sbe/stages/merge_join.cpp b/src/mongo/db/exec/sbe/stages/merge_join.cpp index 170227e0575..d6f03af7502 100644 --- a/src/mongo/db/exec/sbe/stages/merge_join.cpp +++ b/src/mongo/db/exec/sbe/stages/merge_join.cpp @@ -76,8 +76,9 @@ MergeJoinStage::MergeJoinStage(std::unique_ptr<PlanStage> outer, value::SlotVector innerKeys, value::SlotVector innerProjects, std::vector<value::SortDirection> sortDirs, - PlanNodeId planNodeId) - : PlanStage("mj"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("mj"_sd, planNodeId, participateInTrialRunTracking), _outerKeys(std::move(outerKeys)), _outerProjects(std::move(outerProjects)), _innerKeys(std::move(innerKeys)), @@ -104,7 +105,8 @@ std::unique_ptr<PlanStage> MergeJoinStage::clone() const { _innerKeys, _innerProjects, _dirs, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void MergeJoinStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/merge_join.h b/src/mongo/db/exec/sbe/stages/merge_join.h index b0f61cd677c..ff94784ac0d 100644 --- a/src/mongo/db/exec/sbe/stages/merge_join.h +++ b/src/mongo/db/exec/sbe/stages/merge_join.h @@ -62,7 +62,8 @@ public: value::SlotVector innerKeys, value::SlotVector innerProjects, std::vector<value::SortDirection> sortDirs, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/project.cpp b/src/mongo/db/exec/sbe/stages/project.cpp index 736110bc83a..c534c5c8cdc 100644 --- a/src/mongo/db/exec/sbe/stages/project.cpp +++ b/src/mongo/db/exec/sbe/stages/project.cpp @@ -37,8 +37,10 @@ namespace mongo { namespace sbe { ProjectStage::ProjectStage(std::unique_ptr<PlanStage> input, value::SlotMap<std::unique_ptr<EExpression>> projects, - PlanNodeId nodeId) - : PlanStage("project"_sd, nodeId), _projects(std::move(projects)) { + PlanNodeId nodeId, + bool participateInTrialRunTracking) + : PlanStage("project"_sd, nodeId, participateInTrialRunTracking), + _projects(std::move(projects)) { _children.emplace_back(std::move(input)); } @@ -47,8 +49,10 @@ std::unique_ptr<PlanStage> ProjectStage::clone() const { for (auto& [k, v] : _projects) { projects.emplace(k, v->clone()); } - return std::make_unique<ProjectStage>( - _children[0]->clone(), std::move(projects), _commonStats.nodeId); + return std::make_unique<ProjectStage>(_children[0]->clone(), + std::move(projects), + _commonStats.nodeId, + _participateInTrialRunTracking); } void ProjectStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/project.h b/src/mongo/db/exec/sbe/stages/project.h index 1754dd7d2a9..bf4e169c8c9 100644 --- a/src/mongo/db/exec/sbe/stages/project.h +++ b/src/mongo/db/exec/sbe/stages/project.h @@ -47,7 +47,8 @@ class ProjectStage final : public PlanStage { public: ProjectStage(std::unique_ptr<PlanStage> input, value::SlotMap<std::unique_ptr<EExpression>> projects, - PlanNodeId nodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/scan.cpp b/src/mongo/db/exec/sbe/stages/scan.cpp index 678d3f84ef9..fbbc3a9ae0d 100644 --- a/src/mongo/db/exec/sbe/stages/scan.cpp +++ b/src/mongo/db/exec/sbe/stages/scan.cpp @@ -56,8 +56,10 @@ ScanStage::ScanStage(UUID collectionUuid, PlanYieldPolicy* yieldPolicy, PlanNodeId nodeId, ScanCallbacks scanCallbacks, - bool useRandomCursor) - : PlanStage(seekKeySlot ? "seek"_sd : "scan"_sd, yieldPolicy, nodeId), + bool useRandomCursor, + bool participateInTrialRunTracking) + : PlanStage( + seekKeySlot ? "seek"_sd : "scan"_sd, yieldPolicy, nodeId, participateInTrialRunTracking), _collUuid(collectionUuid), _recordSlot(recordSlot), _recordIdSlot(recordIdSlot), @@ -98,7 +100,9 @@ std::unique_ptr<PlanStage> ScanStage::clone() const { _forward, _yieldPolicy, _commonStats.nodeId, - _scanCallbacks); + _scanCallbacks, + _useRandomCursor, + _participateInTrialRunTracking); } void ScanStage::prepare(CompileCtx& ctx) { @@ -592,8 +596,9 @@ ParallelScanStage::ParallelScanStage(UUID collectionUuid, value::SlotVector vars, PlanYieldPolicy* yieldPolicy, PlanNodeId nodeId, - ScanCallbacks callbacks) - : PlanStage("pscan"_sd, yieldPolicy, nodeId), + ScanCallbacks callbacks, + bool participateInTrialRunTracking) + : PlanStage("pscan"_sd, yieldPolicy, nodeId, participateInTrialRunTracking), _collUuid(collectionUuid), _recordSlot(recordSlot), _recordIdSlot(recordIdSlot), @@ -621,8 +626,9 @@ ParallelScanStage::ParallelScanStage(const std::shared_ptr<ParallelState>& state value::SlotVector vars, PlanYieldPolicy* yieldPolicy, PlanNodeId nodeId, - ScanCallbacks callbacks) - : PlanStage("pscan"_sd, yieldPolicy, nodeId), + ScanCallbacks callbacks, + bool participateInTrialRunTracking) + : PlanStage("pscan"_sd, yieldPolicy, nodeId, participateInTrialRunTracking), _collUuid(collectionUuid), _recordSlot(recordSlot), _recordIdSlot(recordIdSlot), @@ -650,7 +656,8 @@ std::unique_ptr<PlanStage> ParallelScanStage::clone() const { _vars, _yieldPolicy, _commonStats.nodeId, - _scanCallbacks); + _scanCallbacks, + _participateInTrialRunTracking); } void ParallelScanStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/scan.h b/src/mongo/db/exec/sbe/stages/scan.h index 37462ac5e14..ed138f6302e 100644 --- a/src/mongo/db/exec/sbe/stages/scan.h +++ b/src/mongo/db/exec/sbe/stages/scan.h @@ -108,7 +108,8 @@ public: PlanYieldPolicy* yieldPolicy, PlanNodeId nodeId, ScanCallbacks scanCallbacks, - bool useRandomCursor = false); + bool useRandomCursor = false, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; @@ -227,7 +228,8 @@ public: value::SlotVector vars, PlanYieldPolicy* yieldPolicy, PlanNodeId nodeId, - ScanCallbacks callbacks); + ScanCallbacks callbacks, + bool participateInTrialRunTracking = true); ParallelScanStage(const std::shared_ptr<ParallelState>& state, const UUID& collectionUuid, @@ -241,7 +243,8 @@ public: value::SlotVector vars, PlanYieldPolicy* yieldPolicy, PlanNodeId nodeId, - ScanCallbacks callbacks); + ScanCallbacks callbacks, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/sort.cpp b/src/mongo/db/exec/sbe/stages/sort.cpp index 5acf73afe8d..0968b0bea68 100644 --- a/src/mongo/db/exec/sbe/stages/sort.cpp +++ b/src/mongo/db/exec/sbe/stages/sort.cpp @@ -55,8 +55,9 @@ SortStage::SortStage(std::unique_ptr<PlanStage> input, size_t limit, size_t memoryLimit, bool allowDiskUse, - PlanNodeId planNodeId) - : PlanStage("sort"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("sort"_sd, planNodeId, participateInTrialRunTracking), _obs(std::move(obs)), _dirs(std::move(dirs)), _vals(std::move(vals)), @@ -80,7 +81,8 @@ std::unique_ptr<PlanStage> SortStage::clone() const { _specificStats.limit, _specificStats.maxMemoryUsageBytes, _allowDiskUse, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void SortStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/sort.h b/src/mongo/db/exec/sbe/stages/sort.h index 2bfc9e1d9fb..dda9716b75b 100644 --- a/src/mongo/db/exec/sbe/stages/sort.h +++ b/src/mongo/db/exec/sbe/stages/sort.h @@ -70,7 +70,8 @@ public: size_t limit, size_t memoryLimit, bool allowDiskUse, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); ~SortStage(); diff --git a/src/mongo/db/exec/sbe/stages/sorted_merge.cpp b/src/mongo/db/exec/sbe/stages/sorted_merge.cpp index f0a648f38ad..39cee407a00 100644 --- a/src/mongo/db/exec/sbe/stages/sorted_merge.cpp +++ b/src/mongo/db/exec/sbe/stages/sorted_merge.cpp @@ -41,8 +41,9 @@ SortedMergeStage::SortedMergeStage(PlanStage::Vector inputStages, std::vector<value::SortDirection> dirs, std::vector<value::SlotVector> inputVals, value::SlotVector outputVals, - PlanNodeId planNodeId) - : PlanStage("smerge"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("smerge"_sd, planNodeId, participateInTrialRunTracking), _inputKeys(std::move(inputKeys)), _dirs(std::move(dirs)), _inputVals(std::move(inputVals)), @@ -69,8 +70,13 @@ std::unique_ptr<PlanStage> SortedMergeStage::clone() const { for (auto& child : _children) { inputStages.emplace_back(child->clone()); } - return std::make_unique<SortedMergeStage>( - std::move(inputStages), _inputKeys, _dirs, _inputVals, _outputVals, _commonStats.nodeId); + return std::make_unique<SortedMergeStage>(std::move(inputStages), + _inputKeys, + _dirs, + _inputVals, + _outputVals, + _commonStats.nodeId, + _participateInTrialRunTracking); } void SortedMergeStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/sorted_merge.h b/src/mongo/db/exec/sbe/stages/sorted_merge.h index 3b87e4c8849..436ddfce080 100644 --- a/src/mongo/db/exec/sbe/stages/sorted_merge.h +++ b/src/mongo/db/exec/sbe/stages/sorted_merge.h @@ -61,7 +61,8 @@ public: // Each element of 'inputVals' must be the same size as 'outputVals'. std::vector<value::SlotVector> inputVals, value::SlotVector outputVals, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/spool.cpp b/src/mongo/db/exec/sbe/stages/spool.cpp index 4550f569b09..47ca744962c 100644 --- a/src/mongo/db/exec/sbe/stages/spool.cpp +++ b/src/mongo/db/exec/sbe/stages/spool.cpp @@ -35,14 +35,20 @@ namespace mongo::sbe { SpoolEagerProducerStage::SpoolEagerProducerStage(std::unique_ptr<PlanStage> input, SpoolId spoolId, value::SlotVector vals, - PlanNodeId planNodeId) - : PlanStage{"espool"_sd, planNodeId}, _spoolId{spoolId}, _vals{std::move(vals)} { + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage{"espool"_sd, planNodeId, participateInTrialRunTracking}, + _spoolId{spoolId}, + _vals{std::move(vals)} { _children.emplace_back(std::move(input)); } std::unique_ptr<PlanStage> SpoolEagerProducerStage::clone() const { - return std::make_unique<SpoolEagerProducerStage>( - _children[0]->clone(), _spoolId, _vals, _commonStats.nodeId); + return std::make_unique<SpoolEagerProducerStage>(_children[0]->clone(), + _spoolId, + _vals, + _commonStats.nodeId, + _participateInTrialRunTracking); } void SpoolEagerProducerStage::prepare(CompileCtx& ctx) { @@ -171,8 +177,9 @@ SpoolLazyProducerStage::SpoolLazyProducerStage(std::unique_ptr<PlanStage> input, SpoolId spoolId, value::SlotVector vals, std::unique_ptr<EExpression> predicate, - PlanNodeId planNodeId) - : PlanStage{"lspool"_sd, planNodeId}, + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage{"lspool"_sd, planNodeId, participateInTrialRunTracking}, _spoolId{spoolId}, _vals{std::move(vals)}, _predicate{std::move(predicate)} { @@ -180,8 +187,12 @@ SpoolLazyProducerStage::SpoolLazyProducerStage(std::unique_ptr<PlanStage> input, } std::unique_ptr<PlanStage> SpoolLazyProducerStage::clone() const { - return std::make_unique<SpoolLazyProducerStage>( - _children[0]->clone(), _spoolId, _vals, _predicate->clone(), _commonStats.nodeId); + return std::make_unique<SpoolLazyProducerStage>(_children[0]->clone(), + _spoolId, + _vals, + _predicate->clone(), + _commonStats.nodeId, + _participateInTrialRunTracking); } void SpoolLazyProducerStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/spool.h b/src/mongo/db/exec/sbe/stages/spool.h index a2dd6f81657..09a453e0e0e 100644 --- a/src/mongo/db/exec/sbe/stages/spool.h +++ b/src/mongo/db/exec/sbe/stages/spool.h @@ -56,7 +56,8 @@ public: SpoolEagerProducerStage(std::unique_ptr<PlanStage> input, SpoolId spoolId, value::SlotVector vals, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; @@ -109,7 +110,8 @@ public: SpoolId spoolId, value::SlotVector vals, std::unique_ptr<EExpression> predicate, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; @@ -165,13 +167,17 @@ private: template <bool IsStack> class SpoolConsumerStage final : public PlanStage { public: - SpoolConsumerStage(SpoolId spoolId, value::SlotVector vals, PlanNodeId planNodeId) - : PlanStage{IsStack ? "sspool"_sd : "cspool"_sd, planNodeId}, + SpoolConsumerStage(SpoolId spoolId, + value::SlotVector vals, + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true) + : PlanStage{IsStack ? "sspool"_sd : "cspool"_sd, planNodeId, participateInTrialRunTracking}, _spoolId{spoolId}, _vals{std::move(vals)} {} std::unique_ptr<PlanStage> clone() const { - return std::make_unique<SpoolConsumerStage<IsStack>>(_spoolId, _vals, _commonStats.nodeId); + return std::make_unique<SpoolConsumerStage<IsStack>>( + _spoolId, _vals, _commonStats.nodeId, _participateInTrialRunTracking); } void prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/stages.h b/src/mongo/db/exec/sbe/stages/stages.h index 59f6746a005..02dd6ae62fb 100644 --- a/src/mongo/db/exec/sbe/stages/stages.h +++ b/src/mongo/db/exec/sbe/stages/stages.h @@ -254,7 +254,9 @@ protected: template <typename T> class CanTrackStats { public: - CanTrackStats(StringData stageType, PlanNodeId nodeId) : _commonStats(stageType, nodeId) {} + CanTrackStats(StringData stageType, PlanNodeId nodeId, bool participateInTrialRunTracking) + : _commonStats(stageType, nodeId), + _participateInTrialRunTracking(participateInTrialRunTracking) {} /** * Returns a tree of stats. If the stage has any children it must propagate the request for @@ -414,6 +416,12 @@ protected: CommonStats _commonStats; + // Flag which determines whether this node and its children can participate in trial run + // tracking. A stage and its children are not eligible for trial run tracking when they are + // planned deterministically (that is, the amount of work they perform is independent of + // other parts of the tree which are multiplanned). + bool _participateInTrialRunTracking{true}; + private: /** * In general, accessors can be accessed only after getNext returns a row. It is most definitely @@ -422,14 +430,6 @@ private: * that feature is retired we can then simply revisit all stages and simplify them. */ bool _slotsAccessible{false}; - - /** - * Flag which determines whether this node and its children can participate in trial run - * tracking. A stage and its children are not eligible for trial run tracking when they are - * planned deterministically (that is, the amount of work they perform is independent of - * other parts of the tree which are multiplanned). - */ - bool _participateInTrialRunTracking{true}; }; /** @@ -496,10 +496,15 @@ class PlanStage : public CanSwitchOperationContext<PlanStage>, public: using Vector = absl::InlinedVector<std::unique_ptr<PlanStage>, 2>; - PlanStage(StringData stageType, PlanYieldPolicy* yieldPolicy, PlanNodeId nodeId) - : CanTrackStats{stageType, nodeId}, CanInterrupt{yieldPolicy} {} + PlanStage(StringData stageType, + PlanYieldPolicy* yieldPolicy, + PlanNodeId nodeId, + bool participateInTrialRunTracking) + : CanTrackStats{stageType, nodeId, participateInTrialRunTracking}, + CanInterrupt{yieldPolicy} {} - PlanStage(StringData stageType, PlanNodeId nodeId) : PlanStage(stageType, nullptr, nodeId) {} + PlanStage(StringData stageType, PlanNodeId nodeId, bool participateInTrialRunTracking) + : PlanStage(stageType, nullptr, nodeId, participateInTrialRunTracking) {} virtual ~PlanStage() = default; diff --git a/src/mongo/db/exec/sbe/stages/traverse.cpp b/src/mongo/db/exec/sbe/stages/traverse.cpp index d1e0a040b3e..654a1a160fa 100644 --- a/src/mongo/db/exec/sbe/stages/traverse.cpp +++ b/src/mongo/db/exec/sbe/stages/traverse.cpp @@ -42,8 +42,9 @@ TraverseStage::TraverseStage(std::unique_ptr<PlanStage> outer, std::unique_ptr<EExpression> foldExpr, std::unique_ptr<EExpression> finalExpr, PlanNodeId planNodeId, - boost::optional<size_t> nestedArraysDepth) - : PlanStage("traverse"_sd, planNodeId), + boost::optional<size_t> nestedArraysDepth, + bool participateInTrialRunTracking) + : PlanStage("traverse"_sd, planNodeId, participateInTrialRunTracking), _inField(inField), _outField(outField), _outFieldInner(outFieldInner), @@ -69,7 +70,8 @@ std::unique_ptr<PlanStage> TraverseStage::clone() const { _fold ? _fold->clone() : nullptr, _final ? _final->clone() : nullptr, _commonStats.nodeId, - _nestedArraysDepth); + _nestedArraysDepth, + _participateInTrialRunTracking); } void TraverseStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/traverse.h b/src/mongo/db/exec/sbe/stages/traverse.h index 2b3fee33a47..09e5dc3dfcf 100644 --- a/src/mongo/db/exec/sbe/stages/traverse.h +++ b/src/mongo/db/exec/sbe/stages/traverse.h @@ -74,7 +74,8 @@ public: std::unique_ptr<EExpression> foldExpr, std::unique_ptr<EExpression> finalExpr, PlanNodeId planNodeId, - boost::optional<size_t> nestedArraysDepth); + boost::optional<size_t> nestedArraysDepth, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/union.cpp b/src/mongo/db/exec/sbe/stages/union.cpp index a661e6c579f..2fd6d0b4fc5 100644 --- a/src/mongo/db/exec/sbe/stages/union.cpp +++ b/src/mongo/db/exec/sbe/stages/union.cpp @@ -38,8 +38,9 @@ namespace mongo::sbe { UnionStage::UnionStage(PlanStage::Vector inputStages, std::vector<value::SlotVector> inputVals, value::SlotVector outputVals, - PlanNodeId planNodeId) - : PlanStage("union"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("union"_sd, planNodeId, participateInTrialRunTracking), _inputVals{std::move(inputVals)}, _outputVals{std::move(outputVals)} { _children = std::move(inputStages); @@ -57,8 +58,11 @@ std::unique_ptr<PlanStage> UnionStage::clone() const { for (auto& child : _children) { inputStages.emplace_back(child->clone()); } - return std::make_unique<UnionStage>( - std::move(inputStages), _inputVals, _outputVals, _commonStats.nodeId); + return std::make_unique<UnionStage>(std::move(inputStages), + _inputVals, + _outputVals, + _commonStats.nodeId, + _participateInTrialRunTracking); } void UnionStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/union.h b/src/mongo/db/exec/sbe/stages/union.h index 2ec0ec73df9..b21d5e6caf5 100644 --- a/src/mongo/db/exec/sbe/stages/union.h +++ b/src/mongo/db/exec/sbe/stages/union.h @@ -53,7 +53,8 @@ public: UnionStage(PlanStage::Vector inputStages, std::vector<value::SlotVector> inputVals, value::SlotVector outputVals, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/unique.cpp b/src/mongo/db/exec/sbe/stages/unique.cpp index 355927ff912..c88fa9ab43e 100644 --- a/src/mongo/db/exec/sbe/stages/unique.cpp +++ b/src/mongo/db/exec/sbe/stages/unique.cpp @@ -37,13 +37,15 @@ namespace mongo { namespace sbe { UniqueStage::UniqueStage(std::unique_ptr<PlanStage> input, value::SlotVector keys, - PlanNodeId planNodeId) - : PlanStage("unique"_sd, planNodeId), _keySlots(keys) { + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("unique"_sd, planNodeId, participateInTrialRunTracking), _keySlots(keys) { _children.emplace_back(std::move(input)); } std::unique_ptr<PlanStage> UniqueStage::clone() const { - return std::make_unique<UniqueStage>(_children[0]->clone(), _keySlots, _commonStats.nodeId); + return std::make_unique<UniqueStage>( + _children[0]->clone(), _keySlots, _commonStats.nodeId, _participateInTrialRunTracking); } void UniqueStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/unique.h b/src/mongo/db/exec/sbe/stages/unique.h index 1165743a0cc..c344cd09d24 100644 --- a/src/mongo/db/exec/sbe/stages/unique.h +++ b/src/mongo/db/exec/sbe/stages/unique.h @@ -53,7 +53,10 @@ namespace mongo::sbe { */ class UniqueStage final : public PlanStage { public: - UniqueStage(std::unique_ptr<PlanStage> input, value::SlotVector keys, PlanNodeId planNodeId); + UniqueStage(std::unique_ptr<PlanStage> input, + value::SlotVector keys, + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; diff --git a/src/mongo/db/exec/sbe/stages/unwind.cpp b/src/mongo/db/exec/sbe/stages/unwind.cpp index b4c5e225adc..7ad10eecb23 100644 --- a/src/mongo/db/exec/sbe/stages/unwind.cpp +++ b/src/mongo/db/exec/sbe/stages/unwind.cpp @@ -40,8 +40,9 @@ UnwindStage::UnwindStage(std::unique_ptr<PlanStage> input, value::SlotId outField, value::SlotId outIndex, bool preserveNullAndEmptyArrays, - PlanNodeId planNodeId) - : PlanStage("unwind"_sd, planNodeId), + PlanNodeId planNodeId, + bool participateInTrialRunTracking) + : PlanStage("unwind"_sd, planNodeId, participateInTrialRunTracking), _inField(inField), _outField(outField), _outIndex(outIndex), @@ -59,7 +60,8 @@ std::unique_ptr<PlanStage> UnwindStage::clone() const { _outField, _outIndex, _preserveNullAndEmptyArrays, - _commonStats.nodeId); + _commonStats.nodeId, + _participateInTrialRunTracking); } void UnwindStage::prepare(CompileCtx& ctx) { diff --git a/src/mongo/db/exec/sbe/stages/unwind.h b/src/mongo/db/exec/sbe/stages/unwind.h index 049fee4a069..57b28d9c1cf 100644 --- a/src/mongo/db/exec/sbe/stages/unwind.h +++ b/src/mongo/db/exec/sbe/stages/unwind.h @@ -52,7 +52,8 @@ public: value::SlotId outField, value::SlotId outIndex, bool preserveNullAndEmptyArrays, - PlanNodeId planNodeId); + PlanNodeId planNodeId, + bool participateInTrialRunTracking = true); std::unique_ptr<PlanStage> clone() const final; |