U
    ¯ªh›  ã                   @   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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-4avdqdik/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                   @   sL   e Zd ZdZeddœdd„Zedœdd„Ze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©Ú_backoff)r   r   r   r   r   Ú__init__   s    zConstantBackoff.__init__©r   c                 C   s   t | jfƒS ©N)Úhashr   r   r   r   r   Ú__hash__"   s    zConstantBackoff.__hash__c                 C   s   t |tƒstS | j|jkS r   )Ú
isinstancer   ÚNotImplementedr   ©r   Úotherr   r   r   Ú__eq__%   s    
zConstantBackoff.__eq__r
   c                 C   s   | j S r   r   r   r   r   r   r   +   s    zConstantBackoff.compute)r   r   r   r   r   r   r   r   Úboolr"   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 failureNr   c                    s   t ƒ  d¡ d S ©Nr   )Úsuperr   r   ©Ú	__class__r   r   r   2   s    zNoBackoff.__init__)r   r   r   r   r   Ú__classcell__r   r   r'   r   r$   /   s   r$   c                   @   sR   e Zd ZdZeefeedœdd„Zedœdd„Z	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   9   s    zExponentialBackoff.__init__r   c                 C   s   t | j| jfƒS r   ©r   r1   r0   r   r   r   r   r   A   s    zExponentialBackoff.__hash__c                 C   s&   t |tƒstS | j|jko$| j|jkS r   )r   r*   r   r1   r0   r    r   r   r   r"   D   s    
zExponentialBackoff.__eq__r
   c                 C   s   t | j| jd|  ƒS ©Né   )Úminr0   r1   r   r   r   r   r   J   s    zExponentialBackoff.computeN©r   r   r   r   ÚDEFAULT_CAPÚDEFAULT_BASEr   r   r   r   r#   r"   r   r   r   r   r   r*   6   s
   r*   c                   @   sT   e Zd ZdZeefeeddœdd„Zedœdd„Z	e
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/   r2   r   r   r   r   Q   s    zFullJitterBackoff.__init__r   c                 C   s   t | j| jfƒS r   r3   r   r   r   r   r   Y   s    zFullJitterBackoff.__hash__c                 C   s&   t |tƒstS | j|jko$| j|jkS r   )r   r:   r   r1   r0   r    r   r   r   r"   \   s    
zFullJitterBackoff.__eq__r
   c                 C   s   t  dt| j| jd|  ƒ¡S )Nr   r5   )ÚrandomÚuniformr6   r0   r1   r   r   r   r   r   b   s    zFullJitterBackoff.computer7   r   r   r   r   r:   N   s
   r:   c                   @   sT   e Zd ZdZeefeeddœdd„Zedœdd„Z	e
dœd	d
„Zeedœdd„ZdS )ÚEqualJitterBackoffz!Equal jitter backoff upon failureNr;   c                 C   s   || _ || _dS r-   r/   r2   r   r   r   r   i   s    zEqualJitterBackoff.__init__r   c                 C   s   t | j| jfƒS r   r3   r   r   r   r   r   q   s    zEqualJitterBackoff.__hash__c                 C   s&   t |tƒstS | j|jko$| j|jkS r   ©r   r>   r   r1   r0   r    r   r   r   r"   t   s    
zEqualJitterBackoff.__eq__r
   c                 C   s*   t | j| jd|  ƒd }|t d|¡ S )Nr5   r   )r6   r0   r1   r<   r=   )r   r   Útempr   r   r   r   z   s    zEqualJitterBackoff.computer7   r   r   r   r   r>   f   s
   r>   c                   @   sb   e Zd ZdZeefeeddœdd„Zedœdd„Z	e
dœd	d
„Zddœdd„Zeedœdd„ZdS )ÚDecorrelatedJitterBackoffz(Decorrelated jitter backoff upon failureNr;   c                 C   s   || _ || _d| _dS )r.   r   N)r0   r1   Ú_previous_backoffr2   r   r   r   r   ‚   s    z"DecorrelatedJitterBackoff.__init__r   c                 C   s   t | j| jfƒS r   r3   r   r   r   r   r   ‹   s    z"DecorrelatedJitterBackoff.__hash__c                 C   s&   t |tƒstS | j|jko$| j|jkS r   )r   rA   r   r1   r0   r    r   r   r   r"   Ž   s    
z DecorrelatedJitterBackoff.__eq__c                 C   s
   d| _ d S r%   )rB   r   r   r   r   r	   ”   s    zDecorrelatedJitterBackoff.resetr
   c                 C   s4   t | j| jd ƒ}t | j|¡}t| j|ƒ| _| jS )Né   )Úmaxr1   rB   r<   r=   r6   r0   )r   r   Zmax_backoffr@   r   r   r   r   —   s    z!DecorrelatedJitterBackoff.compute)r   r   r   r   r8   r9   r   r   r   r   r#   r"   r	   r   r   r   r   r   rA      s   	rA   c                   @   sT   e Zd ZdZeefeeddœdd„Zedœdd„Z	e
dœd	d
„Zeedœdd„ZdS )ÚExponentialWithJitterBackoffz-Exponential backoff upon failure, with jitterNr;   c                 C   s   || _ || _dS r-   r/   r2   r   r   r   r   ¡   s    z%ExponentialWithJitterBackoff.__init__r   c                 C   s   t | j| jfƒS r   r3   r   r   r   r   r   ©   s    z%ExponentialWithJitterBackoff.__hash__c                 C   s&   t |tƒstS | j|jko$| j|jkS r   r?   r    r   r   r   r"   ¬   s    
z#ExponentialWithJitterBackoff.__eq__r
   c                 C   s   t | jt ¡ | j d|  ƒS r4   )r6   r0   r<   r1   r   r   r   r   r   ²   s    z$ExponentialWithJitterBackoff.computer7   r   r   r   r   rE   ž   s
   rE   c                   C   s   t ƒ S r   )r>   r   r   r   r   Údefault_backoff¶   s    rF   )r<   Úabcr   r   r8   r9   r   r   r$   r*   r:   r>   rA   rE   rF   r   r   r   r   Ú<module>   s   