
    h3                         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
e          Z G d de          Z G d de          Z G d de          ZdS )    N)ABCabstractmethod)AsyncDatabase	Databases)WeightedList)State)NoValidDatabaseExceptionTemporaryUnavailableException
      c                   J    e Zd Zedefd            Zededdfd            ZdS )AsyncFailoverStrategyreturnc                 
   K   dS )z.Select the database according to the strategy.N selfs    ^/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/redis/asyncio/multidb/failover.pydatabasezAsyncFailoverStrategy.database          	    	databasesNc                     dS )z&Set the database strategy operates on.Nr   r   r   s     r   set_databasesz#AsyncFailoverStrategy.set_databases   s	     	r   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r      sg            ^ y T    ^  r   r   c                       e Zd Zeedefd                        Zeedefd                        Zeede	fd                        Z
edefd            ZdS )FailoverStrategyExecutorr   c                     dS )z The number of failover attempts.Nr   r   s    r   failover_attemptsz*FailoverStrategyExecutor.failover_attempts   	     	r   c                     dS )z$The delay between failover attempts.Nr   r   s    r   failover_delayz'FailoverStrategyExecutor.failover_delay#   r#   r   c                     dS )zThe strategy to execute.Nr   r   s    r   strategyz!FailoverStrategyExecutor.strategy)   r#   r   c                 
   K   dS )zExecute the failover strategy.Nr   r   s    r   executez FailoverStrategyExecutor.execute/   r   r   N)r   r   r   propertyr   intr"   floatr%   r   r'   r   r)   r   r   r   r    r       s        3    ^ X     ^ X /    ^ X }    ^  r   r    c                   4    e Zd ZdZd ZdefdZdeddfdZdS )WeightBasedFailoverStrategyz6
    Failover strategy based on database weights.
    c                 ,    t                      | _        d S N)r   
_databasesr   s    r   __init__z$WeightBasedFailoverStrategy.__init__:   s    &..r   r   c                 z   K   | j         D ]#\  }}|j        j        t          j        k    r|c S $t          d          )Nz-No valid database available for communication)r1   circuitstateCBStateCLOSEDr	   )r   r   _s      r   r   z$WeightBasedFailoverStrategy.database=   sM      ? 	  	 KHa%77 8 ''VWWWr   r   Nc                     || _         d S r0   )r1   r   s     r   r   z)WeightBasedFailoverStrategy.set_databasesD   s    #r   )	r   r   r   __doc__r2   r   r   r   r   r   r   r   r.   r.   5   so         ) ) )X X X X X$y $T $ $ $ $ $ $r   r.   c                       e Zd ZdZeefdededefdZ	e
defd            Ze
defd            Ze
defd	            Zdefd
ZddZdS )DefaultFailoverStrategyExecutorz+
    Executes given failover strategy.
    r'   r"   r%   c                 L    || _         || _        || _        d| _        d| _        d S Nr   )	_strategy_failover_attempts_failover_delay_next_attempt_ts_failover_counter)r   r'   r"   r%   s       r   r2   z(DefaultFailoverStrategyExecutor.__init__M   s1     ""3-%&&'r   r   c                     | j         S r0   )r@   r   s    r   r"   z1DefaultFailoverStrategyExecutor.failover_attemptsY   s    &&r   c                     | j         S r0   )rA   r   s    r   r%   z.DefaultFailoverStrategyExecutor.failover_delay]   s    ##r   c                     | j         S r0   )r?   r   s    r   r'   z(DefaultFailoverStrategyExecutor.strategya   s
    ~r   c                   K   	 | j                                          d {V }|                                  |S # t          $ r}| j        dk    r1t          j                    | j        z   | _        | xj        dz  c_        nAt          j                    | j        k    r%| xj        | j        z  c_        | xj        dz  c_        | j        | j        k    r|                                  |t          d          d }~ww xY w)Nr      zhNo database connections currently available. This is a temporary condition - please retry the operation.)
r?   r   _resetr	   rB   timerA   rC   r@   r
   )r   r   es      r   r)   z'DefaultFailoverStrategyExecutor.executee   s     	!^4466666666HKKMMMO' 	 	 	$))(,	d6J(J%&&!+&&& 555%%)==%%&&!+&&%(???3R  	s   49 
C:B2C55C:Nc                 "    d| _         d| _        d S r>   )rB   rC   r   s    r   rI   z&DefaultFailoverStrategyExecutor._reset{   s     !!"r   )r   N)r   r   r   r:   DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYr   r+   r,   r2   r*   r"   r%   r'   r   r)   rI   r   r   r   r<   r<   H   s          "; 6	
( 
('
( 
( 	
( 
( 
( 
( '3 ' ' ' X' $ $ $ $ X$ /    X}    ,# # # # # #r   r<   )rJ   abcr   r   redis.asyncio.multidb.databaser   r   redis.data_structurer   redis.multidb.circuitr   r6   redis.multidb.exceptionr	   r
   rM   rN   r   r    r.   r<   r   r   r   <module>rT      sL    # # # # # # # # C C C C C C C C - - - - - - 2 2 2 2 2 2       
   	 	 	 	 	C 	 	 	    s   2$ $ $ $ $"7 $ $ $&5# 5# 5# 5# 5#&> 5# 5# 5# 5# 5#r   