o
    <‘ði3  ã                   @   sœ   d dl Z d dlmZm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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)ÚAsyncDatabaseÚ	Databases)ÚWeightedList)ÚState)Ú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 )ÚAsyncFailoverStrategyÚreturnc                 Ã   ó   �dS )z.Select the database according to the strategy.N© ©Úselfr   r   ú]/root/parts/websockify/install/lib/python3.10/site-packages/redis/asyncio/multidb/failover.pyÚdatabase   ó   €zAsyncFailoverStrategy.databaseÚ	databasesNc                 C   ó   dS )z&Set the database strategy operates on.Nr   ©r   r   r   r   r   Úset_databases   s   z#AsyncFailoverStrategy.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                 Ã   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                   @   s8   e Zd ZdZ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.
    c                 C   s   t ƒ | _d S ©N)r   Ú
_databasesr   r   r   r   Ú__init__:   s   z$WeightBasedFailoverStrategy.__init__r   c                 Ã   s0   �| 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   Nc                 C   s
   || _ d S r&   )r'   r   r   r   r   r   D   s   
z)WeightBasedFailoverStrategy.set_databases)	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              
   Ã   s°   �z| j  ¡ I d H }|  ¡  |W S  tyW } z;| jdkr-t ¡ | j | _|  jd7  _nt ¡ | jkrC|  j| j7  _|  jd7  _| j| jkrO|  ¡  |‚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._reset)r   N)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.asyncio.multidb.databaser   r   Úredis.data_structurer   Úredis.multidb.circuitr   r+   Úredis.multidb.exceptionr   r	   r<   r=   r   r   r%   r/   r   r   r   r   Ú<module>   s    