o c@sddlZGdddZdS)Nc@s:eZdZdZddZddZddZdd Zdd d Zd S)ExponentialBackoffz^ Keeps track of a backoff delay that staggers down and staggers up exponentially. cCsd|_||_||_dS)Nr) _error_count _start_delay _max_delay)self start_delay max_delayr 7/usr/lib/python3/dist-packages/landscape/lib/backoff.py__init__ s zExponentialBackoff.__init__cCs |jd8_t|jd|_dS)z0Decreases error count with zero being the lowestrN)rmaxrr r r decreaseszExponentialBackoff.decreasecCs$||jkr|jd7_dSdS)z=Increases error count but not higher than gives the max delayr N) get_delayrrrr r r increaseszExponentialBackoff.increasecCs0|jrd|jd|j}nd}tt||jS)aR 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) r r)rrminintr)rdelayr r r rs zExponentialBackoff.get_delay?cCs0|}|d|}||t}t||S)z 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) r )rrandomr)rstagger_fractionrnon_random_part random_partr r r get_random_delay-s  z#ExponentialBackoff.get_random_delayN)r) __name__ __module__ __qualname____doc__r rrrrr r r r rsr)rrr r r r s