
    ph3                         S SK r S SKJrJ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rSr " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      rg)    N)ABCabstractmethod)AsyncDatabase	Databases)WeightedList)State)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)AsyncFailoverStrategy   returnc                    #    g7f)z.Select the database according to the strategy.N selfs    X/home/james-whalen/.local/lib/python3.13/site-packages/redis/asyncio/multidb/failover.pydatabaseAsyncFailoverStrategy.database   
      	   	databasesNc                     g)z&Set the database strategy operates on.Nr   r   r   s     r   set_databases#AsyncFailoverStrategy.set_databases   s     	    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7f)zExecute the failover strategy.Nr   r   s    r   execute FailoverStrategyExecutor.execute/   r   r   r   N)r    r!   r"   r#   propertyr   intr)   floatr-   r   r0   r   r3   r$   r   r   r   r&   r&      s    3        /    }  r   r&   c                   >    \ rS rSrSrS rS\4S jrS\SS4S jr	S	r
g)
WeightBasedFailoverStrategy5   z.
Failover strategy based on database weights.
c                 "    [        5       U l        g N)r   
_databasesr   s    r   __init__$WeightBasedFailoverStrategy.__init__:   s    &.r   r   c                    #    U R                    H1  u  pUR                  R                  [        R                  :X  d  M/  Us  $    [        S5      e7f)Nz-No valid database available for communication)r=   circuitstateCBStateCLOSEDr	   )r   r   _s      r   r   $WeightBasedFailoverStrategy.database=   s@     ??KH%%7 + ''VWWs
   8AAr   Nc                     Xl         g r<   r=   r   s     r   r   )WeightBasedFailoverStrategy.set_databasesD   s    #r   rH   )r    r!   r"   r#   __doc__r>   r   r   r   r   r$   r   r   r   r9   r9   5   s-    )X X$y $T $r   r9   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.
r0   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   r0   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   r0   (DefaultFailoverStrategyExecutor.strategya   s    ~~r   c                 R  #     U R                   R                  5       I S h  vN nU R                  5         U$  N! [         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7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   r3   'DefaultFailoverStrategyExecutor.executee   s     	!^^4466HKKMO 7 ( 	$$)(,		d6J6J(J%&&!+& 5 55%%)=)==%&&!+&%%(?(??3R 	s2   D': 8: D': 
D$CD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   )r   N)r    r!   r"   r#   rJ   DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYr   r6   r7   r>   r5   r)   r-   r0   r   r3   r^   r$   r   r   r   rL   rL   H   s     "; 6	
('
( 
( 	
( '3 ' ' $ $ $ /  } ,#r   rL   )r_   abcr   r   redis.asyncio.multidb.databaser   r   redis.data_structurer   redis.multidb.circuitr   rC   redis.multidb.exceptionr	   r
   rd   re   r   r&   r9   rL   r   r   r   <module>rk      sY     # C - 2
   	C 	s 2$"7 $&5#&> 5#r   