1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Ë
 
çúh@.ãó2—ddlmZmZddlmZmZddlmZmZmZm    Z    ddl
m Z m Z m Z ddlmZmZddlmZddlmZddlmZmZmZdd    lmZmZmZmZdd
lm Z m!Z!m"Z"m#Z#m$Z$dd l%m&Z&dd l'm(Z(Gd „de«Z)Gd„de)«Z*Gd„de)«Z+Gd„de+e*«Z,y)é)ÚABCÚabstractmethod)ÚdatetimeÚ    timedelta)ÚAnyÚCallableÚListÚOptional)Ú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)ÚRetrycód—eZdZeedefd„««Zejededdfd„««Zy)ÚCommandExecutorÚreturncó—y)zReturns auto-fallback interval.N©©Úselfs õqH:\项目\archive\测试组\脚本\Change_password\venv_build\Lib\site-packages\redis/multidb/command_executor.pyÚauto_fallback_intervalz&CommandExecutor.auto_fallback_intervaló€ð     ór(Ncó—y)zSets 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—eZdZefdefd„Zedefd„«Zejde    ddfd„«Zdd„Z
y)    ÚBaseCommandExecutorr(có—||_|y©N©Ú_auto_fallback_intervalr,s  r'Ú__init__zBaseCommandExecutor.__init__*s€ð(>ˆÔ$Ú r*r"có—|jSr6r7r%s r'r(z*BaseCommandExecutor.auto_fallback_interval1s€à×+Ñ+Ð+r*Ncó—||_yr6r7r,s  r'r(z*BaseCommandExecutor.auto_fallback_interval5s
€à'=ˆÕ$r*cóŒ—|jtk(rytj«t    |j¬«z|_y)N)Úseconds)r8rrÚnowrÚ_next_fallback_attemptr%s r'Ú_schedule_next_fallbackz+BaseCommandExecutor._schedule_next_fallback9s7€Ø × 'Ñ 'Ô+IÒ IØ ä&.§l¡l£n´yØ×0Ñ0ô8
ñ'
ˆÕ#r*)r"N) r-r.r/rr1r9r0r(r2Úintr@r$r*r'r4r4)s]„ð)Gñ.à %ó.ðð,¨ò,óð,ð×"Ñ"ð>¸Sð>ÀTò>ó#ð>ô
r*r4cóð—eZdZeedefd„««Zeedeefd„««Z    ededdfd„«Z
eede e fd„««Z e jededdfd    „««Z eede efd
„««Zejed eddfd „««Zeedefd „««Zeedefd„««Zed„«Zed„«Zedefd„«Zedeegdffd„«Zedefd„«Zedede fd„«Z!y)ÚSyncCommandExecutorr"có—y)zReturns a list of databases.Nr$r%s r'Ú    databaseszSyncCommandExecutor.databasesCr)r*có—y)z$Returns a list of failure detectors.Nr$r%s r'Úfailure_detectorsz%SyncCommandExecutor.failure_detectorsIr)r*Úfailure_detectorNcó—y)z=Adds a new failure detector to the list of failure detectors.Nr$©r&rHs  r'Úadd_failure_detectorz(SyncCommandExecutor.add_failure_detectorOó€ð     r*có—y)z"Returns currently active database.Nr$r%s r'Úactive_databasez#SyncCommandExecutor.active_databaseTr)r*Údatabasecó—y)z#Sets the currently active database.Nr$)r&rOs  r'rNz#SyncCommandExecutor.active_databaseZr)r*có—y)z Returns currently active pubsub.Nr$r%s r'Ú active_pubsubz!SyncCommandExecutor.active_pubsub`r)r*Úpubsubcó—y)zSets currently active pubsub.Nr$©r&rSs  r'rRz!SyncCommandExecutor.active_pubsubfr)r*có—y)z#Returns failover strategy executor.Nr$r%s r'Úfailover_strategy_executorz.SyncCommandExecutor.failover_strategy_executorlr)r*có—y)zReturns command retry object.Nr$r%s r'Ú command_retryz!SyncCommandExecutor.command_retryrr)r*c ó—y)z:Initializes a PubSub object on a currently active databaseNr$)r&Úkwargss  r'rSzSyncCommandExecutor.pubsubxrLr*có—y)z*Executes a command and returns the result.Nr$)r&ÚargsÚoptionss   r'Úexecute_commandz#SyncCommandExecutor.execute_command}rLr*Ú command_stackcó—y)z)Executes a stack of commands in pipeline.Nr$)r&r`s  r'Úexecute_pipelinez$SyncCommandExecutor.execute_pipeline‚rLr*Ú transactioncó—y)z1Executes a transaction block wrapped in callback.Nr$)r&rcÚwatchesr^s    r'Úexecute_transactionz'SyncCommandExecutor.execute_transaction‡s€ð
     r*Ú method_namecó—y)z*Executes a given method on active pub/sub.Nr$)r&rgr]r[s    r'Úexecute_pubsub_methodz)SyncCommandExecutor.execute_pubsub_methodŽrLr*Ú
sleep_timec ó—y)z!Executes pub/sub run in a thread.Nr$)r&rjr[s   r'Úexecute_pubsub_runz&SyncCommandExecutor.execute_pubsub_run“rLr*)"r-r.r/r0rrrEr    rrGrKr
rrNr2rr rRrrWrrYrSr_Útuplerbrr rfÚstrrir1rrlr$r*r'rCrCBs „Ø Øð ˜9ò óóð ðØð  4¨Ñ#8ò óóð ðð °_ð Èò óð ðØð  ¨(Ñ!3ò óóð ð×ÑØð ¨ ð ¸ò óóð ðØð ˜x¨Ñ/ò óóð ð×ÑØð  Fð ¨tò óóð ðØð Ð,Dò óóð ðØð ˜uò óóð ðñ óð ðñ óð ðð ¨eò óð ðð Ø# X J°Ð$4Ñ5ò óð ð ð °ò óð ðð ¨Uð Àò óñ r*rCcóć—eZdZeeefdeedede    de
de de de de fˆfd    „ Zed
efd „«Zed
eefd „«Zd ed
dfd„Zed
e    fd„«Zed
eefd„«Zej.ded
dfd„«Zed
eefd„«Zej.ded
dfd„«Zed
efd„«Zd„Zdefd„Zdee gdffd„Z!d„Z"de#fd„Z$d)d „Z%d*d!ed"efd#„Z&d$„Z'd%„Z(d&efd'„Z)d(„Z*ˆxZ+S)+ÚDefaultCommandExecutorrGrErYÚ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)Úsuperr9Úset_command_executorÚ
_databasesÚ_failure_detectorsÚ_command_retryrÚ_failover_strategy_executorÚ_event_dispatcherÚ_active_databaseÚ_active_pubsubÚ_active_pubsub_kwargsÚ_setup_event_dispatcherr@) r&rGrErYrqrrrsrtr(ÚfdÚ    __class__s           €r'r9zDefaultCommandExecutor.__init__šs›ø€ô0    ‰ÑÐ/Ô0à#ò    ;ˆBØ × #Ñ #°TÐ #Õ :ð    ;ð$ˆŒØ"3ˆÔØ+ˆÔÜ+JØ Ð0°.ó,
ˆÔ(ð"2ˆÔØ48ˆÔØ04ˆÔØ%'ˆÔ"Ø ×$Ñ$Ô&Ø ×$Ñ$Õ&r*r"có—|jSr6)ryr%s r'rEz DefaultCommandExecutor.databasesÄs €à‰Ðr*có—|jSr6)rzr%s r'rGz(DefaultCommandExecutor.failure_detectorsÈs€à×&Ñ&Ð&r*rHNcó:—|jj|«yr6)rzÚappendrJs  r'rKz+DefaultCommandExecutor.add_failure_detectorÌs€Ø ×Ñ×&Ñ&Ð'7Õ8r*có—|jSr6)r{r%s r'rYz$DefaultCommandExecutor.command_retryÏó€à×"Ñ"Ð"r*có—|jSr6)r~r%s r'rNz&DefaultCommandExecutor.active_databaseÓs€à×$Ñ$Ð$r*rOcó°—|j}||_|A||ur<|jjt||j|fi|j¤Ž«yyyr6)r~r}Údispatchrr€)r&rOÚ
old_actives   r'rNz&DefaultCommandExecutor.active_database×sf€à×*Ñ*ˆ
Ø (ˆÔà Ð ! j¸Ñ&@Ø × "Ñ "× +Ñ +Ü%ØØ×)Ñ)Øñð×0Ñ0ñ    õ ð'AÐ !r*có—|jSr6©rr%s r'rRz$DefaultCommandExecutor.active_pubsubær‰r*rScó—||_yr6rrUs  r'rRz$DefaultCommandExecutor.active_pubsubês
€à$ˆÕr*có—|jSr6)r|r%s r'rWz1DefaultCommandExecutor.failover_strategy_executorîs€à×/Ñ/Ð/r*có:‡‡‡—ˆˆˆfd„}‰j|‰«S)Ncóv•—‰jjj‰i‰¤Ž}‰j‰«|Sr6)r~Úclientr_Ú_register_command_execution)Úresponser]r^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]r^r—s``` r'r_z&DefaultCommandExecutor.execute_commandòsú€ö    ð
×3Ñ3°H¸dÓCÐCr*r`có6‡‡—ˆˆfd„}‰j|‰«S)Ncóö•—‰jjj«5}‰D]\}}|j|i|¤ŽŒ|j    «}‰j ‰«|cddd«S#1swYyxYwr6)r~r”Úpipeliner_Úexecuter•)ÚpipeÚcommandr^r–r`r&s    €€r'r—z9DefaultCommandExecutor.execute_pipeline.<locals>.callbackûsyø€Ø×&Ñ&×-Ñ-×6Ñ6Ó8ð  ¸DØ(5ò>Ñ$G˜WØ(D×(Ñ(¨'Ð=°WÓ=ð>ð Ÿ<™<›>Ø×0Ñ0°Ô?Ø÷   ÷  ò  ús ¦?A/Á/A8r˜)r&r`r—s`` r'rbz'DefaultCommandExecutor.execute_pipelineúsù€õ     ð×3Ñ3°H¸mÓLÐLr*rccó<‡‡‡‡—ˆˆˆˆfd„}‰j|«S)Ncó~•—‰jjj‰g‰¢­i‰¤Ž}‰jd«|S©Nr$)r~r”rcr•)r–r^r&rcres €€€€r'r—z<DefaultCommandExecutor.execute_transaction.<locals>.callback    sIø€Ø?t×,Ñ,×3Ñ3×?Ñ?ØðØ%òØ)0ñˆHð × ,Ñ ,¨RÔ 0؈Or*r˜)r&rcrer^r—s```` r'rfz*DefaultCommandExecutor.execute_transactionsû€÷    ð×3Ñ3°HÓ=Ð=r*c ó4‡‡—ˆˆfd„}‰j|«S)Ncó‚•—‰j€2‰jjjdi‰¤Ž‰_‰‰_yr¢)rr~r”rSr€)r[r&s€€r'r—z/DefaultCommandExecutor.pubsub.<locals>.callbacks>ø€Ø×"Ñ"Ð*Ø&I d×&;Ñ&;×&BÑ&B×&IÑ&IÑ&SÈFÑ&SÔ#Ø-3Ô*Ør*r˜)r&r[r—s`` r'rSzDefaultCommandExecutor.pubsubsù€õ    ð ×3Ñ3°HÓ=Ð=r*rgcó@‡‡‡‡—ˆˆˆˆfd„}‰j|g‰¢­ŽS)Ncóf•—t‰j‰«}|‰i‰¤Ž}‰j‰«|Sr6)ÚgetattrrRr•)Úmethodr–r]r[rgr&s  €€€€r'r—z>DefaultCommandExecutor.execute_pubsub_method.<locals>.callbacks7ø€Ü˜T×/Ñ/°Ó=ˆFÙ˜tÐ. vÑ.ˆHØ × ,Ñ ,¨TÔ 2؈Or*r˜)r&rgr]r[r—s```` r'riz,DefaultCommandExecutor.execute_pubsub_methods"û€÷    ð 4ˆt×3Ñ3°HÐD¸tÒDÐDr*c ó8‡‡‡—ˆˆˆfd„}‰j|«S)Ncó>•—‰jj‰fi‰¤ŽSr6)rÚ run_in_thread)r[r&rjs€€€r'r—z;DefaultCommandExecutor.execute_pubsub_run.<locals>.callback%s!ø€Ø44×&Ñ&×4Ñ4°ZÑJÀ6ÑJÐ Jr*r˜)r&rjr[r—s``` r'rlz)DefaultCommandExecutor.execute_pubsub_run$sú€ö    Kð×3Ñ3°HÓ=Ð=r*r—Úcmdscó\‡‡‡‡—ˆˆfd„Љjjˆfd„ˆˆfd„«S)zO
        Execute a commands execution callback with failure detection.
        có2•—‰j«‰«Sr6)Ú_check_active_database)r—r&s€€r'ÚwrapperzGDefaultCommandExecutor._execute_with_failure_detection.<locals>.wrapper/sø€à × 'Ñ 'Ô )Ù“:Ð r*có•—‰«Sr6r$)r°s€r'ú<lambda>zHDefaultCommandExecutor._execute_with_failure_detection.<locals>.<lambda>5s    ø€‘G“I€r*có*•—‰j|g‰¢­ŽSr6)Ú_on_command_fail)Úerrorr¬r&s €€r'r²zHDefaultCommandExecutor._execute_with_failure_detection.<locals>.<lambda>6sø€Ð/˜$×/Ñ/°Ð=¸Ò=€r*)r{Úcall_with_retry)r&r—r¬r°s```@r'r™z6DefaultCommandExecutor._execute_with_failure_detection*s)û€õ
    ð
×"Ñ"×2Ñ2Û Ü =ó
ð    
r*cóN—|jjt||««yr6)r}rŒr)r&rµr]s   r'r´z'DefaultCommandExecutor._on_command_fail9s€Ø ×Ñ×'Ñ'Ô(;¸DÀ%Ó(HÕIr*cóH—|je|jjjtjk7s4|j
t k7rR|jtj«kr0|jj«|_ |j«yyy)zB
        Checks if active a database needs to be updated.
        N)r~ÚcircuitÚstateÚCBStateÚCLOSEDr8rr?rr>r|rrNr@r%s r'r¯z-DefaultCommandExecutor._check_active_database<s‚€ð
× !Ñ !Ð )Ø×$Ñ$×,Ñ,×2Ñ2´g·n±nÒDà×,Ñ,Ô0NÒNØ×/Ñ/´8·<±<³>ÒAð$(×#CÑ#C×#KÑ#KÓ#MˆDÔ  Ø × (Ñ (Õ *ð    BðOr*ÚcmdcóH—|jD]}|j|«Œyr6)rzÚregister_command_execution)r&r½Údetectors   r'r•z2DefaultCommandExecutor._register_command_executionKs%€Ø×/Ñ/ò    5ˆHØ × /Ñ /°Õ 4ñ    5r*cóª—t|j«}t«}t«}|jj t |gt||gi«y)z0
        Registers necessary listeners.
        N)rrzrrr}Úregister_listenersrr)r&Úfailure_listenerÚresubscribe_listenerÚclose_connection_listeners    r'rz.DefaultCommandExecutor._setup_event_dispatcherOsW€ô2°$×2IÑ2IÓJÐÜAÓCÐÜ$JÓ$LÐ!Ø ×Ñ×1Ñ1ä#Ð&6Ð%7Ü%Ø-Ø(ð(ð õ    
r*)r"r )r$),r-r.r/rrrr    rrrrrrAr1r9r0rErGrKrYr
rrNr2r rRrrWr_rmrbrr rfrSrnrirlr™r´r¯r•rÚ __classcell__)rƒs@r'rprp™sðø„ð";Ø 6Ø(Fñ('à Ñ0ð('ðð('ðð    ('ð
,ð ('ð 3ð ('ðð('ðð('ð!&õ('ðTð˜9òóððð' 4¨Ñ#8ò'óð'ð9°_ð9Èó9ðð#˜uò#óð#ðð% ¨,Ñ!7ò%óð%ð×Ñð ¨ ð ¸ò óð ðð#˜x¨Ñ/ò#óð#ð×Ñð% Fð%¨tò%óð%ðð0Ð,Dò0óð0òDð
M¨eó
Mð
>Ø# X J°Ð$4Ñ5ó
>ò>ðE°óEó>ñ 
¸ð 
Èó 
òJò +ð5¨uó5ö
r*rpN)-ÚabcrrrrÚtypingrrr    r
Ú redis.clientr r r Ú redis.eventrrÚredis.multidb.circuitrr»Úredis.multidb.configrÚredis.multidb.databaserrrÚredis.multidb.eventrrrrÚredis.multidb.failoverrrrrrÚredis.multidb.failure_detectorrÚ redis.retryrr!r4rCrpr$r*r'ú<module>rÒs{ðß#ß(ß0Ó0ç=Ñ=ßEÝ2Ý?ßDÑD÷ó÷ õõ;Ýô  cô  ô
˜/ô
ô2T ˜/ôT ônE
Ð0Ð2EõE
r*