Source code for swh.objstorage.backends.winery.sleep
# Copyright (C) 2023 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
import logging
import time
from typing import Callable
logger = logging.getLogger(__name__)
[docs]
def sleep_exponential(
min_duration: float, factor: float, max_duration: float, message: str
) -> Callable[[int], None]:
"""Return a function that returns a callback that sleeps `min_duration`,
then increases that by `factor` at every call, up to `max_duration`."""
if min(min_duration, max_duration) <= 0:
raise ValueError("Cannot sleep for a negative amount of time")
def sleep(attempt: int):
duration = min(max_duration, min_duration * factor**attempt)
logger.debug("%s. Waiting for %s", message, duration)
time.sleep(duration)
return sleep