o
    ¾¿i÷  ã                   @   sœ   d dl Z d dlmZmZ d dlmZ d dlmZ d dl	m
Z
m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dS )é    N)ÚABCÚabstractmethod)ÚWeightedList)ÚState)Ú	DatabasesÚSyncDatabase)ÚNoValidDatabaseExceptionÚTemporaryUnavailableExceptioné
   é   c                   @   s4   e Zd Zedefdd„ƒZededdfdd„ƒZdS )ÚFailoverStrategyÚreturnc                 C   ó   dS )z.Select the database according to the strategy.N© ©Úselfr   r   úJ/home/ubuntu/.local/lib/python3.10/site-packages/redis/multidb/failover.pyÚdatabase   ó   zFailoverStrategy.databaseÚ	databasesNc                 C   r   )z&Set the database strategy operates on.Nr   ©r   r   r   r   r   Úset_databases   r   zFailoverStrategy.set_databases)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r      s
    r   c                   @   s`   e Zd Zeedefdd„ƒƒZeedefdd„ƒƒZeede	fdd„ƒƒZ
edefdd	„ƒZd
S )ÚFailoverStrategyExecutorr   c                 C   r   )z The number of failover attempts.Nr   r   r   r   r   Úfailover_attempts   ó   z*FailoverStrategyExecutor.failover_attemptsc                 C   r   )z$The delay between failover attempts.Nr   r   r   r   r   Úfailover_delay#   r   z'FailoverStrategyExecutor.failover_delayc                 C   r   )zThe strategy to execute.Nr   r   r   r   r   Ústrategy)   r   z!FailoverStrategyExecutor.strategyc                 C   r   )zExecute the failover strategy.Nr   r   r   r   r   Úexecute/   r   z FailoverStrategyExecutor.executeN)r   r   r   Úpropertyr   Úintr   Úfloatr   r   r   r   r    r   r   r   r   r      s    r   c                   @   s:   e Zd ZdZddd„Zdefdd„Zdeddfd	d
„ZdS )ÚWeightBasedFailoverStrategyz6
    Failover strategy based on database weights.
    r   Nc                 C   s   t ƒ | _d S ©N)r   Ú
_databasesr   r   r   r   Ú__init__:   s   z$WeightBasedFailoverStrategy.__init__c                 C   s.   | j D ]\}}|jjtjkr|  S qtdƒ‚)Nz-No valid database available for communication)r&   ÚcircuitÚstateÚCBStateÚCLOSEDr   )r   r   Ú_r   r   r   r   =   s
   ÿz$WeightBasedFailoverStrategy.databaser   c                 C   s
   || _ d S r%   )r&   r   r   r   r   r   D   s   
z)WeightBasedFailoverStrategy.set_databases©r   N)	r   r   r   Ú__doc__r'   r   r   r   r   r   r   r   r   r$   5   s
    
r$   c                   @   sz   e Zd ZdZeefdededefdd„Z	e
defdd	„ƒZe
defd
d„ƒZe
defdd„ƒZdefdd„Zddd„ZdS )ÚDefaultFailoverStrategyExecutorz+
    Executes given failover strategy.
    r   r   r   c                 C   s"   || _ || _|| _d| _d| _d S ©Nr   )Ú	_strategyÚ_failover_attemptsÚ_failover_delayÚ_next_attempt_tsÚ_failover_counter)r   r   r   r   r   r   r   r'   M   s
   
z(DefaultFailoverStrategyExecutor.__init__r   c                 C   ó   | j S r%   )r2   r   r   r   r   r   Y   ó   z1DefaultFailoverStrategyExecutor.failover_attemptsc                 C   r6   r%   )r3   r   r   r   r   r   ]   r7   z.DefaultFailoverStrategyExecutor.failover_delayc                 C   r6   r%   )r1   r   r   r   r   r   a   r7   z(DefaultFailoverStrategyExecutor.strategyc              
   C   s¨   z| j  ¡ }|  ¡  |W S  tyS } z;| jdkr)t ¡ | j | _|  jd7  _nt ¡ | jkr?|  j| j7  _|  jd7  _| j| jkrK|  ¡  |‚t	dƒ‚d }~ww )Nr   é   zhNo database connections currently available. This is a temporary condition - please retry the operation.)
r1   r   Ú_resetr   r4   Útimer3   r5   r2   r	   )r   r   Úer   r   r   r    e   s&   

ÿ€ôz'DefaultFailoverStrategyExecutor.executeNc                 C   s   d| _ d| _d S r0   )r4   r5   r   r   r   r   r9   {   s   
z&DefaultFailoverStrategyExecutor._resetr-   )r   r   r   r.   ÚDEFAULT_FAILOVER_ATTEMPTSÚDEFAULT_FAILOVER_DELAYr   r"   r#   r'   r!   r   r   r   r   r    r9   r   r   r   r   r/   H   s&    üþý
ür/   )r:   Úabcr   r   Úredis.data_structurer   Úredis.multidb.circuitr   r*   Úredis.multidb.databaser   r   Úredis.multidb.exceptionr   r	   r<   r=   r   r   r$   r/   r   r   r   r   Ú<module>   s    