herd_reconnect.erl 670 B

12345678910111213141516171819
  1. -module(herd_reconnect).
  2. -export([exp_backoff/3, exp_backoff/4]).
  3. -spec exp_backoff(integer(), integer(), integer()) -> integer().
  4. exp_backoff(Attempt, BaseTimeout, MaxTimeout) ->
  5. exp_backoff(Attempt, 10, BaseTimeout, MaxTimeout).
  6. -spec exp_backoff(integer(), integer(), integer(), integer()) -> integer().
  7. exp_backoff(Attempt, MaxAttempt, _BaseTimeout, MaxTimeout) when Attempt >= MaxAttempt ->
  8. Half = MaxTimeout div 2,
  9. Half + random:uniform(Half);
  10. exp_backoff(Attempt, _MaxAttempt, BaseTimeout, MaxTimeout) ->
  11. Timeout = min(erlang:round(math:pow(2, Attempt) * BaseTimeout), MaxTimeout),
  12. Half = Timeout div 2,
  13. Half + random:uniform(Half).