Ë
    §Œjf0  ã                   óN  — d dl mZ d dlmZ d dlmZ d dl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mZmZ d dlmZmZmZmZ d d	lmZmZmZmZmZ d d
l m!Z! d dl"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/m0Z0 d dl1m2Z2 d dl3m4Z4  G d„ de.«      Z5 G d„ de-e5«      Z6y)é    )Úabstractmethod)Úiscoroutinefunction)Údatetime)ÚAnyÚ	AwaitableÚCallableÚListÚOptionalÚUnion)ÚRedisCluster)ÚPipelineÚPubSub)ÚAsyncDatabaseÚDatabaseÚ	Databases)ÚAsyncActiveDatabaseChangedÚ&CloseConnectionOnActiveDatabaseChangedÚRegisterCommandFailureÚ"ResubscribeOnActiveDatabaseChanged)ÚDEFAULT_FAILOVER_ATTEMPTSÚDEFAULT_FAILOVER_DELAYÚAsyncFailoverStrategyÚDefaultFailoverStrategyExecutorÚFailoverStrategyExecutor)ÚAsyncFailureDetector)Úrecord_geo_failover)ÚRetry)ÚAsyncOnCommandsFailEventÚEventDispatcherInterface)ÚState)ÚBaseCommandExecutorÚCommandExecutor)ÚDEFAULT_AUTO_FALLBACK_INTERVAL)ÚGeoFailoverReason)ÚKeyTc                   óÖ  — e Zd Zeedefd„«       «       Zeedee   fd„«       «       Z	ededdfd„«       Z
eedee   fd„«       «       Zeded	eddfd
„«       Zeedee   fd„«       «       Zej$                  ededdfd„«       «       Zeedefd„«       «       Zeedefd„«       «       Zed„ «       Zed„ «       Zedefd„«       Zedeegdf   fd„«       Zedefd„«       Zede de!fd„«       Z"y)ÚAsyncCommandExecutorÚreturnc                  ó   — y)zReturns a list of databases.N© ©Úselfs    úp/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/redis/asyncio/multidb/command_executor.pyÚ	databaseszAsyncCommandExecutor.databases"   ó   € ð 	ó    c                  ó   — y)z$Returns a list of failure detectors.Nr*   r+   s    r-   Úfailure_detectorsz&AsyncCommandExecutor.failure_detectors(   r/   r0   Úfailure_detectorNc                  ó   — y)z=Adds a new failure detector to the list of failure detectors.Nr*   ©r,   r3   s     r-   Úadd_failure_detectorz)AsyncCommandExecutor.add_failure_detector.   s   € ð 	r0   c                  ó   — y)z"Returns currently active database.Nr*   r+   s    r-   Úactive_databasez$AsyncCommandExecutor.active_database3   r/   r0   ÚdatabaseÚreasonc              ƒ   ó   K  — y­w)z›Sets the currently active database.

        Args:
            database: The new active database.
            reason: The reason for the failover.
        Nr*   )r,   r9   r:   s      r-   Úset_active_databasez(AsyncCommandExecutor.set_active_database9   s   è ø€ ð 	ùó   ‚c                  ó   — y)z Returns currently active pubsub.Nr*   r+   s    r-   Úactive_pubsubz"AsyncCommandExecutor.active_pubsubE   r/   r0   Úpubsubc                  ó   — y)zSets currently active pubsub.Nr*   ©r,   r@   s     r-   r?   z"AsyncCommandExecutor.active_pubsubK   r/   r0   c                  ó   — y)z#Returns failover strategy executor.Nr*   r+   s    r-   Úfailover_strategy_executorz/AsyncCommandExecutor.failover_strategy_executorQ   r/   r0   c                  ó   — y)zReturns command retry object.Nr*   r+   s    r-   Úcommand_retryz"AsyncCommandExecutor.command_retryW   r/   r0   c              ‹   ó   K  — y­w)z:Initializes a PubSub object on a currently active databaseNr*   ©r,   Úkwargss     r-   r@   zAsyncCommandExecutor.pubsub]   ó   è ø€ ð 	ùr=   c              �   ó   K  — y­w)z*Executes a command and returns the result.Nr*   )r,   ÚargsÚoptionss      r-   Úexecute_commandz$AsyncCommandExecutor.execute_commandb   rJ   r=   Úcommand_stackc              ƒ   ó   K  — y­w)z)Executes a stack of commands in pipeline.Nr*   )r,   rO   s     r-   Úexecute_pipelinez%AsyncCommandExecutor.execute_pipelineg   rJ   r=   Útransactionc              �   ó   K  — y­w)z1Executes a transaction block wrapped in callback.Nr*   )r,   rR   ÚwatchesrM   s       r-   Úexecute_transactionz(AsyncCommandExecutor.execute_transactionl   s   è ø€ ð
 	ùr=   Úmethod_namec              �   ó   K  — y­w)z*Executes a given method on active pub/sub.Nr*   )r,   rV   rL   rI   s       r-   Úexecute_pubsub_methodz*AsyncCommandExecutor.execute_pubsub_methods   rJ   r=   Ú
sleep_timec              ‹   ó   K  — y­w)z!Executes pub/sub run in a thread.Nr*   )r,   rY   rI   s      r-   Úexecute_pubsub_runz'AsyncCommandExecutor.execute_pubsub_runx   rJ   r=   )#Ú__name__Ú
__module__Ú__qualname__Úpropertyr   r   r.   r	   r   r2   r6   r
   r   r8   r$   r<   r   r?   Úsetterr   rD   r   rF   r@   rN   ÚtuplerQ   r   r   rU   ÚstrrX   Úfloatr   r[   r*   r0   r-   r'   r'   !   s
  „ ØØð˜9ò ó ó ðð Øð 4Ð(<Ñ#=ò ó ó ðð ðÐ5Ið Èdò ó ðð Øð ¨-Ñ!8ò ó ó ðð ð	Ø%ð	Ø/@ð	à	ò	ó ð	ð Øð˜x¨Ñ/ò ó ó ðð ×ÑØð Fð ¨tò ó ó ðð ØðÐ,Dò ó ó ðð Øð˜uò ó ó ðð ñó ðð ñó ðð ð°Eò ó ðð ðØ# X J°Ð$4Ñ5òó ðð ð°sò ó ðð ð°5ð Àsò ó ñr0   r'   c                   óî  ‡ — e Zd Zeeefdee   dede	de
dedededefˆ fd	„Zed
efd„«       Zed
ee   fd„«       Zded
dfd„Zed
ee   fd„«       Zdeded
dfd„Zed
ee   fd„«       Zej4                  ded
dfd„«       Zed
efd„«       Zed
e	fd„«       Zd„ Zd„ Zde fd„Z!ddddœde"d ge#e$e%e$   f   f   d!e&d"ee'   d#e(d$ee   f
d%„Z)d&e'fd'„Z*	 d2d(ed
e$fd)„Z+	 d3d*e"d+e fd,„Z,d-„ Z-d.„ Z.d/e fd0„Z/d1„ Z0ˆ xZ1S )4ÚDefaultCommandExecutorr2   r.   rF   Úfailover_strategyÚevent_dispatcherÚfailover_attemptsÚfailover_delayÚauto_fallback_intervalc	                 ó  •— t         ‰
| �  |«       |D ]  }	|	j                  | ¬«       Œ || _        || _        || _        t        |||«      | _        || _        d| _	        d| _
        i | _        | j                  «        | j                  «        y)a°  
        Initialize the DefaultCommandExecutor instance.

        Args:
            failure_detectors: List of failure detector instances to monitor database health
            databases: Collection of available databases to execute commands on
            command_retry: Retry policy for failed command execution
            failover_strategy: Strategy for handling database failover
            event_dispatcher: Interface for dispatching events
            failover_attempts: Number of failover attempts
            failover_delay: Delay between failover attempts
            auto_fallback_interval: Time interval in seconds between attempts to fall back to a primary database
        )Úcommand_executorN)ÚsuperÚ__init__Úset_command_executorÚ
_databasesÚ_failure_detectorsÚ_command_retryr   Ú_failover_strategy_executorÚ_event_dispatcherÚ_active_databaseÚ_active_pubsubÚ_active_pubsub_kwargsÚ_setup_event_dispatcherÚ_schedule_next_fallback)r,   r2   r.   rF   rf   rg   rh   ri   rj   ÚfdÚ	__class__s             €r-   rn   zDefaultCommandExecutor.__init__   s–   ø€ ô0 	‰ÑÐ/Ô0ã#ˆBØ×#Ñ#°TÐ#Õ:ð $ð $ˆŒØ"3ˆÔØ+ˆÔÜ+JØÐ0°.ó,
ˆÔ(ð "2ˆÔØ48ˆÔØ04ˆÔØ%'ˆÔ"Ø×$Ñ$Ô&Ø×$Ñ$Õ&r0   r(   c                 ó   — | j                   S ©N)rp   r+   s    r-   r.   z DefaultCommandExecutor.databases©   s   € à�‰Ðr0   c                 ó   — | j                   S r}   )rq   r+   s    r-   r2   z(DefaultCommandExecutor.failure_detectors­   s   € à×&Ñ&Ð&r0   r3   Nc                 ó:   — | j                   j                  |«       y r}   )rq   Úappendr5   s     r-   r6   z+DefaultCommandExecutor.add_failure_detector±   s   € Ø×Ñ×&Ñ&Ð'7Õ8r0   c                 ó   — | j                   S r}   )ru   r+   s    r-   r8   z&DefaultCommandExecutor.active_database´   s   € à×$Ñ$Ð$r0   r9   r:   c              ƒ   óü   K  — | j                   }|| _         |�_||urZt        |||¬«      ƒ d {  –—†  | j                  j                  t	        || j                   | fi | j
                  ¤Ž«      ƒ d {  –—†  y y y 7 ŒJ7 Œ	­w)N)Ú	fail_fromÚfail_tor:   )ru   r   rt   Údispatch_asyncr   rw   )r,   r9   r:   Ú
old_actives       r-   r<   z*DefaultCommandExecutor.set_active_database¸   sž   è ø€ ð ×*Ñ*ˆ
Ø (ˆÔàÐ! j¸Ñ&@Ü%Ø$Ø Øô÷ ð ð
 ×(Ñ(×7Ñ7Ü*ØØ×)Ñ)Øñð ×0Ñ0ñ	ó÷ ñ ð 'AÐ!ðøð
ús"   ‚+A<­A8®AA<Á0A:Á1A<Á:A<c                 ó   — | j                   S r}   ©rv   r+   s    r-   r?   z$DefaultCommandExecutor.active_pubsubÍ   ó   € à×"Ñ"Ð"r0   r@   c                 ó   — || _         y r}   rˆ   rB   s     r-   r?   z$DefaultCommandExecutor.active_pubsubÑ   s
   € à$ˆÕr0   c                 ó   — | j                   S r}   )rs   r+   s    r-   rD   z1DefaultCommandExecutor.failover_strategy_executorÕ   s   € à×/Ñ/Ð/r0   c                 ó   — | j                   S r}   )rr   r+   s    r-   rF   z$DefaultCommandExecutor.command_retryÙ   r‰   r0   c                 óà   — | j                   €bt        | j                  j                  t        «      rt        d«      ‚ | j                  j                  j                  di |¤Ž| _         || _        y y )Nz(PubSub is not supported for RedisClusterr*   )rv   Ú
isinstanceru   Úclientr   Ú
ValueErrorr@   rw   rH   s     r-   r@   zDefaultCommandExecutor.pubsubÝ   sa   € Ø×ÑÐ&Ü˜$×/Ñ/×6Ñ6¼ÔEÜ Ð!KÓLÐLà"E $×"7Ñ"7×">Ñ">×"EÑ"EÑ"OÈÑ"OˆDÔØ)/ˆDÕ&ð 'r0   c              �   óV   ‡ ‡‡K  — ˆˆˆ fd„}‰ j                  |‰«      ƒ d {  –—† S 7 Œ­w)Nc               “   ó¦   •K  —  ‰j                   j                  j                  ‰i ‰¤Žƒ d {  –—† } ‰j                  ‰«      ƒ d {  –—†  | S 7 Œ7 Œ­wr}   )ru   r�   rN   Ú_register_command_execution)ÚresponserL   rM   r,   s    €€€r-   Úcallbackz8DefaultCommandExecutor.execute_command.<locals>.callbackæ   s[   øè ø€ ØI˜T×2Ñ2×9Ñ9×IÑIØðØ ñ÷ ˆHð ×2Ñ2°4Ó8×8Ð8ØˆOð	øð 9ús!   ƒ*A­A®AÁAÁAÁA©Ú_execute_with_failure_detection)r,   rL   rM   r•   s   ``` r-   rN   z&DefaultCommandExecutor.execute_commandå   s'   úè ø€ ö	ð ×9Ñ9¸(ÀDÓI×IÐIÐIús   …)¢'£)rO   c              ƒ   óR   ‡ ‡K  — ˆˆ fd„}‰ j                  |‰«      ƒ d {  –—† S 7 Œ­w)Nc               “   ó`  •K  — ‰j                   j                  j                  «       4 ƒd {  –—† } ‰D ]  \  }} | j                  |i |¤Ž Œ | j	                  «       ƒ d {  –—† }‰j                  ‰«      ƒ d {  –—†  |cd d d «      ƒd {  –—†  S 7 Œd7 Œ27 Œ7 Œ# 1 ƒd {  –—†7  sw Y   y xY w­wr}   )ru   r�   ÚpipelinerN   Úexecuter“   )ÚpipeÚcommandrM   r”   rO   r,   s       €€r-   r•   z9DefaultCommandExecutor.execute_pipeline.<locals>.callbackð   s”   øè ø€ Ø×,Ñ,×3Ñ3×<Ñ<×>Ô>À$Û(5Ñ$�G˜WØ(�D×(Ñ(¨'Ð=°WÓ=ð )6ð "&§¡£×/�Ø×6Ñ6°}ÓE×EÐEØ÷ ?×>Ò>øð 0øØEøð ?ø×>×>Ñ>üsh   ƒ)B.¬B­B.°0BÁ BÁ!BÁ9BÁ:BÁ?B.ÂBÂB.ÂBÂBÂB.ÂB+ÂB"Â B+Â'B.r–   )r,   rO   r•   s   `` r-   rQ   z'DefaultCommandExecutor.execute_pipelineï   s'   ùè ø€ õ	 ð ×9Ñ9¸(ÀMÓR×RÐRÐRús   „' %¡'F©Ú
shard_hintÚvalue_from_callableÚwatch_delayÚfuncr   rT   rŸ   r    r¡   c             ‡   ó`   ‡ ‡‡‡‡‡K  — ˆˆ ˆˆˆˆfd„}‰ j                  |«      ƒ d {  –—† S 7 Œ­w)Nc               “   ó²   •K  —  ‰j                   j                  j                  ‰g‰¢­‰‰‰dœŽƒ d {  –—† } ‰j                  d«      ƒ d {  –—†  | S 7 Œ7 Œ­w)Nrž   r*   )ru   r�   rR   r“   )r”   r¢   r,   rŸ   r    r¡   rT   s    €€€€€€r-   r•   z<DefaultCommandExecutor.execute_transaction.<locals>.callback  sk   øè ø€ ØE˜T×2Ñ2×9Ñ9×EÑEØðàñð &Ø$7Ø'ò÷ ˆHð ×2Ñ2°2Ó6×6Ð6ØˆOðøð 7ús!   ƒ0A³A´AÁAÁAÁAr–   )r,   r¢   rŸ   r    r¡   rT   r•   s   `````` r-   rU   z*DefaultCommandExecutor.execute_transactionû   s*   ýè ø€ ÷		ñ 		ð ×9Ñ9¸(ÓC×CÐCÐCús   ˆ.§,¨.rV   c              �   ó\   ‡ ‡‡‡K  — ˆˆˆˆ fd„} ‰ j                   |g‰¢­Ž ƒ d {  –—† S 7 Œ­w)Nc               “   ó¾   •K  — t        ‰j                  ‰«      } t        | «      r | ‰i ‰¤Žƒ d {  –—† }n | ‰i ‰¤Ž}‰j                  ‰«      ƒ d {  –—†  |S 7 Œ(7 Œ­wr}   )Úgetattrr?   r   r“   )Úmethodr”   rL   rI   rV   r,   s     €€€€r-   r•   z>DefaultCommandExecutor.execute_pubsub_method.<locals>.callback  sf   øè ø€ Ü˜T×/Ñ/°Ó=ˆFÜ" 6Ô*Ù!'¨Ð!8°Ñ!8×8‘á! 4Ð2¨6Ñ2�à×2Ñ2°4Ó8×8Ð8ØˆOð 9øð 9ús!   ƒ-A°A±!AÁAÁAÁAr–   )r,   rV   rL   rI   r•   s   ```` r-   rX   z,DefaultCommandExecutor.execute_pubsub_method  s,   ûè ø€ ÷	ð :�T×9Ñ9¸(ÐJÀTÒJ×JÐJÐJús   †,¥*¦,rY   c              ƒ   óX   ‡ ‡‡‡K  — ˆˆˆ ˆfd„}‰ j                  |«      ƒ d {  –—† S 7 Œ­w)Nc               “   ó\   •K  — ‰j                   j                  ‰‰ ‰¬«      ƒ d {  –—† S 7 Œ­w)N)Úpoll_timeoutÚexception_handlerr@   )rv   Úrun)r¬   r@   r,   rY   s   €€€€r-   r•   z;DefaultCommandExecutor.execute_pubsub_run.<locals>.callback   s8   øè ø€ Ø×,Ñ,×0Ñ0Ø'Ø"3Øð 1ó ÷ ð ð ús   ƒ",¥*¦,r–   )r,   rY   r¬   r@   r•   s   ```` r-   r[   z)DefaultCommandExecutor.execute_pubsub_run  s%   ûè ø€ ÷	ð ×9Ñ9¸(ÓC×CÐCÐCús   †*£(¤*r•   Úcmdsc              ƒ   óx   ‡ ‡‡‡K  — ˆˆ fd„Š‰ j                   j                  ˆfd„ˆˆ fd„«      ƒ d{  –—† S 7 Œ­w)zO
        Execute a commands execution callback with failure detection.
        c               “   ób   •K  — ‰j                  «       ƒ d {  –—†   ‰ «       ƒ d {  –—† S 7 Œ7 Œ­wr}   )Ú_check_active_database)r•   r,   s   €€r-   ÚwrapperzGDefaultCommandExecutor._execute_with_failure_detection.<locals>.wrapper0  s-   øè ø€ à×-Ñ-Ó/×/Ð/Ù!›×#Ð#ð 0øØ#ús   ƒ/—+˜/¦-§/­/c                  ó   •—  ‰ «       S r}   r*   )r²   s   €r-   Ú<lambda>zHDefaultCommandExecutor._execute_with_failure_detection.<locals>.<lambda>6  s   ø€ ‘G”Ir0   c                 ó*   •—  ‰j                   | g‰¢­Ž S r}   )Ú_on_command_fail)Úerrorr®   r,   s    €€r-   r´   zHDefaultCommandExecutor._execute_with_failure_detection.<locals>.<lambda>7  s   ø€ Ð/˜$×/Ñ/°Ð=¸Ó=r0   N)rr   Úcall_with_retry)r,   r•   r®   r²   s   ```@r-   r—   z6DefaultCommandExecutor._execute_with_failure_detection)  s7   ûè ø€ õ	$ð
 ×(Ñ(×8Ñ8ÛÜ=ó
÷ 
ð 	
ð 
ús   †-:³8´:c              ƒ   ó¢  K  — | j                   �a| j                   j                  j                  t        j                  k7  s0| j
                  dkD  r{| j                  t        j                  «       k  rY| j                  | j                  j                  «       ƒ d{  –—† t        j                  «      ƒ d{  –—†  | j                  «        yyy7 Œ27 Œ­w)zB
        Checks if active a database needs to be updated.
        Nr   )ru   ÚcircuitÚstateÚCBStateÚCLOSEDÚ_auto_fallback_intervalÚ_next_fallback_attemptr   Únowr<   rs   r›   r$   Ú	AUTOMATICry   r+   s    r-   r±   z-DefaultCommandExecutor._check_active_database:  s±   è ø€ ð
 ×!Ñ!Ð)Ø×$Ñ$×,Ñ,×2Ñ2´g·n±nÒDà×,Ñ,¨qÒ0Ø×/Ñ/´8·<±<³>ÒAð ×*Ñ*Ø×6Ñ6×>Ñ>Ó@×@Ü!×+Ñ+ó÷ ð ð ×(Ñ(Õ*ð Bð 1ð
 Aøðús$   ‚BCÂCÂCÂ3CÂ4CÃCc              ‡   ój   K  — | j                   j                  t        ||«      «      ƒ d {  –—†  y 7 Œ­wr}   )rt   r…   r   )r,   r·   rL   s      r-   r¶   z'DefaultCommandExecutor._on_command_failL  s.   è ø€ Ø×$Ñ$×3Ñ3Ü$ T¨5Ó1ó
÷ 	
ò 	
ús   ‚)3«1¬3Úcmdc              ƒ   ód   K  — | j                   D ]  }|j                  |«      ƒ d {  –—†  Œ y 7 Œ­wr}   )rq   Úregister_command_execution)r,   rÃ   Údetectors      r-   r“   z2DefaultCommandExecutor._register_command_executionQ  s-   è ø€ Ø×/Ô/ˆHØ×5Ñ5°cÓ:×:Ñ:ñ 0Ø:ús   ‚$0¦.§0c                 óª   — t        | j                  «      }t        «       }t        «       }| j                  j                  t        |gt        ||gi«       y)z0
        Registers necessary listeners.
        N)r   rq   r   r   rt   Úregister_listenersr   r   )r,   Úfailure_listenerÚresubscribe_listenerÚclose_connection_listeners       r-   rx   z.DefaultCommandExecutor._setup_event_dispatcherU  sW   € ô 2°$×2IÑ2IÓJÐÜAÓCÐÜ$JÓ$LÐ!Ø×Ñ×1Ñ1ä(Ð+;Ð*<Ü*Ø-Ø(ð-ðõ	
r0   )NN)r*   )2r\   r]   r^   r   r   r#   r	   r   r   r   r   r   Úintrc   rn   r_   r.   r2   r6   r
   r   r8   r$   r<   r   r?   r`   r   rD   rF   r@   rN   ra   rQ   r   r   r   r   r%   rb   ÚboolrU   rX   r[   r—   r±   r¶   r“   rx   Ú__classcell__)r{   s   @r-   re   re   ~   sW  ø„ ð ";Ø 6Ø(Fñ('àÐ 4Ñ5ð('ð ð('ð ð	('ð
 1ð('ð 3ð('ð ð('ð ð('ð !&õ('ðT ð˜9ò ó ðð ð' 4Ð(<Ñ#=ò 'ó ð'ð9Ð5Ið 9Èdó 9ð ð% ¨-Ñ!8ò %ó ð%ðØ%ðØ/@ðà	óð* ð#˜x¨Ñ/ò #ó ð#ð ×Ñð% Fð %¨tò %ó ð%ð ð0Ð,Dò 0ó ð0ð ð#˜uò #ó ð#ò0òJð
S°Eó 
Sð  %)Ø$)Ø'+òDà˜
�| U¨3°	¸#±Ð+>Ñ%?Ð?Ñ@ðDð ðDð ˜S‘Mð	Dð
 "ðDð ˜e‘_óDð*K°só Kð AEñ
DØð
Dà	ó
Dð 13ñ
Ø ð
Ø(-ó
ò"+ò$
ð
;°Uó ;ö
r0   re   N)7Úabcr   Úasyncior   r   Útypingr   r   r   r	   r
   r   Úredis.asyncior   Úredis.asyncio.clientr   r   Úredis.asyncio.multidb.databaser   r   r   Úredis.asyncio.multidb.eventr   r   r   r   Úredis.asyncio.multidb.failoverr   r   r   r   r   Ú&redis.asyncio.multidb.failure_detectorr   Ú$redis.asyncio.observability.recorderr   Úredis.asyncio.retryr   Úredis.eventr   r   Úredis.multidb.circuitr    r¼   Úredis.multidb.command_executorr!   r"   Úredis.multidb.configr#   Úredis.observability.attributesr$   Úredis.typingr%   r'   re   r*   r0   r-   Ú<module>rà      ss   ðÝ Ý 'Ý ß B× Bå &ß 1ß MÑ M÷ó ÷õ õ HÝ DÝ %ß JÝ 2ß OÝ ?Ý <Ý ôZ˜?ô Zôzf
Ð0Ð2Fõ f
r0   