
    ,i"                     T   d dl mZmZ d dlmZmZmZmZ d dlZd dl	m
Z
mZmZ d dlmZmZ d dlmZmZmZmZ d dlmZmZ d dlmZmZmZmZmZmZmZ d d	l m!Z! d d
l"m#Z#m$Z$ d dl%m&Z& d dl'm(Z(m)Z) d dl*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2 dZ3de)fdZ4e G d d             Z5e G d d             Z6y)    )	dataclassfield)ListOptionalTypeUnionN)ConnectionPoolRedisRedisCluster)Database	Databases)DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYAsyncFailoverStrategyWeightBasedFailoverStrategy)AsyncFailureDetectorFailureDetectorAsyncWrapper)DEFAULT_HEALTH_CHECK_DELAYDEFAULT_HEALTH_CHECK_INTERVALDEFAULT_HEALTH_CHECK_POLICYDEFAULT_HEALTH_CHECK_PROBESHealthCheckHealthCheckPoliciesPingHealthCheck)Retry)ExponentialWithJitterBackoff	NoBackoff)WeightedList)EventDispatcherEventDispatcherInterface)DEFAULT_GRACE_PERIODCircuitBreakerPBCircuitBreakerAdapter)DEFAULT_FAILURE_RATE_THRESHOLD!DEFAULT_FAILURES_DETECTION_WINDOWDEFAULT_MIN_NUM_FAILURESCommandFailureDetectorx   returnc                      t               S N)r        a/var/www/html/langgraph-service/venv/lib/python3.12/site-packages/redis/asyncio/multidb/config.pydefault_event_dispatcherr/   .   s    r-   c                       e Zd ZU dZdZeed<    ee      Z	eed<   dZ
ee   ed<   dZee   ed<   dZee   ed	<   eZeed
<   dZee   ed<   defdZy)DatabaseConfiga  
    Dataclass representing the configuration for a database connection.

    This class is used to store configuration settings for a database connection,
    including client options, connection sourcing details, circuit breaker settings,
    and cluster-specific properties. It provides a structure for defining these
    attributes and allows for the creation of customized configurations for various
    database setups.

    Attributes:
        weight (float): Weight of the database to define the active one.
        client_kwargs (dict): Additional parameters for the database client connection.
        from_url (Optional[str]): Redis URL way of connecting to the database.
        from_pool (Optional[ConnectionPool]): A pre-configured connection pool to use.
        circuit (Optional[CircuitBreaker]): Custom circuit breaker implementation.
        grace_period (float): Grace period after which we need to check if the circuit could be closed again.
        health_check_url (Optional[str]): URL for health checks. Cluster FQDN is typically used
            on public Redis Enterprise endpoints.

    Methods:
        default_circuit_breaker:
            Generates and returns a default CircuitBreaker instance adapted for use.
    g      ?weightdefault_factoryclient_kwargsNfrom_url	from_poolcircuitgrace_periodhealth_check_urlr)   c                 X    t        j                  | j                        }t        |      S )N)reset_timeout)	pybreakerr"   r9   r#   )selfcircuit_breakers     r.   default_circuit_breakerz&DatabaseConfig.default_circuit_breakerT   s#    #22ARARS&77r-   )__name__
__module____qualname____doc__r2   float__annotations__r   dictr5   r6   r   strr7   r	   r8   r"   r!   r9   r:   r@   r,   r-   r.   r1   r1   2   ss    0 FE5M45"Hhsm"*.Ix'.(,GXn%,.L%.&*hsm*8 8r-   r1   c                      e Zd ZU dZee   ed<   eZe	e
eef      ed<    e edd      d      Zeed	<   d
Zeee      ed<   eZeed<   eZeed<   eZeed<   d
Zeee      ed<   eZeed<   eZeed<   e Z!eed<   e"Z#e$ed<   d
Z%ee&   ed<   e'Z(eed<   e)Z*eed<   e+Z,eed<    e-e.      Z/e0ed<   de1fdZ2dee   fdZ3dee   fdZ4de&fdZ5y
)MultiDbConfigaw  
    Configuration class for managing multiple database connections in a resilient and fail-safe manner.

    Attributes:
        databases_config: A list of database configurations.
        client_class: The client class used to manage database connections.
        command_retry: Retry strategy for executing database commands.
        failure_detectors: Optional list of additional failure detectors for monitoring database failures.
        min_num_failures: Minimal count of failures required for failover
        failure_rate_threshold: Percentage of failures required for failover
        failures_detection_window: Time interval for tracking database failures.
        health_checks: Optional list of additional health checks performed on databases.
        health_check_interval: Time interval for executing health checks.
        health_check_probes: Number of attempts to evaluate the health of a database.
        health_check_delay: Delay between health check attempts.
        failover_strategy: Optional strategy for handling database failover scenarios.
        failover_attempts: Number of retries allowed for failover operations.
        failover_delay: Delay between failover attempts.
        auto_fallback_interval: Time interval to trigger automatic fallback.
        event_dispatcher: Interface for dispatching events related to database operations.

    Methods:
        databases:
            Retrieves a collection of database clients managed by weighted configurations.
            Initializes database clients based on the provided configuration and removes
            redundant retry objects for lower-level clients to rely on global retry logic.

        default_failure_detectors:
            Returns the default list of failure detectors used to monitor database failures.

        default_health_checks:
            Returns the default list of health checks used to monitor database health
            with specific retry and backoff strategies.

        default_failover_strategy:
            Provides the default failover strategy used for handling failover scenarios
            with defined retry and backoff configurations.
    databases_configclient_class   
   )basecap   )backoffretriescommand_retryNfailure_detectorsmin_num_failuresfailure_rate_thresholdfailures_detection_windowhealth_checkshealth_check_intervalhealth_check_probeshealth_check_delayhealth_check_policyfailover_strategyfailover_attemptsfailover_delayauto_fallback_intervalr3   event_dispatcherr)   c           	         t               }| j                  D ]S  }|j                  j                  dt	        dt                     i       |j                  r2 | j                  j                  |j                  fi |j                  }n}|j                  rU|j                  j                  t	        dt                            | j                  j                  |j                        }n | j                  di |j                  }|j                  |j                         n|j                  }|j                  t        |||j                  |j                        |j                         V |S )Nretryr   )rS   rR   )connection_pool)clientr8   r2   r:   r,   )r   rK   r5   updater   r   r6   rL   r7   	set_retryr8   r@   addr   r2   r:   )r>   	databasesdatabase_configrf   r8   s        r.   rj   zMultiDbConfig.databases   sY    N	#44 "	O ))00%9;?@ ''3**33#,,0?0M0M !**))33!Y[9 **44$3$=$= 5  +**K_-J-JK #**2  779$,, 
 MM!#*11%4%E%E	  &&5"	H r-   c                 n    t        t        | j                  | j                  | j                              gS )N)rV   rW   failure_detection_window)r   r'   rV   rW   rX   r>   s    r.   default_failure_detectorsz'MultiDbConfig.default_failure_detectors   s7    '&%)%:%:+/+F+F-1-K-K
 	
r-   c                     t               gS r+   )r   rn   s    r.   default_health_checksz#MultiDbConfig.default_health_checks   s    
 	
r-   c                     t               S r+   )r   rn   s    r.   default_failover_strategyz'MultiDbConfig.default_failover_strategy   s    *,,r-   )6rA   rB   rC   rD   r   r1   rF   r
   rL   r   r   r   r   r   rT   rU   r   r   r&   rV   intr$   rW   rE   r%   rX   rY   r   r   rZ   r   r[   r   r\   r   r]   r   r^   r   r   r_   r   r`   DEFAULT_AUTO_FALLBACK_INTERVALra   r   r/   rb   r    r   rj   ro   rq   rs   r,   r-   r.   rJ   rJ   Y   sJ   %N >**5:L$uUL012: ,!<aM5  ?Cx%9 :;B4c4$BEB'HuH15M8D-.5#@5@:: ::/J,J9=x 56=6s62NE2$BEB1602. '9 'R	
40D+E 	

tK'8 

-+@ -r-   rJ   )7dataclassesr   r   typingr   r   r   r   r=   redis.asyncior	   r
   r   redis.asyncio.multidb.databaser   r   redis.asyncio.multidb.failoverr   r   r   r   &redis.asyncio.multidb.failure_detectorr   r   !redis.asyncio.multidb.healthcheckr   r   r   r   r   r   r   redis.asyncio.retryr   redis.backoffr   r   redis.data_structurer   redis.eventr   r    redis.multidb.circuitr!   r"   r#   redis.multidb.failure_detectorr$   r%   r&   r'   ru   r/   r1   rJ   r,   r-   r.   <module>r      s    ( . .  = = >    & A - A 
  "% ":  #8 #8 #8L x- x- x-r-   