Avoid intentional overflow in GetL0ThresholdSpeedupCompaction

Summary:
99c052a34f 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
This commit is contained in:
Islam AbdelRahman 2016-11-28 18:25:27 -08:00 committed by Facebook Github Bot
parent 52fd1ff2c2
commit a2bf265a39

View file

@ -571,30 +571,26 @@ int GetL0ThresholdSpeedupCompaction(int level0_file_num_compaction_trigger,
return std::numeric_limits<int>::max(); return std::numeric_limits<int>::max();
} }
const int twice_level0_trigger = level0_file_num_compaction_trigger * 2; const int64_t twice_level0_trigger =
static_cast<int64_t>(level0_file_num_compaction_trigger) * 2;
// overflow protection const int64_t one_fourth_trigger_slowdown =
if (twice_level0_trigger < 0) { static_cast<int64_t>(level0_file_num_compaction_trigger) +
return std::numeric_limits<int>::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 +
((level0_slowdown_writes_trigger - level0_file_num_compaction_trigger) / ((level0_slowdown_writes_trigger - level0_file_num_compaction_trigger) /
4); 4);
// overflow protection
if (one_fourth_trigger_slowdown < 0) {
return std::numeric_limits<int>::max();
}
assert(twice_level0_trigger >= 0); assert(twice_level0_trigger >= 0);
assert(one_fourth_trigger_slowdown >= 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. // 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 } // namespace