summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/multi_plan.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/exec/multi_plan.h')
-rw-r--r--src/mongo/db/exec/multi_plan.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/mongo/db/exec/multi_plan.h b/src/mongo/db/exec/multi_plan.h
index 14d8ea413af..12ab61659db 100644
--- a/src/mongo/db/exec/multi_plan.h
+++ b/src/mongo/db/exec/multi_plan.h
@@ -75,7 +75,6 @@ public:
std::unique_ptr<PlanStageStats> getStats() final;
-
const SpecificStats* getSpecificStats() const final;
boost::optional<double> getCandidateScore(size_t candidateIdx) const;
@@ -163,6 +162,19 @@ private:
*/
void tryYield(PlanYieldPolicy* yieldPolicy);
+ /**
+ * Deletes all children, except for best and backup plans.
+ *
+ * This is necessary to release any resources that rejected plans might have.
+ * For example, if multi-update can be done by scanning several indexes,
+ * it will be slowed down by rejected index scans because of index cursors
+ * that need to be reopeneed after every update.
+ */
+ void removeRejectedPlans();
+ void rejectPlan(size_t planIdx);
+ void switchToBackupPlan();
+ void removeBackupPlan();
+
static const int kNoSuchPlan = -1;
// Describes the cases in which we should write an entry for the winning plan to the plan cache.
@@ -178,6 +190,9 @@ private:
// one-to-one with _candidates.
std::vector<plan_ranker::CandidatePlan> _candidates;
+ // Rejected plans in saved and detached state.
+ std::vector<std::unique_ptr<PlanStage>> _rejected;
+
// index into _candidates, of the winner of the plan competition
// uses -1 / kNoSuchPlan when best plan is not (yet) known
int _bestPlanIdx;