From: Islam AbdelRahman Date: Tue, 29 Nov 2016 02:25:27 +0000 (-0800) Subject: Avoid intentional overflow in GetL0ThresholdSpeedupCompaction X-Git-Tag: rocksdb-4.13~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c4d49a7cd62a32ff2f907d8f48035afcc531107a;p=rocksdb.git Avoid intentional overflow in GetL0ThresholdSpeedupCompaction Summary: https://github.com/facebook/rocksdb/commit/99c052a34f93d119b75eccdcd489ecd581d48ee9 fixes integer overflow in GetL0ThresholdSpeedupCompaction() by checking if int become -ve. UBSAN will complain about that since this is still an overflow, we can fix the issue by simply using int64_t Closes https://github.com/facebook/rocksdb/pull/1582 Differential Revision: D4241525 Pulled By: IslamAbdelRahman fbshipit-source-id: b3ae21f --- diff --git a/db/column_family.cc b/db/column_family.cc index 540ed74f..1ddd19fe 100644 --- a/db/column_family.cc +++ b/db/column_family.cc @@ -553,30 +553,26 @@ int GetL0ThresholdSpeedupCompaction(int level0_file_num_compaction_trigger, return std::numeric_limits::max(); } - const int twice_level0_trigger = level0_file_num_compaction_trigger * 2; + const int64_t twice_level0_trigger = + static_cast(level0_file_num_compaction_trigger) * 2; - // overflow protection - if (twice_level0_trigger < 0) { - return std::numeric_limits::max(); - } - - // 1/4 of the way between L0 compaction trigger threshold and slowdown - // condition. - const int one_fourth_trigger_slowdown = - level0_file_num_compaction_trigger + + const int64_t one_fourth_trigger_slowdown = + static_cast(level0_file_num_compaction_trigger) + ((level0_slowdown_writes_trigger - level0_file_num_compaction_trigger) / 4); - // overflow protection - if (one_fourth_trigger_slowdown < 0) { - return std::numeric_limits::max(); - } - assert(twice_level0_trigger >= 0); assert(one_fourth_trigger_slowdown >= 0); + // 1/4 of the way between L0 compaction trigger threshold and slowdown + // condition. // Or twice as compaction trigger, if it is smaller. - return std::min(twice_level0_trigger, one_fourth_trigger_slowdown); + int64_t res = std::min(twice_level0_trigger, one_fourth_trigger_slowdown); + if (res >= port::kMaxInt32) { + return port::kMaxInt32; + } else { + return res; + } } } // namespace