
    AHjL'                        d dl mZmZ d dl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mZ d dlmZmZmZmZmZmZmZ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% d dl&m'Z'm(Z(m)Z) d dl*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 dZ: G d de      Z;de#fdZ<e G d d             Z=e G d d             Z>y)    )	dataclassfield)Enum)ListOptionalTypeUnionN)ConnectionPoolRedisRedisCluster)DEFAULT_RETRY_BASEDEFAULT_RETRY_CAPDEFAULT_RETRY_COUNT)DEFAULT_HEALTH_CHECK_DELAYDEFAULT_HEALTH_CHECK_INTERVALDEFAULT_HEALTH_CHECK_POLICYDEFAULT_HEALTH_CHECK_PROBESDEFAULT_HEALTH_CHECK_TIMEOUTHealthCheckHealthCheckPoliciesPingHealthCheck)ExponentialWithJitterBackoff	NoBackoff)WeightedList)EventDispatcherEventDispatcherInterface)MaintNotificationsConfig)DEFAULT_GRACE_PERIODCircuitBreakerPBCircuitBreakerAdapter)Database	Databases)DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYFailoverStrategyWeightBasedFailoverStrategy)DEFAULT_FAILURE_RATE_THRESHOLD!DEFAULT_FAILURES_DETECTION_WINDOWDEFAULT_MIN_NUM_FAILURESCommandFailureDetectorFailureDetector)Retryx   c                       e Zd ZdZdZdZy)InitialHealthCheckall_availablemajority_availableone_availableN)__name__
__module____qualname__ALL_AVAILABLEMAJORITY_AVAILABLEONE_AVAILABLE     L/root/tools/cai/cai_env/lib/python3.12/site-packages/redis/multidb/config.pyr/   r/   /   s    #M-#Mr:   r/   returnc                      t               S N)r   r9   r:   r;   default_event_dispatcherr?   5   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   rI   r    )selfcircuit_breakers     r;   default_circuit_breakerz&DatabaseConfig.default_circuit_breaker[   s#    #22ARARS&77r:   )r3   r4   r5   __doc__rB   float__annotations__r   dictrE   rF   r   strrG   r
   rH   r   r   rI   rJ   rP   r9   r:   r;   rA   rA   9   ss    0 FE5M45"Hhsm"*.Ix'.(,GXn%,.L%.&*hsm*8 8r:   rA   c                      e Zd ZU dZee   ed<   eZe	e
eef      ed<    e eee      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<   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<   e'Z(e)ed<   dZ*ee+   ed<   e,Z-eed<   e.Z/eed<   e0Z1eed<    e2e3      Z4e5ed<   e6jn                  Z8e6ed<   de9fdZ:dee   fdZ;dee   fdZ<de+fdZ=y)MultiDbConfiga	  
    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.
        health_check_timeout: Timeout for the full health check operation (including all probes).
        health_check_policy: Policy for determining database health based on health checks.
        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.
        initial_health_check_policy: Defines the policy used to determine whether the databases setup is
                                     healthy during the initial health check.

    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_timeouthealth_check_policyfailover_strategyfailover_attemptsfailover_delayauto_fallback_intervalrC   event_dispatcherinitial_health_check_policyr<   c           	         t               }| j                  D ]l  }t        dt                     |j                  d<   d|j                  vrt        d      |j                  d<   |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                         o |S )
Nr   )r]   r\   retrymaint_notifications_configF)enabled)connection_pool)clientrH   rB   rJ   r9   )r   rX   r,   r   rE   r   rF   rY   rG   	set_retryrH   rP   addr!   rB   rJ   )rN   	databasesdatabase_configrt   rH   s        r;   rw   zMultiDbConfig.databases   sz    N	#44 )	O 6;9;6O))'2 ,?3P3PP,U;  --.JK ''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	  &&C)	V r:   c                 \    t        | j                  | j                  | j                        gS )N)r`   ra   failure_detection_window)r*   r`   ra   rb   rN   s    r;   default_failure_detectorsz'MultiDbConfig.default_failure_detectors   s/    "!%!6!6'+'B'B)-)G)G
 	
r:   c                 \    t        | j                  | j                  | j                        gS )N)re   rf   rg   )r   re   rf   rg   r{   s    r;   default_health_checksz#MultiDbConfig.default_health_checks   s/    $($<$<#'#:#:%)%>%>
 	
r:   c                     t               S r>   )r&   r{   s    r;   default_failover_strategyz'MultiDbConfig.default_failover_strategy   s    *,,r:   )>r3   r4   r5   rQ   r   rA   rS   r   rY   r   r	   r   r,   r   r   r   r   r^   r_   r   r+   r)   r`   intr'   ra   rR   r(   rb   rc   r   r   rd   r   re   r   rf   r   rg   r   rh   r   ri   r%   r#   rj   r$   rk   DEFAULT_AUTO_FALLBACK_INTERVALrl   r   r?   rm   r   r/   r6   rn   r"   rw   r|   r~   r   r9   r:   r;   rW   rW   `   sn   )V >**5:L$uUL012: ,#):
 $	M5  :>x_ 56=4c4$BEB'HuH15M8D-.5#@5@:: ::">%>/J,J48x 0186s62NE2$BEB1602.  7I6V6V!3V.9 .`
4+@ 

tK'8 
-+; -r:   rW   )?dataclassesr   r   enumr   typingr   r   r   r	   rM   redisr
   r   r   redis._defaultsr   r   r   !redis.asyncio.multidb.healthcheckr   r   r   r   r   r   r   r   redis.backoffr   r   redis.data_structurer   redis.eventr   r   redis.maint_notificationsr   redis.multidb.circuitr   r   r    redis.multidb.databaser!   r"   redis.multidb.failoverr#   r$   r%   r&   redis.multidb.failure_detectorr'   r(   r)   r*   r+   redis.retryr,   r   r/   r?   rA   rW   r9   r:   r;   <module>r      s    (  . .  5 5 V V	 	 	 B - A > 
 7   !$ $ $":  #8 #8 #8L J- J- J-r:   