U
    ‰do
  ã                   @   sŒ   d dl Z d dlmZm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S )é    N)ÚABCÚabstractmethodc                   @   s$   e Zd ZdZdd„ Ze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-f5h5_hbx/redis/backoff.pyÚreset   s    zAbstractBackoff.resetc                 C   s   dS )z'Compute backoff in seconds upon failureNr   ©r   Úfailuresr   r   r   Úcompute   s    zAbstractBackoff.computeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚConstantBackoffzConstant backoff upon failurec                 C   s
   || _ dS )z"`backoff`: backoff time in secondsN©Z_backoff)r   Úbackoffr   r   r   Ú__init__   s    zConstantBackoff.__init__c                 C   s   | j S )Nr   r
   r   r   r   r      s    zConstantBackoff.computeN©r   r   r   r   r   r   r   r   r   r   r      s   r   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú	NoBackoffzNo backoff upon failurec                    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                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚExponentialBackoffz Exponential backoff upon failurec                 C   s   || _ || _dS ©úe
        `cap`: maximum backoff time in seconds
        `base`: base backoff time in seconds
        N©Ú_capÚ_base©r   ÚcapÚbaser   r   r   r   +   s    zExponentialBackoff.__init__c                 C   s   t | j| jd|  ƒS )Né   )Úminr    r!   r
   r   r   r   r   3   s    zExponentialBackoff.computeNr   r   r   r   r   r   (   s   r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚFullJitterBackoffz Full jitter backoff upon failurec                 C   s   || _ || _dS r   r   r"   r   r   r   r   :   s    zFullJitterBackoff.__init__c                 C   s   t  dt| j| jd|  ƒ¡S )Nr   r%   )ÚrandomÚuniformr&   r    r!   r
   r   r   r   r   B   s    zFullJitterBackoff.computeNr   r   r   r   r   r'   7   s   r'   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚEqualJitterBackoffz!Equal jitter backoff upon failurec                 C   s   || _ || _dS r   r   r"   r   r   r   r   I   s    zEqualJitterBackoff.__init__c                 C   s*   t | j| jd|  ƒd }|t d|¡ S )Nr%   r   )r&   r    r!   r(   r)   )r   r   Útempr   r   r   r   Q   s    zEqualJitterBackoff.computeNr   r   r   r   r   r*   F   s   r*   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚDecorrelatedJitterBackoffz(Decorrelated jitter backoff upon failurec                 C   s   || _ || _d| _dS )r   r   N)r    r!   Ú_previous_backoffr"   r   r   r   r   Y   s    z"DecorrelatedJitterBackoff.__init__c                 C   s
   d| _ d S r   )r-   r   r   r   r   r	   b   s    zDecorrelatedJitterBackoff.resetc                 C   s4   t | j| jd ƒ}t | j|¡}t| j|ƒ| _| jS )Né   )Úmaxr!   r-   r(   r)   r&   r    )r   r   Zmax_backoffr+   r   r   r   r   e   s    z!DecorrelatedJitterBackoff.computeN)r   r   r   r   r   r	   r   r   r   r   r   r,   V   s   	r,   )r(   Úabcr   r   r   r   r   r   r'   r*   r,   r   r   r   r   Ú<module>   s   