in scripts/util.py [0:0]
def backoff_delay(start, timeout=None, ratio=None, count: int = 0):
"""generates `count` waits starting at `start`
sum of waits is `timeout` or each one is `ratio` bigger than the last
the last wait is always 0"""
# timeout or ratio must be set but not both
assert (timeout is None) ^ (ratio is None)
assert ratio is None or ratio > 0
assert timeout is None or timeout >= start
assert (count > 1 or timeout is not None) and isinstance(count, int)
assert start > 0
if count == 0:
# Equation for auto-count is tuned to have a max of
# ~int(timeout) counts with a start wait of <0.01.
# Increasing start wait decreases count eg.
# backoff_delay(10, timeout=60) -> count = 5
count = int(
(timeout / ((start + 0.05) ** (1 / 2)) + 2) // math.log(timeout + 2)
)
yield start
# if ratio is set:
# timeout = start * (1 - ratio**(count - 1)) / (1 - ratio)
if ratio is None:
ratio = find_ratio(start, count - 1, timeout)
wait = start
# we have start and 0, so we only need to generate count - 2
for _ in range(count - 2):
wait *= ratio
yield wait
yield 0
return