diff --git a/db/version_set.cc b/db/version_set.cc index d28b2e2d961..5104deeeea2 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -1968,9 +1968,16 @@ uint64_t VersionStorageInfo::GetEstimatedActiveKeys() const { } if (current_num_samples_ < file_count) { - // casting to avoid overflowing - return static_cast( - (est * static_cast(file_count) / current_num_samples_)); + assert(current_num_samples_ != 0); + assert(est != 0); + double multiplier = static_cast(file_count) / current_num_samples_; + double maximum_multiplier = + static_cast(std::numeric_limits::max()) / est; + // If it can overflow, we return the maximum unsigned long. + if (multiplier >= maximum_multiplier) { + return std::numeric_limits::max(); + } + return static_cast(est * multiplier); } else { return est; }