IMPALA-4441: Divide-by-zero in RuntimeProfile::SummaryStatsCounter::SetStats
This patch anticipates the case where total_num_values_ can be 0 and makes sure a divide-by-zero is not possible. Change-Id: I33f1e6fb45505dce7d79497d1632c5f63a409151 Reviewed-on: http://gerrit.cloudera.org:8080/4975 Reviewed-by: Henry Robinson <[email protected]> Tested-by: Internal Jenkins Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/e3483c44 Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/e3483c44 Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/e3483c44 Branch: refs/heads/master Commit: e3483c44a3180a5c1f15a09f7c4f4f7b45ffcb44 Parents: 1a99b78 Author: Sailesh <[email protected]> Authored: Mon Nov 7 11:36:39 2016 -0800 Committer: Internal Jenkins <[email protected]> Committed: Tue Nov 8 00:55:47 2016 +0000 ---------------------------------------------------------------------- be/src/util/runtime-profile.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/e3483c44/be/src/util/runtime-profile.cc ---------------------------------------------------------------------- diff --git a/be/src/util/runtime-profile.cc b/be/src/util/runtime-profile.cc index a9b46b9..19044fa 100644 --- a/be/src/util/runtime-profile.cc +++ b/be/src/util/runtime-profile.cc @@ -1037,6 +1037,8 @@ void RuntimeProfile::SummaryStatsCounter::UpdateCounter(int64_t new_value) { } void RuntimeProfile::SummaryStatsCounter::SetStats(const TSummaryStatsCounter& counter) { + // We drop this input if it looks malformed. + if (counter.total_num_values < 0) return; lock_guard<SpinLock> l(lock_); unit_ = counter.unit; sum_ = counter.sum; @@ -1044,7 +1046,7 @@ void RuntimeProfile::SummaryStatsCounter::SetStats(const TSummaryStatsCounter& c min_ = counter.min_value; max_ = counter.max_value; - value_.Store(sum_ / total_num_values_); + value_.Store(total_num_values_ == 0 ? 0 : sum_ / total_num_values_); } int64_t RuntimeProfile::SummaryStatsCounter::MinValue() {
