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   R/home/ubuntu/.local/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    