mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-29 18:33:58 +00:00
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:
parent
52fd1ff2c2
commit
a2bf265a39
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue