U
    Œàôgi  ã                   @   sœ   d dl Z d dlmZmZ dZdZG dd„ deƒZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZ	G dd„ deƒZ
G dd„ deƒZG dd„ deƒZdd„ ZdS )é    N)ÚABCÚabstractmethodgü©ñÒMbà?gü©ñÒMb€?c                   @   s,   e Zd ZdZdd„ Zeeedœdd„ƒZdS )ÚAbstractBackoffzBackoff interfacec                 C   s   dS )zœ
        Reset internal state before an operation.
        `reset` is called once at the beginning of
        every call to `Retry.call_with_retry`
        N© ©Úselfr   r   ú1/tmp/pip-unpacked-wheel-f3sx1i9r/redis/backoff.pyÚreset   s    zAbstractBackoff.reset©ÚfailuresÚreturnc                 C   s   dS )z'Compute backoff in seconds upon failureNr   ©r   r   r   r   r   Úcompute   s    zAbstractBackoff.computeN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   ÚintÚfloatr   r   r   r   r   r   
   s   r   c                   @   s0   e Zd ZdZeddœdd„Zeedœdd„ZdS )	ÚConstantBackoffzConstant backoff upon failureN)Úbackoffr   c                 C   s
   || _ dS )z"`backoff`: backoff time in secondsN©Z_backoff)r   r   r   r   r   Ú__init__   s    zConstantBackoff.__init__r
   c                 C   s   | j S ©Nr   r   r   r   r   r   "   s    zConstantBackoff.compute)r   r   r   r   r   r   r   r   r   r   r   r   r      s   r   c                       s&   e Zd ZdZddœ‡ fdd„Z‡  ZS )Ú	NoBackoffzNo backoff upon failureN©r   c                    s   t ƒ  d¡ d S ©Nr   )Úsuperr   r   ©Ú	__class__r   r   r   )   s    zNoBackoff.__init__)r   r   r   r   r   Ú__classcell__r   r   r   r   r   &   s   r   c                   @   s6   e Zd ZdZeefeedœdd„Zeedœdd„Z	dS )	ÚExponentialBackoffz Exponential backoff upon failure)ÚcapÚbasec                 C   s   || _ || _dS ©úe
        `cap`: maximum backoff time in seconds
        `base`: base backoff time in seconds
        N©Ú_capÚ_base©r   r"   r#   r   r   r   r   0   s    zExponentialBackoff.__init__r
   c                 C   s   t | j| jd|  ƒS )Né   )Úminr'   r(   r   r   r   r   r   8   s    zExponentialBackoff.computeN©
r   r   r   r   ÚDEFAULT_CAPÚDEFAULT_BASEr   r   r   r   r   r   r   r   r!   -   s   r!   c                   @   s8   e Zd ZdZeefeeddœdd„Zeedœdd„Z	dS )	ÚFullJitterBackoffz Full jitter backoff upon failureN©r"   r#   r   c                 C   s   || _ || _dS r$   r&   r)   r   r   r   r   ?   s    zFullJitterBackoff.__init__r
   c                 C   s   t  dt| j| jd|  ƒ¡S )Nr   r*   )ÚrandomÚuniformr+   r'   r(   r   r   r   r   r   G   s    zFullJitterBackoff.computer,   r   r   r   r   r/   <   s   r/   c                   @   s8   e Zd ZdZeefeeddœdd„Zeedœdd„Z	dS )	ÚEqualJitterBackoffz!Equal jitter backoff upon failureNr0   c                 C   s   || _ || _dS r$   r&   r)   r   r   r   r   N   s    zEqualJitterBackoff.__init__r
   c                 C   s*   t | j| jd|  ƒd }|t d|¡ S )Nr*   r   )r+   r'   r(   r1   r2   )r   r   Útempr   r   r   r   V   s    zEqualJitterBackoff.computer,   r   r   r   r   r3   K   s   r3   c                   @   sF   e Zd ZdZeefeeddœdd„Zddœdd„Ze	ed	œd
d„Z
dS )ÚDecorrelatedJitterBackoffz(Decorrelated jitter backoff upon failureNr0   c                 C   s   || _ || _d| _dS )r%   r   N)r'   r(   Ú_previous_backoffr)   r   r   r   r   ^   s    z"DecorrelatedJitterBackoff.__init__r   c                 C   s
   d| _ d S r   )r6   r   r   r   r   r	   g   s    zDecorrelatedJitterBackoff.resetr
   c                 C   s4   t | j| jd ƒ}t | j|¡}t| j|ƒ| _| jS )Né   )Úmaxr(   r6   r1   r2   r+   r'   )r   r   Zmax_backoffr4   r   r   r   r   j   s    z!DecorrelatedJitterBackoff.compute)r   r   r   r   r-   r.   r   r   r	   r   r   r   r   r   r   r5   [   s   	r5   c                   C   s   t ƒ S r   )r3   r   r   r   r   Údefault_backoffq   s    r9   )r1   Úabcr   r   r-   r.   r   r   r   r!   r/   r3   r5   r9   r   r   r   r   Ú<module>   s   