
    Oǻi                         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
e      Z G d de      Z G d de      Z G d de      Zy)    N)ABCabstractmethod)WeightedList)State)	DatabasesSyncDatabase)NoValidDatabaseExceptionTemporaryUnavailableException
      c                   <    e Zd Zedefd       Zededdfd       Zy)FailoverStrategyreturnc                      y)z.Select the database according to the strategy.N selfs    T/opt/lhia/marcimex/agent/venv/lib/python3.12/site-packages/redis/multidb/failover.pydatabasezFailoverStrategy.database        	    	databasesNc                      y)z&Set the database strategy operates on.Nr   r   r   s     r   set_databaseszFailoverStrategy.set_databases   r   r   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r      s=    ,   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y)FailoverStrategyExecutorr   c                      y)z The number of failover attempts.Nr   r   s    r   failover_attemptsz*FailoverStrategyExecutor.failover_attempts        	r   c                      y)z$The delay between failover attempts.Nr   r   s    r   failover_delayz'FailoverStrategyExecutor.failover_delay#   r#   r   c                      y)zThe strategy to execute.Nr   r   s    r   strategyz!FailoverStrategyExecutor.strategy)   r#   r   c                      y)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        *      r   r    c                   4    e Zd ZdZddZdefdZdeddfdZy)	WeightBasedFailoverStrategyz6
    Failover strategy based on database weights.
    r   Nc                 "    t               | _        y N)r   
_databasesr   s    r   __init__z$WeightBasedFailoverStrategy.__init__:   s    &.r   c                     | j                   D ]0  \  }}|j                  j                  t        j                  k(  s.|c S  t        d      )Nz-No valid database available for communication)r1   circuitstateCBStateCLOSEDr	   )r   r   _s      r   r   z$WeightBasedFailoverStrategy.database=   sD    ?? 	 KHa%%7	  ''VWWr   r   c                     || _         y r0   )r1   r   s     r   r   z)WeightBasedFailoverStrategy.set_databasesD   s	    #r   r   N)	r   r   r   __doc__r2   r   r   r   r   r   r   r   r.   r.   5   s-    )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y)DefaultFailoverStrategyExecutorz+
    Executes given failover strategy.
    r'   r"   r%   c                 J    || _         || _        || _        d| _        d| _        y Nr   )	_strategy_failover_attempts_failover_delay_next_attempt_ts_failover_counter)r   r'   r"   r%   s       r   r2   z(DefaultFailoverStrategyExecutor.__init__M   s+     ""3-%&&'r   r   c                     | j                   S r0   )rA   r   s    r   r"   z1DefaultFailoverStrategyExecutor.failover_attemptsY   s    &&&r   c                     | j                   S r0   )rB   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                 *   	 | j                   j                         }| j                          |S # t        $ r}| j                  dk(  r<t        j
                         | j                  z   | _        | xj                  dz  c_        nUt        j
                         | j                  k\  r4| xj                  | j                  z  c_        | xj                  dz  c_        | j                  | j                  kD  r| j                          |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	   rC   timerB   rD   rA   r
   )r   r   es      r   r)   z'DefaultFailoverStrategyExecutor.executee   s    	~~..0HKKMO' 	$$)(,		d6J6J(J%&&!+& 5 55%%)=)==%&&!+&%%(?(??3R 	s   +. 	DCDDNc                      d| _         d| _        y r?   )rC   rD   r   s    r   rJ   z&DefaultFailoverStrategyExecutor._reset{   s     !!"r   r:   )r   r   r   r;   DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYr   r+   r,   r2   r*   r"   r%   r'   r   r)   rJ   r   r   r   r=   r=   H   s     "; 6	
("
( 
( 	
( '3 ' ' $ $ $ *   ,#r   r=   )rK   abcr   r   redis.data_structurer   redis.multidb.circuitr   r6   redis.multidb.databaser   r   redis.multidb.exceptionr	   r
   rN   rO   r   r    r.   r=   r   r   r   <module>rU      sY     # - 2 :
   	s 	s 2$"2 $&5#&> 5#r   