Ë
    §Œjr0  ã                   óN  — d dl mZmZ d dlmZmZ d dlmZmZmZm	Z	m
Z
 d dlmZ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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-  G d„ de«      Z. G d„ de.«      Z/ G d„ de.«      Z0 G d„ de0e/«      Z1y)é    )ÚABCÚabstractmethod)ÚdatetimeÚ	timedelta)ÚAnyÚCallableÚListÚOptionalÚTuple)ÚPipelineÚPubSubÚPubSubWorkerThread)ÚEventDispatcherInterfaceÚOnCommandsFailEvent)ÚState)ÚDEFAULT_AUTO_FALLBACK_INTERVAL)ÚDatabaseÚ	DatabasesÚSyncDatabase)ÚActiveDatabaseChangedÚ&CloseConnectionOnActiveDatabaseChangedÚRegisterCommandFailureÚ"ResubscribeOnActiveDatabaseChanged)ÚDEFAULT_FAILOVER_ATTEMPTSÚDEFAULT_FAILOVER_DELAYÚDefaultFailoverStrategyExecutorÚFailoverStrategyÚFailoverStrategyExecutor)ÚFailureDetector)ÚGeoFailoverReason)Úrecord_geo_failover)ÚRetryc                   ód   — e Zd Zeedefd„«       «       Zej                  ededdfd„«       «       Zy)ÚCommandExecutorÚreturnc                  ó   — y)zReturns auto-fallback interval.N© ©Úselfs    úh/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/redis/multidb/command_executor.pyÚauto_fallback_intervalz&CommandExecutor.auto_fallback_interval   ó   € ð 	ó    r+   Nc                  ó   — y)zSets auto-fallback interval.Nr'   ©r)   r+   s     r*   r+   z&CommandExecutor.auto_fallback_interval$   r,   r-   )Ú__name__Ú
__module__Ú__qualname__Úpropertyr   Úfloatr+   Úsetterr'   r-   r*   r$   r$      sS   „ ØØð¨ò ó ó ðð ×"Ñ"Øð¸Uð Àtò ó ó #ñr-   r$   c                   óh   — e Zd Zefdefd„Zedefd„«       Zej                  de	ddfd„«       Zdd„Z
y)	ÚBaseCommandExecutorr+   c                 ó   — || _         |  y ©N©Ú_auto_fallback_intervalr/   s     r*   Ú__init__zBaseCommandExecutor.__init__,   s   € ð (>ˆÔ$Úr-   r%   c                 ó   — | j                   S r9   r:   r(   s    r*   r+   z*BaseCommandExecutor.auto_fallback_interval3   s   € à×+Ñ+Ð+r-   Nc                 ó   — || _         y r9   r:   r/   s     r*   r+   z*BaseCommandExecutor.auto_fallback_interval7   s
   € à'=ˆÕ$r-   c                 ó„   — | j                   dk  ry t        j                  «       t        | j                   ¬«      z   | _        y )Nr   )Úseconds)r;   r   Únowr   Ú_next_fallback_attemptr(   s    r*   Ú_schedule_next_fallbackz+BaseCommandExecutor._schedule_next_fallback;   s6   € Ø×'Ñ'¨!Ò+Øä&.§l¡l£n´yØ×0Ñ0ô8
ñ '
ˆÕ#r-   )r%   N)r0   r1   r2   r   r4   r<   r3   r+   r5   ÚintrC   r'   r-   r*   r7   r7   +   s]   „ ð )Gñ.à %ó.ð ð,¨ò ,ó ð,ð ×"Ñ"ð>¸Sð >ÀTò >ó #ð>ô
r-   r7   c                   óú  — 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j                  edeeef   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)ÚSyncCommandExecutorr%   c                  ó   — y)zReturns a list of databases.Nr'   r(   s    r*   Ú	databaseszSyncCommandExecutor.databasesE   r,   r-   c                  ó   — y)z$Returns a list of failure detectors.Nr'   r(   s    r*   Úfailure_detectorsz%SyncCommandExecutor.failure_detectorsK   r,   r-   Úfailure_detectorNc                  ó   — y)z=Adds a new failure detector to the list of failure detectors.Nr'   ©r)   rK   s     r*   Úadd_failure_detectorz(SyncCommandExecutor.add_failure_detectorQ   ó   € ð 	r-   c                  ó   — y)z"Returns currently active database.Nr'   r(   s    r*   Úactive_databasez#SyncCommandExecutor.active_databaseV   r,   r-   Úvaluec                  ó   — y)zÝSets the currently active database.

        Args:
            value: A tuple of (database, reason) where database is the new active
                   database and reason is the GeoFailoverReason for the change.
        Nr'   )r)   rR   s     r*   rQ   z#SyncCommandExecutor.active_database\   s   € ð 	r-   c                  ó   — y)z Returns currently active pubsub.Nr'   r(   s    r*   Úactive_pubsubz!SyncCommandExecutor.active_pubsubg   r,   r-   Úpubsubc                  ó   — y)zSets currently active pubsub.Nr'   ©r)   rV   s     r*   rU   z!SyncCommandExecutor.active_pubsubm   r,   r-   c                  ó   — y)z#Returns failover strategy executor.Nr'   r(   s    r*   Úfailover_strategy_executorz.SyncCommandExecutor.failover_strategy_executors   r,   r-   c                  ó   — y)zReturns command retry object.Nr'   r(   s    r*   Úcommand_retryz!SyncCommandExecutor.command_retryy   r,   r-   c                  ó   — y)z:Initializes a PubSub object on a currently active databaseNr'   )r)   Úkwargss     r*   rV   zSyncCommandExecutor.pubsub   rO   r-   c                  ó   — y)z*Executes a command and returns the result.Nr'   )r)   ÚargsÚoptionss      r*   Úexecute_commandz#SyncCommandExecutor.execute_command„   rO   r-   Úcommand_stackc                  ó   — y)z)Executes a stack of commands in pipeline.Nr'   )r)   rc   s     r*   Úexecute_pipelinez$SyncCommandExecutor.execute_pipeline‰   rO   r-   Útransactionc                  ó   — y)z1Executes a transaction block wrapped in callback.Nr'   )r)   rf   Úwatchesra   s       r*   Úexecute_transactionz'SyncCommandExecutor.execute_transactionŽ   s   € ð
 	r-   Úmethod_namec                  ó   — y)z*Executes a given method on active pub/sub.Nr'   )r)   rj   r`   r^   s       r*   Úexecute_pubsub_methodz)SyncCommandExecutor.execute_pubsub_method•   rO   r-   Ú
sleep_timec                  ó   — y)z!Executes pub/sub run in a thread.Nr'   )r)   rm   r^   s      r*   Úexecute_pubsub_runz&SyncCommandExecutor.execute_pubsub_runš   rO   r-   )$r0   r1   r2   r3   r   r   rH   r	   r   rJ   rN   r
   r   rQ   r5   r   r   r    r   rU   r   rZ   r"   r\   rV   rb   Útuplere   r   r   ri   Ústrrl   r4   r   ro   r'   r-   r*   rF   rF   D   s  „ ØØð˜9ò ó ó ðð Øð 4¨Ñ#8ò ó ó ðð ð°_ð Èò ó ðð Øð ¨(Ñ!3ò ó ó ðð ×ÑØð U¨<Ð9JÐ+JÑ%Kð ÐPTò ó ó ðð Øð˜x¨Ñ/ò ó ó ðð ×ÑØð Fð ¨tò ó ó ðð ØðÐ,Dò ó ó ðð Øð˜uò ó ó ðð ñó ðð ñó ðð ð¨eò ó ðð ðØ# X J°Ð$4Ñ5òó ðð ð°ò ó ðð ð¨Uð Àò ó ñr-   rF   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	fd„«       Zed
ee   fd„«       Zej.                  deeef   d
dfd„«       Zed
ee   fd„«       Zej.                  ded
dfd„«       Zed
efd„«       Zd„ Zdefd„Z de!e"gdf   fd„Z#d„ Z$de%fd„Z&d)d „Z'd*d!e!d"efd#„Z(d$„ Z)d%„ Z*d&efd'„Z+d(„ Z,ˆ xZ-S )+ÚDefaultCommandExecutorrJ   rH   r\   Úfailover_strategyÚevent_dispatcherÚfailover_attemptsÚfailover_delayr+   c	                 ó  •— 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)Úsuperr<   Úset_command_executorÚ
_databasesÚ_failure_detectorsÚ_command_retryr   Ú_failover_strategy_executorÚ_event_dispatcherÚ_active_databaseÚ_active_pubsubÚ_active_pubsub_kwargsÚ_setup_event_dispatcherrC   )r)   rJ   rH   r\   rt   ru   rv   rw   r+   ÚfdÚ	__class__s             €r*   r<   zDefaultCommandExecutor.__init__¡   s–   ø€ ô0 	‰ÑÐ/Ô0ã#ˆBØ×#Ñ#°TÐ#Õ:ð $ð $ˆŒØ"3ˆÔØ+ˆÔÜ+JØÐ0°.ó,
ˆÔ(ð "2ˆÔØ48ˆÔØ04ˆÔØ%'ˆÔ"Ø×$Ñ$Ô&Ø×$Ñ$Õ&r-   r%   c                 ó   — | j                   S r9   )r|   r(   s    r*   rH   z DefaultCommandExecutor.databasesË   s   € à�‰Ðr-   c                 ó   — | j                   S r9   )r}   r(   s    r*   rJ   z(DefaultCommandExecutor.failure_detectorsÏ   s   € à×&Ñ&Ð&r-   rK   Nc                 ó:   — | j                   j                  |«       y r9   )r}   ÚappendrM   s     r*   rN   z+DefaultCommandExecutor.add_failure_detectorÓ   s   € Ø×Ñ×&Ñ&Ð'7Õ8r-   c                 ó   — | j                   S r9   )r~   r(   s    r*   r\   z$DefaultCommandExecutor.command_retryÖ   ó   € à×"Ñ"Ð"r-   c                 ó   — | j                   S r9   )r�   r(   s    r*   rQ   z&DefaultCommandExecutor.active_databaseÚ   s   € à×$Ñ$Ð$r-   rR   c                 óÖ   — |\  }}| j                   }|| _         |�O||urJt        |||¬«       | j                  j                  t	        || j                   | fi | j
                  ¤Ž«       y y y )N)Ú	fail_fromÚfail_toÚreason)r�   r!   r€   Údispatchr   rƒ   )r)   rR   Údatabaser‘   Ú
old_actives        r*   rQ   z&DefaultCommandExecutor.active_databaseÞ   sƒ   € à Ñˆ�&Ø×*Ñ*ˆ
Ø (ˆÔàÐ! j¸Ñ&@ÜØ$Ø Øõð
 ×"Ñ"×+Ñ+Ü%ØØ×)Ñ)Øñð ×0Ñ0ñ	õð 'AÐ!r-   c                 ó   — | j                   S r9   ©r‚   r(   s    r*   rU   z$DefaultCommandExecutor.active_pubsubó   rŒ   r-   rV   c                 ó   — || _         y r9   r–   rX   s     r*   rU   z$DefaultCommandExecutor.active_pubsub÷   s
   € à$ˆÕr-   c                 ó   — | j                   S r9   )r   r(   s    r*   rZ   z1DefaultCommandExecutor.failover_strategy_executorû   s   € à×/Ñ/Ð/r-   c                 ó:   ‡ ‡‡— ˆˆˆ fd„}‰ j                  |‰«      S )Nc                  óv   •—  ‰j                   j                  j                  ‰i ‰¤Ž} ‰j                  ‰«       | S r9   )r�   Úclientrb   Ú_register_command_execution)Úresponser`   ra   r)   s    €€€r*   Úcallbackz8DefaultCommandExecutor.execute_command.<locals>.callback   s9   ø€ ØC�t×,Ñ,×3Ñ3×CÑCÀTÐUÈWÑUˆHØ×,Ñ,¨TÔ2ØˆOr-   ©Ú_execute_with_failure_detection)r)   r`   ra   rž   s   ``` r*   rb   z&DefaultCommandExecutor.execute_commandÿ   s   ú€ ö	ð
 ×3Ñ3°H¸dÓCÐCr-   rc   c                 ó6   ‡ ‡— ˆˆ fd„}‰ j                  |‰«      S )Nc                  óö   •— ‰j                   j                  j                  «       5 } ‰D ]  \  }} | j                  |i |¤Ž Œ | j	                  «       }‰j                  ‰«       |cd d d «       S # 1 sw Y   y xY wr9   )r�   r›   Úpipelinerb   Úexecuterœ   )ÚpipeÚcommandra   r�   rc   r)   s       €€r*   rž   z9DefaultCommandExecutor.execute_pipeline.<locals>.callback  sk   ø€ Ø×&Ñ&×-Ñ-×6Ñ6Ô8¸DÛ(5Ñ$�G˜WØ(�D×(Ñ(¨'Ð=°WÓ=ð )6ð  Ÿ<™<›>�Ø×0Ñ0°Ô?Ø÷ 9×8Ò8ús   ¦?A/Á/A8rŸ   )r)   rc   rž   s   `` r*   re   z'DefaultCommandExecutor.execute_pipeline  s   ù€ õ	 ð ×3Ñ3°H¸mÓLÐLr-   rf   c                 ó<   ‡ ‡‡‡— ˆˆ ˆˆfd„}‰ j                  |«      S )Nc                  ó~   •—  ‰j                   j                  j                  ‰g‰¢­i ‰¤Ž} ‰j                  d«       | S ©Nr'   )r�   r›   rf   rœ   )r�   ra   r)   rf   rh   s    €€€€r*   rž   z<DefaultCommandExecutor.execute_transaction.<locals>.callback  sI   ø€ Ø?�t×,Ñ,×3Ñ3×?Ñ?ØðØ%òØ)0ñˆHð ×,Ñ,¨RÔ0ØˆOr-   rŸ   )r)   rf   rh   ra   rž   s   ```` r*   ri   z*DefaultCommandExecutor.execute_transaction  s   û€ ÷	ð ×3Ñ3°HÓ=Ð=r-   c                 ó4   ‡ ‡— ˆˆ fd„}‰ j                  |«      S )Nc                  ó‚   •— ‰j                   €2 ‰j                  j                  j                  di ‰ ¤Ž‰_         ‰ ‰_        y r©   )r‚   r�   r›   rV   rƒ   )r^   r)   s   €€r*   rž   z/DefaultCommandExecutor.pubsub.<locals>.callback   s>   ø€ Ø×"Ñ"Ð*Ø&I d×&;Ñ&;×&BÑ&B×&IÑ&IÑ&SÈFÑ&S�Ô#Ø-3�Ô*Ør-   rŸ   )r)   r^   rž   s   `` r*   rV   zDefaultCommandExecutor.pubsub  s   ù€ õ	ð ×3Ñ3°HÓ=Ð=r-   rj   c                 ó@   ‡ ‡‡‡— ˆˆˆˆ fd„} ‰ j                   |g‰¢­Ž S )Nc                  óf   •— t        ‰j                  ‰«      }  | ‰i ‰¤Ž}‰j                  ‰«       |S r9   )ÚgetattrrU   rœ   )Úmethodr�   r`   r^   rj   r)   s     €€€€r*   rž   z>DefaultCommandExecutor.execute_pubsub_method.<locals>.callback)  s7   ø€ Ü˜T×/Ñ/°Ó=ˆFÙ˜tÐ. vÑ.ˆHØ×,Ñ,¨TÔ2ØˆOr-   rŸ   )r)   rj   r`   r^   rž   s   ```` r*   rl   z,DefaultCommandExecutor.execute_pubsub_method(  s"   û€ ÷	ð 4ˆt×3Ñ3°HÐD¸tÒDÐDr-   c                 ó8   ‡ ‡‡— ˆˆ ˆfd„}‰ j                  |«      S )Nc                  ó>   •—  ‰j                   j                  ‰fi ‰ ¤ŽS r9   )r‚   Úrun_in_thread)r^   r)   rm   s   €€€r*   rž   z;DefaultCommandExecutor.execute_pubsub_run.<locals>.callback2  s!   ø€ Ø4�4×&Ñ&×4Ñ4°ZÑJÀ6ÑJÐJr-   rŸ   )r)   rm   r^   rž   s   ``` r*   ro   z)DefaultCommandExecutor.execute_pubsub_run1  s   ú€ ö	Kð ×3Ñ3°HÓ=Ð=r-   rž   Úcmdsc                 ó\   ‡ ‡‡‡— ˆˆ fd„Š‰ j                   j                  ˆfd„ˆˆ fd„«      S )zO
        Execute a commands execution callback with failure detection.
        c                  ó2   •— ‰j                  «         ‰ «       S r9   )Ú_check_active_database)rž   r)   s   €€r*   ÚwrapperzGDefaultCommandExecutor._execute_with_failure_detection.<locals>.wrapper<  s   ø€ à×'Ñ'Ô)Ù“:Ðr-   c                  ó   •—  ‰ «       S r9   r'   )r·   s   €r*   Ú<lambda>zHDefaultCommandExecutor._execute_with_failure_detection.<locals>.<lambda>B  s   ø€ ‘G”Ir-   c                 ó*   •—  ‰j                   | g‰¢­Ž S r9   )Ú_on_command_fail)Úerrorr³   r)   s    €€r*   r¹   zHDefaultCommandExecutor._execute_with_failure_detection.<locals>.<lambda>C  s   ø€ Ð/˜$×/Ñ/°Ð=¸Ó=r-   )r~   Úcall_with_retry)r)   rž   r³   r·   s   ```@r*   r    z6DefaultCommandExecutor._execute_with_failure_detection7  s)   û€ õ
	ð
 ×"Ñ"×2Ñ2ÛÜ=ó
ð 	
r-   c                 óN   — | j                   j                  t        ||«      «       y r9   )r€   r’   r   )r)   r¼   r`   s      r*   r»   z'DefaultCommandExecutor._on_command_failF  s   € Ø×Ñ×'Ñ'Ô(;¸DÀ%Ó(HÕIr-   c                 ó`  — | j                   �a| j                   j                  j                  t        j                  k7  s0| j
                  dkD  rb| j                  t        j                  «       k  r@| j                  j                  «       t        j                  f| _        | j                  «        yyy)zB
        Checks if active a database needs to be updated.
        Nr   )r�   ÚcircuitÚstateÚCBStateÚCLOSEDr;   rB   r   rA   r   r¤   r    Ú	AUTOMATICrQ   rC   r(   s    r*   r¶   z-DefaultCommandExecutor._check_active_databaseI  s�   € ð
 ×!Ñ!Ð)Ø×$Ñ$×,Ñ,×2Ñ2´g·n±nÒDà×,Ñ,¨qÒ0Ø×/Ñ/´8·<±<³>ÒAð ×0Ñ0×8Ñ8Ó:Ü!×+Ñ+ð$ˆDÔ ð ×(Ñ(Õ*ð Bð 1r-   Úcmdc                 óH   — | j                   D ]  }|j                  |«       Œ y r9   )r}   Úregister_command_execution)r)   rÅ   Údetectors      r*   rœ   z2DefaultCommandExecutor._register_command_execution[  s    € Ø×/Ô/ˆHØ×/Ñ/°Õ4ñ 0r-   c                 óª   — t        | j                  «      }t        «       }t        «       }| j                  j                  t        |gt        ||gi«       y)z0
        Registers necessary listeners.
        N)r   r}   r   r   r€   Úregister_listenersr   r   )r)   Úfailure_listenerÚresubscribe_listenerÚclose_connection_listeners       r*   r„   z.DefaultCommandExecutor._setup_event_dispatcher_  sW   € ô 2°$×2IÑ2IÓJÐÜAÓCÐÜ$JÓ$LÐ!Ø×Ñ×1Ñ1ä#Ð&6Ð%7Ü%Ø-Ø(ð(ðõ	
r-   )r%   r   )r'   ).r0   r1   r2   r   r   r   r	   r   r   r"   r   r   rD   r4   r<   r3   rH   rJ   rN   r\   r
   r   rQ   r5   r   r    r   rU   r   rZ   rb   rp   re   r   r   ri   rV   rq   rl   ro   r    r»   r¶   rœ   r„   Ú__classcell__)r†   s   @r*   rs   rs       sü  ø„ ð ";Ø 6Ø(Fñ('à Ñ0ð('ð ð('ð ð	('ð
 ,ð('ð 3ð('ð ð('ð ð('ð !&õ('ðT ð˜9ò ó ðð ð' 4¨Ñ#8ò 'ó ð'ð9°_ð 9Èó 9ð ð#˜uò #ó ð#ð ð% ¨,Ñ!7ò %ó ð%ð ×Ñð U¨<Ð9JÐ+JÑ%Kð ÐPTò ó ðð( ð#˜x¨Ñ/ò #ó ð#ð ×Ñð% Fð %¨tò %ó ð%ð ð0Ð,Dò 0ó ð0òDð
M¨eó 
Mð
>Ø# X J°Ð$4Ñ5ó
>ò>ðE°ó Eó>ñ
¸ð 
Èó 
òJò+ð$5¨uó 5ö
r-   rs   N)2Úabcr   r   r   r   Útypingr   r   r	   r
   r   Úredis.clientr   r   r   Úredis.eventr   r   Úredis.multidb.circuitr   rÂ   Úredis.multidb.configr   Úredis.multidb.databaser   r   r   Úredis.multidb.eventr   r   r   r   Úredis.multidb.failoverr   r   r   r   r   Úredis.multidb.failure_detectorr   Úredis.observability.attributesr    Úredis.observability.recorderr!   Úredis.retryr"   r$   r7   rF   rs   r'   r-   r*   Ú<module>rÜ      s�   ðß #ß (ß 7Õ 7ç =Ñ =ß EÝ 2Ý ?ß DÑ D÷ó ÷õ õ ;Ý <Ý <Ý ô�cô ô
˜/ô 
ô2Y˜/ô YôxN
Ð0Ð2Eõ N
r-   