summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/plan_cache_commands.cpp
diff options
context:
space:
mode:
authorsamontea <merciers.merciers@gmail.com>2019-07-11 11:18:42 -0400
committersamontea <merciers.merciers@gmail.com>2019-07-11 18:26:24 -0400
commit902b3f9135861b69b6581909299a8ada2db6588f (patch)
tree35d2524002504dcbb3cee4cf82b1699b975865f6 /src/mongo/db/commands/plan_cache_commands.cpp
parent3962f8222c85c7b5fb2f558cf4269baea3f224cb (diff)
downloadmongo-902b3f9135861b69b6581909299a8ada2db6588f.tar.gz
SERVER-41279 Eliminate failed plans from consideration during query planning
Diffstat (limited to 'src/mongo/db/commands/plan_cache_commands.cpp')
-rw-r--r--src/mongo/db/commands/plan_cache_commands.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/mongo/db/commands/plan_cache_commands.cpp b/src/mongo/db/commands/plan_cache_commands.cpp
index fff1ec0905d..4fc13e65c6a 100644
--- a/src/mongo/db/commands/plan_cache_commands.cpp
+++ b/src/mongo/db/commands/plan_cache_commands.cpp
@@ -390,7 +390,9 @@ Status listPlansOriginalFormat(std::unique_ptr<CanonicalQuery> cq,
size_t numPlans = entry->plannerData.size();
invariant(numPlans == entry->decision->stats.size());
- invariant(numPlans == entry->decision->scores.size());
+ invariant(numPlans ==
+ entry->decision->scores.size() + entry->decision->failedCandidates.size());
+ invariant(entry->decision->candidateOrder.size() == entry->decision->scores.size());
for (size_t i = 0; i < numPlans; ++i) {
BSONObjBuilder planBob(plansBuilder.subobjStart());
@@ -404,7 +406,12 @@ Status listPlansOriginalFormat(std::unique_ptr<CanonicalQuery> cq,
// reason is comprised of score and initial stats provided by
// multi plan runner.
BSONObjBuilder reasonBob(planBob.subobjStart("reason"));
- reasonBob.append("score", entry->decision->scores[i]);
+ if (i < entry->decision->candidateOrder.size()) {
+ reasonBob.append("score", entry->decision->scores[i]);
+ } else {
+ reasonBob.append("score", 0.0);
+ reasonBob.append("failed", true);
+ }
BSONObjBuilder statsBob(reasonBob.subobjStart("stats"));
PlanStageStats* stats = entry->decision->stats[i].get();
if (stats) {