summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/sbe/stages
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/exec/sbe/stages')
-rw-r--r--src/mongo/db/exec/sbe/stages/branch.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/branch.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/bson_scan.cpp14
-rw-r--r--src/mongo/db/exec/sbe/stages/bson_scan.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/check_bounds.cpp14
-rw-r--r--src/mongo/db/exec/sbe/stages/check_bounds.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/co_scan.cpp9
-rw-r--r--src/mongo/db/exec/sbe/stages/co_scan.h4
-rw-r--r--src/mongo/db/exec/sbe/stages/column_scan.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/column_scan.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/exchange.cpp19
-rw-r--r--src/mongo/db/exec/sbe/stages/exchange.h10
-rw-r--r--src/mongo/db/exec/sbe/stages/filter.h13
-rw-r--r--src/mongo/db/exec/sbe/stages/hash_agg.cpp39
-rw-r--r--src/mongo/db/exec/sbe/stages/hash_agg.h8
-rw-r--r--src/mongo/db/exec/sbe/stages/hash_join.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/hash_join.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/hash_lookup.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/hash_lookup.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/ix_scan.cpp3
-rw-r--r--src/mongo/db/exec/sbe/stages/ix_scan.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/limit_skip.cpp7
-rw-r--r--src/mongo/db/exec/sbe/stages/limit_skip.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/loop_join.cpp14
-rw-r--r--src/mongo/db/exec/sbe/stages/loop_join.h6
-rw-r--r--src/mongo/db/exec/sbe/stages/makeobj.cpp33
-rw-r--r--src/mongo/db/exec/sbe/stages/makeobj.h16
-rw-r--r--src/mongo/db/exec/sbe/stages/merge_join.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/merge_join.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/project.cpp12
-rw-r--r--src/mongo/db/exec/sbe/stages/project.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/scan.cpp23
-rw-r--r--src/mongo/db/exec/sbe/stages/scan.h9
-rw-r--r--src/mongo/db/exec/sbe/stages/sort.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/sort.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/sorted_merge.cpp14
-rw-r--r--src/mongo/db/exec/sbe/stages/sorted_merge.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/spool.cpp27
-rw-r--r--src/mongo/db/exec/sbe/stages/spool.h16
-rw-r--r--src/mongo/db/exec/sbe/stages/stages.h29
-rw-r--r--src/mongo/db/exec/sbe/stages/traverse.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/traverse.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/union.cpp12
-rw-r--r--src/mongo/db/exec/sbe/stages/union.h3
-rw-r--r--src/mongo/db/exec/sbe/stages/unique.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/unique.h5
-rw-r--r--src/mongo/db/exec/sbe/stages/unwind.cpp8
-rw-r--r--src/mongo/db/exec/sbe/stages/unwind.h3
48 files changed, 319 insertions, 154 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 e3fd62cb86b..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) {
@@ -354,25 +356,18 @@ void HashAggStage::open(bool reOpen) {
key.reset(idx++, false, tag, val);
}
- if (!_recordStore) {
- // The memory limit hasn't been reached yet, accumulate state in '_ht'.
- auto [it, inserted] = _ht->try_emplace(std::move(key), value::MaterializedRow{0});
- if (inserted) {
- // Copy keys.
- const_cast<value::MaterializedRow&>(it->first).makeOwned();
- // Initialize accumulators.
- it->second.resize(_outAggAccessors.size());
- }
- // Always update the state in the '_ht' for the branch when data hasn't been
- // spilled to disk.
+
+ if (_htIt = _ht->find(key); !_recordStore && _htIt == _ht->end()) {
+ // The memory limit hasn't been reached yet, insert a new key in '_ht' by copying
+ // the key. Note as a future optimization, we should avoid the lookup in the find()
+ // call and the emplace.
+ key.makeOwned();
+ auto [it, _] = _ht->emplace(std::move(key), value::MaterializedRow{0});
+ // Initialize accumulators.
+ it->second.resize(_outAggAccessors.size());
_htIt = it;
- updateAggStateHt = true;
- } else {
- // The memory limit has been reached, accumulate state in '_ht' only if we
- // find the key in '_ht'.
- _htIt = _ht->find(key);
- updateAggStateHt = _htIt != _ht->end();
}
+ updateAggStateHt = _htIt != _ht->end();
if (updateAggStateHt) {
// Accumulate state in '_ht' by pointing the '_outAggAccessors' the
@@ -500,9 +495,9 @@ PlanState HashAggStage::getNext() {
KeyString::TypeBits::fromBuffer(KeyString::Version::kLatestVersion, &valReader);
_aggValueRecordStore = val;
- BufBuilder buf;
+ _aggKeyRSBuffer.reset();
_aggKeyRecordStore = value::MaterializedRow::deserializeFromKeyString(
- decodeKeyString(nextRecord->id, typeBits), &buf);
+ decodeKeyString(nextRecord->id, typeBits), &_aggKeyRSBuffer);
return trackPlanState(PlanState::ADVANCED);
} else {
_rsCursor.reset();
diff --git a/src/mongo/db/exec/sbe/stages/hash_agg.h b/src/mongo/db/exec/sbe/stages/hash_agg.h
index 8c117e8717d..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;
@@ -184,6 +185,11 @@ private:
std::vector<std::unique_ptr<value::MaterializedSingleRowAccessor>> _outRecordStoreKeyAccessors;
std::vector<std::unique_ptr<value::MaterializedSingleRowAccessor>> _outRecordStoreAggAccessors;
+ // This buffer stores values for the spilled '_aggKeyRecordStore' that's loaded into memory from
+ // the '_recordStore'. Values in the '_aggKeyRecordStore' row are pointers that point to data in
+ // this buffer.
+ BufBuilder _aggKeyRSBuffer;
+
std::vector<value::SlotAccessor*> _seekKeysAccessors;
value::MaterializedRow _seekKeys;
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 520e68fe074..1c4a54248dd 100644
--- a/src/mongo/db/exec/sbe/stages/ix_scan.cpp
+++ b/src/mongo/db/exec/sbe/stages/ix_scan.cpp
@@ -81,7 +81,8 @@ std::unique_ptr<PlanStage> IndexScanStage::clone() const {
_seekKeyLow->clone(),
_seekKeyHigh->clone(),
_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 c57389b3434..3d1ae2eec78 100644
--- a/src/mongo/db/exec/sbe/stages/ix_scan.h
+++ b/src/mongo/db/exec/sbe/stages/ix_scan.h
@@ -85,7 +85,8 @@ public:
std::unique_ptr<EExpression> seekKeyLow,
std::unique_ptr<EExpression> seekKeyHigh,
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 e0402934517..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),
@@ -62,6 +65,29 @@ MakeObjStageBase<O>::MakeObjStageBase(std::unique_ptr<PlanStage> input,
}
template <MakeObjOutputType O>
+MakeObjStageBase<O>::MakeObjStageBase(std::unique_ptr<PlanStage> input,
+ value::SlotId objSlot,
+ boost::optional<value::SlotId> rootSlot,
+ boost::optional<FieldBehavior> fieldBehavior,
+ std::set<std::string> fields,
+ std::set<std::string> projectFields,
+ value::SlotVector projectVars,
+ bool forceNewObject,
+ bool returnOldObject,
+ PlanNodeId planNodeId)
+ : MakeObjStageBase<O>::MakeObjStageBase(
+ std::move(input),
+ objSlot,
+ rootSlot,
+ fieldBehavior,
+ std::vector<std::string>(fields.begin(), fields.end()),
+ std::vector<std::string>(projectFields.begin(), projectFields.end()),
+ std::move(projectVars),
+ forceNewObject,
+ returnOldObject,
+ planNodeId) {}
+
+template <MakeObjOutputType O>
std::unique_ptr<PlanStage> MakeObjStageBase<O>::clone() const {
return std::make_unique<MakeObjStageBase<O>>(_children[0]->clone(),
_objSlot,
@@ -72,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 1cf0755f1c5..3034470b95a 100644
--- a/src/mongo/db/exec/sbe/stages/makeobj.h
+++ b/src/mongo/db/exec/sbe/stages/makeobj.h
@@ -87,6 +87,22 @@ public:
value::SlotVector projectVars,
bool forceNewObject,
bool returnOldObject,
+ PlanNodeId planNodeId,
+ bool participateInTrialRunTracking = true);
+
+ /**
+ * A convenience constructor that takes a set instead of a vector for 'fields' and
+ * 'projectedFields'.
+ */
+ MakeObjStageBase(std::unique_ptr<PlanStage> input,
+ value::SlotId objSlot,
+ boost::optional<value::SlotId> rootSlot,
+ boost::optional<FieldBehavior> fieldBehavior,
+ std::set<std::string> fields,
+ std::set<std::string> projectFields,
+ value::SlotVector projectVars,
+ bool forceNewObject,
+ bool returnOldObject,
PlanNodeId planNodeId);
std::unique_ptr<PlanStage> clone() const final;
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;