Server IP : 13.213.54.232 / Your IP : 216.73.216.72 Web Server : Apache/2.4.52 (Ubuntu) System : Linux ip-172-31-17-110 6.8.0-1029-aws #31~22.04.1-Ubuntu SMP Thu Apr 24 21:16:18 UTC 2025 x86_64 User : www-data ( 33) PHP Version : 7.1.33-67+ubuntu22.04.1+deb.sury.org+1 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /proc/self/root/lib/python3/dist-packages/landscape/lib/ |
Upload File : |
import random class ExponentialBackoff: """ Keeps track of a backoff delay that staggers down and staggers up exponentially. """ def __init__(self, start_delay, max_delay): self._error_count = 0 # A tally of server errors self._start_delay = start_delay self._max_delay = max_delay def decrease(self): """Decreases error count with zero being the lowest""" self._error_count -= 1 self._error_count = max(self._error_count, 0) def increase(self): """Increases error count but not higher than gives the max delay""" if self.get_delay() < self._max_delay: self._error_count += 1 def get_delay(self): """ Calculates the delay using formula that gives this chart. In this specific example start is 5 seconds and max is 60 seconds Count Delay 0 0 1 5 2 10 3 20 4 40 5 60 (max) """ if self._error_count: delay = (2 ** (self._error_count - 1)) * self._start_delay else: delay = 0 return min(int(delay), self._max_delay) def get_random_delay(self, stagger_fraction=0.25): """ Adds randomness to the specified stagger of the delay. For example for a delay of 12 and 25% stagger, it works out to 9 + rand(0,3) """ delay = self.get_delay() non_random_part = delay * (1-stagger_fraction) random_part = delay * stagger_fraction * random.random() return int(non_random_part + random_part)