Current section
Files
Jump to
Current section
Files
lib/codex/thread/backoff.ex
defmodule Codex.Thread.Backoff do
@moduledoc false
import Bitwise
@base_delay_ms 100
@max_backoff_ms 5_000
@max_exponent 20
@spec delay_ms(integer()) :: non_neg_integer()
def delay_ms(attempt) when is_integer(attempt) and attempt >= 1 do
exponent = min(attempt - 1, @max_exponent)
delay = @base_delay_ms * (1 <<< exponent)
min(delay, @max_backoff_ms)
end
def delay_ms(_attempt), do: 0
@spec sleep(integer()) :: :ok
def sleep(attempt) do
delay = delay_ms(attempt)
if delay > 0 do
Process.sleep(delay)
end
:ok
end
end