
    ph                         S SK r S SKJrJr  S SKJr  S SKJr  S SK	J
r
Jr  S SKJrJr  SrSr " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      rg)    N)ABCabstractmethod)WeightedList)State)	DatabasesSyncDatabase)NoValidDatabaseExceptionTemporaryUnavailableException
      c                   H    \ rS rSr\S\4S j5       r\S\SS4S j5       rSr	g)FailoverStrategy   returnc                     g)z.Select the database according to the strategy.N selfs    P/home/james-whalen/.local/lib/python3.13/site-packages/redis/multidb/failover.pydatabaseFailoverStrategy.database        	    	databasesNc                     g)z&Set the database strategy operates on.Nr   r   r   s     r   set_databasesFailoverStrategy.set_databases   r   r   r   )
__name__
__module____qualname____firstlineno__r   r   r   r   r   __static_attributes__r   r   r   r   r      s=    ,   y T  r   r   c                       \ rS rSr\\S\4S j5       5       r\\S\4S j5       5       r	\\S\
4S j5       5       r\S\4S j5       rSrg)	FailoverStrategyExecutor   r   c                     g)z The number of failover attempts.Nr   r   s    r   failover_attempts*FailoverStrategyExecutor.failover_attempts        	r   c                     g)z$The delay between failover attempts.Nr   r   s    r   failover_delay'FailoverStrategyExecutor.failover_delay#   r*   r   c                     g)zThe strategy to execute.Nr   r   s    r   strategy!FailoverStrategyExecutor.strategy)   r*   r   c                     g)zExecute the failover strategy.Nr   r   s    r   execute FailoverStrategyExecutor.execute/   r   r   r   N)r   r    r!   r"   propertyr   intr(   floatr,   r   r/   r   r2   r#   r   r   r   r%   r%      s    3        *      r   r%   c                   B    \ rS rSrSrS
S jrS\4S jrS\SS4S jr	S	r
g)WeightBasedFailoverStrategy5   z.
Failover strategy based on database weights.
r   Nc                 "    [        5       U l        g N)r   
_databasesr   s    r   __init__$WeightBasedFailoverStrategy.__init__:   s    &.r   c                     U R                    H1  u  pUR                  R                  [        R                  :X  d  M/  Us  $    [        S5      e)Nz-No valid database available for communication)r<   circuitstateCBStateCLOSEDr	   )r   r   _s      r   r   $WeightBasedFailoverStrategy.database=   s=    ??KH%%7 + ''VWWr   r   c                     Xl         g r;   r<   r   s     r   r   )WeightBasedFailoverStrategy.set_databasesD   s    #r   rG   r   N)r   r    r!   r"   __doc__r=   r   r   r   r   r#   r   r   r   r8   r8   5   s-    )X, X$y $T $r   r8   c                       \ rS rSrSr\\4S\S\S\	4S jjr
\S\4S j5       r\S\	4S	 j5       r\S\4S
 j5       rS\4S jrSS jrSrg)DefaultFailoverStrategyExecutorH   z#
Executes given failover strategy.
r/   r(   r,   c                 D    Xl         X l        X0l        SU l        SU l        g Nr   )	_strategy_failover_attempts_failover_delay_next_attempt_ts_failover_counter)r   r/   r(   r,   s       r   r=   (DefaultFailoverStrategyExecutor.__init__M   s%     ""3-%&&'r   r   c                     U R                   $ r;   )rQ   r   s    r   r(   1DefaultFailoverStrategyExecutor.failover_attemptsY   s    &&&r   c                     U R                   $ r;   )rR   r   s    r   r,   .DefaultFailoverStrategyExecutor.failover_delay]   s    ###r   c                     U R                   $ r;   )rP   r   s    r   r/   (DefaultFailoverStrategyExecutor.strategya   s    ~~r   c                 6    U R                   R                  5       nU R                  5         U$ ! [         a  nU R                  S:X  a=  [
        R
                  " 5       U R                  -   U l        U =R                  S-  sl        OW[
        R
                  " 5       U R                  :  a4  U =R                  U R                  -  sl        U =R                  S-  sl        U R                  U R                  :  a  U R                  5         Ue[        S5      eS nAff = f)Nr      zhNo database connections currently available. This is a temporary condition - please retry the operation.)
rP   r   _resetr	   rS   timerR   rT   rQ   r
   )r   r   es      r   r2   'DefaultFailoverStrategyExecutor.executee   s    	~~..0HKKMO' 	$$)(,		d6J6J(J%&&!+& 5 55%%)=)==%&&!+&%%(?(??3R 	s   +. 
DCDDNc                      SU l         SU l        g rO   )rS   rT   r   s    r   r^   &DefaultFailoverStrategyExecutor._reset{   s     !!"r   )rQ   rT   rR   rS   rP   rI   )r   r    r!   r"   rJ   DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYr   r5   r6   r=   r4   r(   r,   r/   r   r2   r^   r#   r   r   r   rL   rL   H   s     "; 6	
("
( 
( 	
( '3 ' ' $ $ $ *   ,#r   rL   )r_   abcr   r   redis.data_structurer   redis.multidb.circuitr   rB   redis.multidb.databaser   r   redis.multidb.exceptionr	   r
   rd   re   r   r%   r8   rL   r   r   r   <module>rk      sY     # - 2 :
   	s 	s 2$"2 $&5#&> 5#r   