diff options
author | Tess Avitabile <tess.avitabile@mongodb.com> | 2016-02-17 14:45:26 -0500 |
---|---|---|
committer | Tess Avitabile <tess.avitabile@mongodb.com> | 2016-02-19 10:21:52 -0500 |
commit | 1d982f5421e93c7a59dab2d7acd5b549ab19790e (patch) | |
tree | 29a380d2fcae540dd9ffdce16f7b2d94a2918bb3 | |
parent | 8d8c5c3e9cea3c34b48abf5cbb95b2b46d9d677b (diff) | |
download | mongo-1d982f5421e93c7a59dab2d7acd5b549ab19790e.tar.gz |
SERVER-22675 Ensure PlanRanker::scoreTree does not divide by zero
-rw-r--r-- | src/mongo/db/exec/cached_plan.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/query/plan_ranker.cpp | 1 |
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] |