diff --git a/src/opuntia.erl b/src/opuntia.erl index c937013..b2d9cd8 100644 --- a/src/opuntia.erl +++ b/src/opuntia.erl @@ -60,7 +60,7 @@ new(0) -> new({MaximumTokens, Rate, TimeUnit}) when ?NON_NEG_INT(MaximumTokens), ?NON_NEG_INT(Rate), ?TU(TimeUnit) -> #token_bucket_shaper{shape = {MaximumTokens, Rate, TimeUnit}, - available_tokens = 0, + available_tokens = MaximumTokens, last_update = erlang:monotonic_time(TimeUnit)}. %% @doc Update shaper and return possible waiting time. diff --git a/test/opuntia_SUITE.erl b/test/opuntia_SUITE.erl index 2c9016c..dc519c3 100644 --- a/test/opuntia_SUITE.erl +++ b/test/opuntia_SUITE.erl @@ -224,10 +224,13 @@ convert_time_unit(Time, millisecond, second) -> Time / 1000; convert_time_unit(Time, second, microsecond) -> Time * 1000 * 1000; convert_time_unit(Time, second, millisecond) -> Time * 1000. -%% If consuming at maximum speed, timewindow is never filled so we don't need to care for it -should_take_at_least(Consumed, {_TimeWindow, Rate, TimeUnit}, Unit) -> - Expected = Consumed / Rate, - floor(convert_time_unit(Expected, TimeUnit, Unit)). +should_take_at_least(Consumed, {MaximumTokens, Rate, TimeUnit}, Unit) -> + case Consumed - MaximumTokens of + ToThrottle when ToThrottle =< 0 -> 0; + ToThrottle -> + Expected = ToThrottle / Rate, + floor(convert_time_unit(Expected, TimeUnit, Unit)) + end. run_shaper(Shaper, 0) -> Shaper;