summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTess Avitabile <tess.avitabile@mongodb.com>2016-02-17 14:45:26 -0500
committerTess Avitabile <tess.avitabile@mongodb.com>2016-02-19 10:21:52 -0500
commit1d982f5421e93c7a59dab2d7acd5b549ab19790e (patch)
tree29a380d2fcae540dd9ffdce16f7b2d94a2918bb3
parent8d8c5c3e9cea3c34b48abf5cbb95b2b46d9d677b (diff)
downloadmongo-1d982f5421e93c7a59dab2d7acd5b549ab19790e.tar.gz
SERVER-22675 Ensure PlanRanker::scoreTree does not divide by zero
-rw-r--r--src/mongo/db/exec/cached_plan.cpp2
-rw-r--r--src/mongo/db/query/plan_ranker.cpp1
2 files changed, 2 insertions, 1 deletions
diff --git a/src/mongo/db/exec/cached_plan.cpp b/src/mongo/db/exec/cached_plan.cpp
index 8037dad1c5a..7604d5ce465 100644
--- a/src/mongo/db/exec/cached_plan.cpp
+++ b/src/mongo/db/exec/cached_plan.cpp
@@ -327,7 +327,7 @@ const SpecificStats* CachedPlanStage::getSpecificStats() const {
void CachedPlanStage::updatePlanCache() {
std::unique_ptr<PlanCacheEntryFeedback> feedback = stdx::make_unique<PlanCacheEntryFeedback>();
feedback->stats = getStats();
- feedback->score = PlanRanker::scoreTree(feedback->stats.get());
+ feedback->score = PlanRanker::scoreTree(feedback->stats->children[0].get());
PlanCache* cache = _collection->infoCache()->getPlanCache();
Status fbs = cache->feedback(*_canonicalQuery, feedback.release());
diff --git a/src/mongo/db/query/plan_ranker.cpp b/src/mongo/db/query/plan_ranker.cpp
index ff8344da6a0..d4f68eb0602 100644
--- a/src/mongo/db/query/plan_ranker.cpp
+++ b/src/mongo/db/query/plan_ranker.cpp
@@ -196,6 +196,7 @@ double PlanRanker::scoreTree(const PlanStageStats* stats) {
// How many "units of work" did the plan perform. Each call to work(...)
// counts as one unit.
size_t workUnits = stats->common.works;
+ invariant(workUnits != 0);
// How much did a plan produce?
// Range: [0, 1]