diff options
author | samontea <merciers.merciers@gmail.com> | 2019-07-11 11:18:42 -0400 |
---|---|---|
committer | samontea <merciers.merciers@gmail.com> | 2019-07-11 18:26:24 -0400 |
commit | 902b3f9135861b69b6581909299a8ada2db6588f (patch) | |
tree | 35d2524002504dcbb3cee4cf82b1699b975865f6 /src/mongo/db/commands/plan_cache_commands.cpp | |
parent | 3962f8222c85c7b5fb2f558cf4269baea3f224cb (diff) | |
download | mongo-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.cpp | 11 |
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) { |