summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/multi_plan.cpp
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
commit4cb8841196d0625dfa3825aa326f071cd27c7b8b (patch)
tree1682a647d4463397c119183369ae6f750d5fdcff /src/mongo/db/exec/multi_plan.cpp
parentaa03c6362cbaa767638e6eed9b031d86dd2643d1 (diff)
parent8f0827553e09872941945a093b647a4211a9db7f (diff)
Update upstream source from tag 'upstream/6.0.0'master
Update to upstream version '6.0.0' with Debian dir 5604a80ec1c96ca76f25f40d78e6ef855abec322
Diffstat (limited to 'src/mongo/db/exec/multi_plan.cpp')
-rw-r--r--src/mongo/db/exec/multi_plan.cpp57
1 files changed, 3 insertions, 54 deletions
diff --git a/src/mongo/db/exec/multi_plan.cpp b/src/mongo/db/exec/multi_plan.cpp
index 00254cef133..def29719b63 100644
--- a/src/mongo/db/exec/multi_plan.cpp
+++ b/src/mongo/db/exec/multi_plan.cpp
@@ -190,13 +190,14 @@ PlanStage::StageState MultiPlanStage::doWork(WorkingSetID* out) {
.getPlanCache()
->remove(plan_cache_key_factory::make<PlanCacheKey>(*_query, collection()));
- switchToBackupPlan();
+ _bestPlanIdx = _backupPlanIdx;
+ _backupPlanIdx = kNoSuchPlan;
return _candidates[_bestPlanIdx].root->work(out);
}
if (hasBackupPlan() && PlanStage::ADVANCED == state) {
LOGV2_DEBUG(20589, 5, "Best plan had a blocking stage, became unblocked");
- removeBackupPlan();
+ _backupPlanIdx = kNoSuchPlan;
}
return state;
@@ -293,7 +294,6 @@ Status MultiPlanStage::pickBestPlan(PlanYieldPolicy* yieldPolicy) {
plan_cache_util::updatePlanCache(
expCtx()->opCtx, collection(), _cachingMode, *_query, std::move(ranking), _candidates);
- removeRejectedPlans();
return Status::OK();
}
@@ -364,54 +364,6 @@ bool MultiPlanStage::workAllPlans(size_t numResults, PlanYieldPolicy* yieldPolic
return !doneWorking;
}
-void MultiPlanStage::removeRejectedPlans() {
- // Move the best plan and the backup plan to the front of 'children'.
- if (_bestPlanIdx != 0) {
- std::swap(_children[_bestPlanIdx], _children[0]);
- std::swap(_candidates[_bestPlanIdx], _candidates[0]);
- if (_backupPlanIdx == 0) {
- _backupPlanIdx = _bestPlanIdx;
- }
- _bestPlanIdx = 0;
- }
- size_t startIndex = 1;
- if (_backupPlanIdx != kNoSuchPlan) {
- if (_backupPlanIdx != 1) {
- std::swap(_children[_backupPlanIdx], _children[1]);
- std::swap(_candidates[_backupPlanIdx], _candidates[1]);
- _backupPlanIdx = 1;
- }
- startIndex = 2;
- }
-
- _rejected.reserve(_children.size() - startIndex);
- for (size_t i = startIndex; i < _children.size(); ++i) {
- rejectPlan(i);
- }
- _children.resize(startIndex);
-}
-
-void MultiPlanStage::switchToBackupPlan() {
- std::swap(_children[_backupPlanIdx], _children[_bestPlanIdx]);
- std::swap(_candidates[_backupPlanIdx], _candidates[_bestPlanIdx]);
- removeBackupPlan();
-}
-
-void MultiPlanStage::rejectPlan(size_t planIdx) {
- auto rejectedPlan = std::move(_children[planIdx]);
- if (opCtx() != nullptr) {
- rejectedPlan->saveState();
- rejectedPlan->detachFromOperationContext();
- }
- _rejected.emplace_back(std::move(rejectedPlan));
-}
-
-void MultiPlanStage::removeBackupPlan() {
- rejectPlan(_backupPlanIdx);
- _children.resize(1);
- _backupPlanIdx = kNoSuchPlan;
-}
-
bool MultiPlanStage::hasBackupPlan() const {
return kNoSuchPlan != _backupPlanIdx;
}
@@ -446,9 +398,6 @@ unique_ptr<PlanStageStats> MultiPlanStage::getStats() {
for (auto&& child : _children) {
ret->children.emplace_back(child->getStats());
}
- for (auto&& child : _rejected) {
- ret->children.emplace_back(child->getStats());
- }
return ret;
}