
    ,i3                         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y)    N)ABCabstractmethod)AsyncDatabase	Databases)WeightedList)State)NoValidDatabaseExceptionTemporaryUnavailableException
      c                   <    e Zd Zedefd       Zededdfd       Zy)AsyncFailoverStrategyreturnc                    K   yw)z.Select the database according to the strategy.N selfs    c/var/www/html/langgraph-service/venv/lib/python3.12/site-packages/redis/asyncio/multidb/failover.pydatabasezAsyncFailoverStrategy.database         	   	databasesNc                      y)z&Set the database strategy operates on.Nr   r   r   s     r   set_databasesz#AsyncFailoverStrategy.set_databases   s     	    )__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                    K   yw)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                   2    e Zd ZdZd ZdefdZdeddfdZy)WeightBasedFailoverStrategyz6
    Failover strategy based on database weights.
    c                 "    t               | _        y N)r   
_databasesr   s    r   __init__z$WeightBasedFailoverStrategy.__init__:   s    &.r   r   c                    K   | j                   D ]0  \  }}|j                  j                  t        j                  k(  s.|c S  t        d      w)Nz-No valid database available for communication)r2   circuitstateCBStateCLOSEDr	   )r   r   _s      r   r   z$WeightBasedFailoverStrategy.database=   sH     ?? 	 KHa%%7	  ''VWWs
   :AAr   Nc                     || _         y r1   )r2   r   s     r   r   z)WeightBasedFailoverStrategy.set_databasesD   s	    #r   )	r   r   r   __doc__r3   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   r3   z(DefaultFailoverStrategyExecutor.__init__M   s+     ""3-%&&'r   r   c                     | j                   S r1   )rA   r   s    r   r#   z1DefaultFailoverStrategyExecutor.failover_attemptsY   s    &&&r   c                     | j                   S r1   )rB   r   s    r   r&   z.DefaultFailoverStrategyExecutor.failover_delay]   s    ###r   c                     | j                   S r1   )r@   r   s    r   r(   z(DefaultFailoverStrategyExecutor.strategya   s    ~~r   c                 F  K   	 | j                   j                          d {   }| j                          |S 7 # 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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     	!^^4466HKKMO 7 ( 	$$)(,		d6J6J(J%&&!+& 5 55%%)=)==%&&!+&%%(?(??3R 	s2   D!: 8: D!: 	DCDDD!Nc                      d| _         d| _        y r?   )rC   rD   r   s    r   rJ   z&DefaultFailoverStrategyExecutor._reset{   s     !!"r   )r   N)r   r   r   r;   DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYr   r,   r-   r3   r+   r#   r&   r(   r   r*   rJ   r   r   r   r=   r=   H   s     "; 6	
('
( 
( 	
( '3 ' ' $ $ $ /  } ,#r   r=   )rK   abcr   r   redis.asyncio.multidb.databaser   r   redis.data_structurer   redis.multidb.circuitr   r7   redis.multidb.exceptionr	   r
   rN   rO   r   r!   r/   r=   r   r   r   <module>rU      sY     # C - 2
   	C 	s 2$"7 $&5#&> 5#r   