Ë
    Ü_ËiåN  ã                  óÖ  — d Z ddlmZ ddlZddlZddlZddl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 ddl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 ddl m!Z! ddl"m#Z# ddl$m%Z% e	rddl&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- dZ.d"d„Z/d#d„Z0 G d„ d«      Z1 G d„ de1«      Z2 G d„ de1«      Z3 G d„ de1«      Z4 e5«       Z6d$d„Z7d%d„Z8d&d „Z9d&d!„Z:e.r ejv                  e:«       yy)'z9Class to monitor a MongoDB server on a background thread.é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚOptional)ÚcommonÚperiodic_executor)ÚMovingMinimum)Ú_SrvResolver)ÚNetworkTimeoutÚ_OperationCancelled)ÚHello)Ú_async_create_lock)Ú_SDAM_LOGGERÚ
_debug_logÚ_SDAMStatusMessage)Ú_shutdown_executors)Ú_is_faas)ÚMovingAverage)ÚServerDescription)ÚAsyncConnectionÚPoolÚ_CancellationContext)ÚTopologySettings)ÚTopologyFc                ó.   — d| _         d| _        d| _        y)z'PYTHON-2433 Clear error traceback info.N)Ú__traceback__Ú__context__Ú	__cause__©Úerrors    ú_/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/pymongo/asynchronous/monitor.pyÚ	_sanitizer"   2   s   € à€EÔØ€EÔØ€E…Oó    c                óD   — t        dt        j                  «       | z
  «      S )z”Return the duration since the given start time.

    Accounts for buggy platforms where time.monotonic() is not monotonic.
    See PYTHON-4600.
    g        )ÚmaxÚtimeÚ	monotonic)Ústarts    r!   Ú_monotonic_durationr)   9   s   € ô ˆs”D—N‘NÓ$ uÑ,Ó-Ð-r#   c                  ó<   — e Zd Zdd„Zd	d„Zd	d„Zd	d„Zd	d„Zd	d„Zy)
ÚMonitorBasec                óì   ‡— dˆfd„}t        j                  ||||¬«      }|| _        ddˆfd„}t        j                  | |j
                  «      Št        j                  ||«      | _        t        | «       y)z§Base class to do periodic work on a background thread.

        The background thread is signaled to stop when the Topology or
        this instance is freed.
        c               “  óV   •K  —  ‰«       } | €y| j                  «       ƒ d {  –—†  y7 Œ­w)NFT)Ú_run)ÚmonitorÚself_refs    €r!   Útargetz$MonitorBase.__init__.<locals>.targetL   s-   øè ø€ Ù“jˆGØˆØØ—,‘,“.× Ð Øð !ús   ƒ)¡'¢))ÚintervalÚmin_intervalr1   ÚnameNc                ó:   •—  ‰«       }|r|j                  «        y y ©N©Úgc_safe_close)Údummyr/   r0   s     €r!   Ú_on_topology_gcz-MonitorBase.__init__.<locals>._on_topology_gcY   s    ø€ ñ “jˆGÙØ×%Ñ%Õ'ð r#   )ÚreturnÚboolr6   )r9   zOptional[Topology]r;   ÚNone)	r   ÚAsyncPeriodicExecutorÚ	_executorÚweakrefÚrefÚcloseÚproxyÚ	_topologyÚ	_register)	ÚselfÚtopologyr4   r2   r3   r1   Úexecutorr:   r0   s	           @r!   Ú__init__zMonitorBase.__init__C   s`   ø€ õ	ô %×:Ñ:Ø¨LÀÈdô
ˆð "ˆŒö	(ô —;‘;˜t X§^¡^Ó4ˆÜ Ÿ™ x°ÓAˆŒÜ�$�r#   c                ó8   — | j                   j                  «        y)z[Start monitoring, or restart after a fork.

        Multiple calls have no effect.
        N)r?   Úopen©rF   s    r!   rK   zMonitorBase.opene   s   € ð
 	�‰×ÑÕr#   c                ó8   — | j                   j                  «        y)zGC safe close.N)r?   rB   rL   s    r!   r8   zMonitorBase.gc_safe_closel   s   € à�‰×ÑÕr#   c              ƒ  ó,   K  — | j                  «        y­w)zWClose and stop monitoring.

        open() restarts the monitor after closing.
        Nr7   rL   s    r!   rB   zMonitorBase.closep   s   è ø€ ð
 	×ÑÕùs   ‚c              ƒ  óT   K  — | j                   j                  «       ƒ d{  –—†  y7 Œ­w)zWait for the monitor to stop.N)r?   ÚjoinrL   s    r!   rP   zMonitorBase.joinw   s   è ø€ à�n‰n×!Ñ!Ó#×#Ò#úó   ‚( &¡(c                ó8   — | j                   j                  «        y)z)If the monitor is sleeping, wake it soon.N)r?   ÚwakerL   s    r!   Úrequest_checkzMonitorBase.request_check{   s   € à�‰×ÑÕr#   N)rG   r   r4   Ústrr2   Úintr3   Úfloat©r;   r=   )	Ú__name__Ú
__module__Ú__qualname__rI   rK   r8   rB   rP   rT   © r#   r!   r+   r+   B   s!   „ ó óDóóó$ôr#   r+   c                  ó€   ‡ — e Zd Z	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zdd
„Zdd„Zˆ xZS )ÚMonitorc                ó  •— t         ‰| �  |d|j                  t        j                  «       || _        || _        || _        | j                  j                  j                  | _
        | j                  duxr | j                  j                  | _        d| _        d| _        t        |||j!                  |j"                  «      «      | _        |j&                  dk(  rd| _        y|j&                  dk(  rd| _        yt+        «        | _        y)a   Class to monitor a MongoDB server on a background thread.

        Pass an initial ServerDescription, a Topology, a Pool, and
        TopologySettings.

        The Topology is weakly referenced. The Pool must be exclusive to this
        Monitor.
        Úpymongo_server_monitor_taskNÚstreamTÚpollF)ÚsuperrI   Úheartbeat_frequencyr   ÚMIN_HEARTBEAT_INTERVALÚ_server_descriptionÚ_poolÚ	_settingsÚ_pool_optionsÚ_event_listenersÚ
_listenersÚenabled_for_server_heartbeatÚ_publishÚ_cancel_contextÚ_conn_idÚ_RttMonitorÚ_create_pool_for_monitorÚaddressÚ_rtt_monitorÚserver_monitoring_modeÚ_streamr   )rF   Úserver_descriptionrG   ÚpoolÚtopology_settingsÚ	__class__s        €r!   rI   zMonitor.__init__�   sæ   ø€ ô 	‰ÑØØ)Ø×1Ñ1Ü×)Ñ)ô		
ð $6ˆÔ ØˆŒ
Ø*ˆŒØŸ.™.×6Ñ6×GÑGˆŒØŸ™¨tÐ3Òd¸¿¹×8dÑ8dˆŒØ?CˆÔØ'+ˆŒÜ'ØØØ×-Ñ-Ð.@×.HÑ.HÓIó
ˆÔð
 ×3Ñ3°xÒ?ØˆD�LØ×5Ñ5¸Ò?Ø ˆD�Lä'›z˜>ˆD�Lr#   c                óB   — | j                   }|r|j                  «        yy)zŒCancel any concurrent hello check.

        Note: this is called from a weakref.proxy callback and MUST NOT take
        any locks.
        N)rn   Úcancel)rF   Úcontexts     r!   Úcancel_checkzMonitor.cancel_check©   s#   € ð ×&Ñ&ˆÙð �N‰NÕð	 r#   c              ƒ  ó¶   K  — | j                   j                  «        | j                  j                  r#| j                   j	                  «       ƒ d{  –—†  yy7 Œ­w)z1Start an _RttMonitor that periodically runs ping.N)rs   rK   r?   Ú_stoppedrB   rL   s    r!   Ú_start_rtt_monitorzMonitor._start_rtt_monitor¶   sG   è ø€ ð
 	×Ñ×ÑÔ Ø�>‰>×"Ò"Ø×#Ñ#×)Ñ)Ó+×+Ñ+ð #Ø+ús   ‚AAÁAÁAc                óŒ   — | j                   j                  «        | j                  j                  «        | j	                  «        y r6   )r?   rB   rs   r8   r}   rL   s    r!   r8   zMonitor.gc_safe_close¿   s0   € Ø�‰×ÑÔØ×Ñ×'Ñ'Ô)Ø×ÑÕr#   c              ƒ  ó°   K  — t        j                  | j                  j                  «       | j                  j                  «       d¬«      ƒ d {  –—†  y 7 Œ­w)NT)Úreturn_exceptions)ÚasyncioÚgatherr?   rP   rs   rL   s    r!   rP   zMonitor.joinÄ   s?   è ø€ Ü�n‰nØ�N‰N×ÑÓ! 4×#4Ñ#4×#9Ñ#9Ó#;Ètô
÷ 	
ò 	
ús   ‚AAÁAÁAc              ƒ  ó¨   K  — | j                  «        | j                  j                  «       ƒ d {  –—†  | j                  «       ƒ d {  –—†  y 7 Œ7 Œ­wr6   )r8   rs   rB   Ú_reset_connectionrL   s    r!   rB   zMonitor.closeÉ   sI   è ø€ Ø×ÑÔØ×Ñ×%Ñ%Ó'×'Ð'ð ×$Ñ$Ó&×&Ñ&ð 	(øð 	'ús!   ‚.A°A±AÁAÁ	AÁAc              ƒ  óT   K  — | j                   j                  «       ƒ d {  –—†  y 7 Œ­wr6   )rg   ÚresetrL   s    r!   r‡   zMonitor._reset_connectionÐ   s   è ø€ à�j‰j×ÑÓ × Ò úrQ   c              ƒ  ó   K  — 	 | j                   }	 | j                  «       ƒ d {  –—† | _         | j                  j                  | j                   | j                   j                  t        | j                   j                  t         «      ¬«      ƒ d {  –—†  | j"                  r^| j                   j                  rH| j                   j$                  r2| j'                  «       ƒ d {  –—†  | j                  j                  «        | j                   j                  r&|j                  r| j                  j                  «        | j                  j                  r#| j                  j                  «       ƒ d {  –—†  y y 7 �ŒP# t        $ r›}t        |«       t	        | j                   j
                  |¬«      | _         |j                  r| j                  j                  «        Y d }~| j                  j                  r$| j                  j                  «       ƒ d {  –—†7   y y d }~ww xY w7 �Œ�7 �ŒB# t(        $ r | j                  «       ƒ d {  –—†7   Y �Œw xY w7 Œß# | j                  j                  r$| j                  j                  «       ƒ d {  –—†7   w w xY w­w)Nr   )Ú
reset_poolÚinterrupt_connections)rf   Ú_check_serverr   r"   r   rr   Úis_server_type_knownr?   Ú
skip_sleepr   rs   rB   rD   Ú	on_changer    Ú
isinstancer   ru   Útopology_versionr€   ÚReferenceError)rF   Úprev_sdÚexcs      r!   r.   zMonitor._runÔ   s  è ø€ ð'	0Ø×.Ñ.ˆGðØ15×1CÑ1CÓ1E×+E�Ô(ð —.‘.×*Ñ*Ø×(Ñ(Ø×3Ñ3×9Ñ9Ü&0°×1IÑ1I×1OÑ1OÔQ_Ó&`ð +ó ÷ ð ð �|Š|Ø×(Ñ(×=Ò=Ø×,Ñ,×=Ò=à×-Ñ-Ó/×/Ð/à—‘×)Ñ)Ô+à×'Ñ'×-Ò-°'×2NÒ2Nà—‘×)Ñ)Ô+ð
 �~‰~×&Ò&Ø×'Ñ'×-Ñ-Ó/×/Ñ/ð 'ðG ,FúÜ&ò 
Ü˜#”ä+<Ø×,Ñ,×4Ñ4¸Cô,�Ô(ð ×/Ò/ð —N‘N×-Ñ-Ô/Ûð0 �~‰~×&Ò&Ø×'Ñ'×-Ñ-Ó/×/Ò/ð 'ûðE
úðùð 0úô ò 	à—*‘*“,×Ôð	úð
 0ùð �~‰~×&Ò&Ø×'Ñ'×-Ñ-Ó/×/Ò/ð 'üsÊ   ‚J„H$ ‘E7 ¤E4¥	E7 ®A!H$ ÂHÂAH$ ÃH!Ã AH$ Ä:3JÅ-IÅ.JÅ4E7 Å7	HÆ AHÇH$ Ç3JÈHÈJÈHÈH$ È!H$ È$I
É IÉI
ÉI É	I
É
I ÉJÉ4JÊJÊJÊJc              ƒ  óx  K  — d| _         t        j                  «       }	 | j                  «       ƒ d{  –—† S 7 Œ# t        $ r ‚ t
        $ �rk}t        |«       | j                  }|j                  }t        |«      }t        | j                  xr |j                  xr |j                  «      }| j                  r,| j                  €J ‚| j                  j!                  ||||«       t#        j$                  t&        j(                  «      rMt+        t"        t,        j.                  | j0                  j2                  |d   |d   ||dz  || j                   ¬«	       | j5                  «       ƒ d{  –—†7   t7        |t8        «      r‚ | j:                  j=                  «       ƒ d{  –—†7   t?        ||¬«      cY d}~S d}~ww xY w­w)z^Call hello or read the next streaming response.

        Returns a ServerDescription.
        Nr   é   éè  )ÚmessageÚ
topologyIdÚ
serverHostÚ
serverPortÚawaitedÚ
durationMSÚfailureÚdriverConnectionIdr   ) ro   r&   r'   Ú_check_oncer“   Ú	Exceptionr"   rf   rr   r)   r<   ru   rŽ   r’   rm   rk   Úpublish_server_heartbeat_failedr   ÚisEnabledForÚloggingÚDEBUGr   r   ÚHEARTBEAT_FAILrD   Ú_topology_idr‡   r‘   r   rs   r‰   r   )rF   r(   r    Úsdrr   Údurationr�   s          r!   r�   zMonitor._check_serverþ   sf  è ø€ ð
 ˆŒÜ—‘Ó ˆð	;Ø×)Ñ)Ó+×+Ð+Ð+ùÜò 	ØÜó 	;Ü�eÔØ×)Ñ)ˆBØ—j‘jˆGÜ*¨5Ó1ˆHÜ˜4Ÿ<™<Ò[¨B×,CÑ,CÒ[È×H[ÑH[Ó\ˆGØ�}Š}Ø—‘Ð2Ð2Ð2Ø—‘×?Ñ?ÀÈÐSXÐZaÔbÜ×(Ñ(¬¯©Ô7ÜÜ Ü.×=Ñ=Ø#Ÿ~™~×:Ñ:Ø& q™zØ& q™zØ#Ø'¨$™Ø!Ø'+§}¡}õ
ð ×(Ñ(Ó*×*Ñ*Ü˜%Ô!4Ô5ØØ×#Ñ#×)Ñ)Ó+×+Ñ+ä$ W°EÔ:Õ:ûð5	;üsV   ‚F:Ÿ9 ²7³9 ¶F:·9 ¹F7ÁDF2Å&E)Å'3F2ÆFÆF2Æ,F7Æ-F:Æ2F7Æ7F:c              ƒ  ó2  K  — | j                   j                  }| j                   }t        | j                  j                  xr( | j
                  xr |j                  xr |j                  «      }| j                  r*| j                  €J ‚| j                  j                  ||«       | j                  r.| j                  j                  r| j                  «       ƒ d{  –—†  | j                  j                  «       4 ƒd{  –—† }t        j                   t"        j$                  «      rSt'        t        t(        j*                  | j,                  j.                  |j0                  |j2                  |d   |d   |¬«       |j4                  | _        |j0                  | _        | j9                  |«      ƒ d{  –—† \  }}|j:                  s#| j<                  j?                  |«      ƒ d{  –—†  | j<                  jA                  «       ƒ d{  –—† \  }}tC        ||||¬«      }| j                  r6| j                  €J ‚| j                  jE                  ||||j:                  «       t        j                   t"        j$                  «      rbt'        t        t(        jF                  | j,                  j.                  |j0                  |j2                  |d   |d   ||dz  |jH                  ¬«
       |cddd«      ƒd{  –—†  S 7 �Œ7 �Œù7 �ŒK7 �Œ7 Œü7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)zfA single attempt to call hello.

        Returns a ServerDescription, or raises an exception.
        Nr   r—   )r™   rš   r    ÚserverConnectionIdr›   rœ   r�   )Úmin_round_trip_timer˜   )	r™   rš   r    r¬   r›   rœ   r�   rž   Úreply)%rf   rr   r<   rg   Úconnsru   rŽ   r’   rm   rk   Ú publish_server_heartbeat_startedrn   Ú	cancelledr‡   Úcheckoutr   r¤   r¥   r¦   r   r   ÚHEARTBEAT_STARTrD   r¨   ÚidÚserver_connection_idÚcancel_contextro   Ú_check_with_socketÚ	awaitablers   Ú
add_sampleÚgetr   Ú"publish_server_heartbeat_succeededÚHEARTBEAT_SUCCESSÚdocument)	rF   rr   r©   r�   ÚconnÚresponseÚround_trip_timeÚavg_rttÚmin_rtts	            r!   r¡   zMonitor._check_once%  s‰  è ø€ ð
 ×*Ñ*×2Ñ2ˆØ×%Ñ%ˆô Ø�J‰J×ÑÒa §¡Òa°"×2IÑ2IÒaÈb×NaÑNaó
ˆð �=Š=Ø—?‘?Ð.Ð.Ð.Ø�O‰O×<Ñ<¸WÀgÔNà×Ò D×$8Ñ$8×$BÒ$BØ×(Ñ(Ó*×*Ð*Ø—:‘:×&Ñ&Ó(÷ (	ð (	¨DÜ×(Ñ(¬¯©Ô7ÜÜ Ü.×>Ñ>Ø#Ÿ~™~×:Ñ:Ø'+§w¡wØ'+×'@Ñ'@Ø& q™zØ& q™zØ#õ	ð $(×#6Ñ#6ˆDÔ à ŸG™GˆDŒMØ.2×.EÑ.EÀdÓ.K×(KÑ%ˆH�oØ×%Ò%Ø×'Ñ'×2Ñ2°?ÓC×CÐCà%)×%6Ñ%6×%:Ñ%:Ó%<×<ÑˆG�WÜ" 7¨H°gÐSZÔ[ˆBØ�}Š}Ø—‘Ð2Ð2Ð2Ø—‘×BÑBØ˜_¨h¸×8JÑ8Jôô ×(Ñ(¬¯©Ô7ÜÜ Ü.×@Ñ@Ø#Ÿ~™~×:Ñ:Ø'+§w¡wØ'+×'@Ñ'@Ø& q™zØ& q™zØ#Ø.°Ñ5Ø"×+Ñ+õð ÷Q(	÷ (	ñ (	ð +ùð(	ùð  )LùàCùà<øð)(	ø÷ (	÷ (	ñ (	üs’   ‚CLÃK2Ã"LÃ<K5Ã=LÄ B-LÆ-K8Æ.1LÇK;Ç !LÈK>ÈCLË LË,L Ë-LË5LË8LË;LË>LÌ LÌLÌLÌ	LÌLc              ƒ  óÒ  K  — t        j                  «       }|j                  r$t        |j	                  «       ƒ d{  –—† d¬«      }n‹| j
                  re|j                  rY| j                  j                  rC|j                  | j                  j                  | j                  j                  «      ƒ d{  –—† }n|j                  dd«      ƒ d{  –—† }t        |«      }||fS 7 Œ¥7 Œ07 Œ­w)zcReturn (Hello, round_trip_time).

        Can raise ConnectionFailure or OperationFailure.
        NT)r¸   )r&   r'   Úmore_to_comer   Ú_next_replyru   Úperformed_handshakerf   r’   Ú_hellorh   rd   r)   )rF   r¾   r(   r¿   rª   s        r!   r·   zMonitor._check_with_socketb  s¾   è ø€ ô
 —‘Ó ˆØ×Òä 4×#3Ñ#3Ó#5×5ÀÔF‰Hà�LŠL˜T×5Ò5¸$×:RÑ:R×:cÒ:cð "Ÿ[™[Ø×(Ñ(×9Ñ9Ø—‘×2Ñ2ó÷ ‰Hð "Ÿ[™[¨¨tÓ4×4ˆHÜ& uÓ-ˆØ˜Ð!Ð!ð 6øð
øð 5ús4   ‚9C'»C!¼A6C'Â2C#Â3C'ÃC%ÃC'Ã#C'Ã%C')rv   r   rG   r   rw   r   rx   r   rX   )r;   r   )r¾   r   r;   ztuple[Hello, float])rY   rZ   r[   rI   r}   r€   r8   rP   rB   r‡   r.   r�   r¡   r·   Ú__classcell__©ry   s   @r!   r^   r^   €   sd   ø„ ð&*à-ð&*ð ð&*ð ð	&*ð
 ,õ&*óPó,óó

ó
'ó!ó(0óT%;óN;÷z"r#   r^   c                  ó0   ‡ — e Zd Zdˆ fd„Zdd„Zdd„Zˆ xZS )Ú
SrvMonitorc                óR  •— t         ‰| �  |dt        j                  |j                  «       || _        | j
                  j                  | _        t        | j
                  j                  t        «      sJ ‚| j
                  j                  | _        t        j                  «       | _        y)z—Class to poll SRV records on a background thread.

        Pass a Topology and a TopologySettings.

        The Topology is weakly referenced.
        Úpymongo_srv_polling_threadN)rc   rI   r   ÚMIN_SRV_RESCAN_INTERVALrd   rh   Ú_seedsÚ	_seedlistr‘   ÚfqdnrU   Ú_fqdnr&   r'   Ú_startup_time)rF   rG   rx   ry   s      €r!   rI   zSrvMonitor.__init__{  s~   ø€ ô 	‰ÑØØ(Ü×*Ñ*Ø×1Ñ1ô		
ð +ˆŒØŸ™×.Ñ.ˆŒÜ˜$Ÿ.™.×-Ñ-¬sÔ3Ð3Ð3ØŸ.™.×-Ñ-ˆŒ
Ü!Ÿ^™^Ó-ˆÕr#   c              ƒ  ój  K  — t        j                  «       | j                  t        j                  z   k  ry | j                  «       ƒ d {  –—† }|r6|| _        	 | j                  j                  | j                  «      ƒ d {  –—†  y y 7 Œ=7 Œ# t        $ r | j                  «       ƒ d {  –—†7   Y y w xY w­wr6   )r&   r'   rÓ   r   rÎ   Ú_get_seedlistrÐ   rD   Úon_srv_updater“   rB   )rF   Úseedlists     r!   r.   zSrvMonitor._runŽ  s“   è ø€ ä�>‰>Ó˜d×0Ñ0´6×3QÑ3QÑQÒQØØ×+Ñ+Ó-×-ˆÙØ%ˆDŒNð#Ø—n‘n×2Ñ2°4·>±>ÓB×BÑBð ð .øð CùÜ!ò #à—j‘j“l×"Ó"ð#üsT   ‚AB3Á	BÁ
B3Á(B Â B	ÂB ÂB3Â	B ÂB0Â'B*Â(B0Â-B3Â/B0Â0B3c              ƒ  óî  K  — 	 t        | j                  | j                  j                  j                  | j                  j
                  «      }|j                  «       ƒ d{  –—† \  }}t        |«      dk(  rt        ‚	 | j                  j                  t        |t        j                  «      «       |S 7 ŒQ# t        $ r5}| j                  «        t        t         dt#        |«      ¬«       Y d}~yd}~ww xY w­w)zXPoll SRV records for a seedlist.

        Returns a list of ServerDescriptions.
        Nr   zSRV monitor check failed)r™   rŸ   )r
   rÒ   rh   Úpool_optionsÚconnect_timeoutÚsrv_service_nameÚget_hosts_and_min_ttlÚlenr¢   r?   Úupdate_intervalr%   r   rÎ   rT   r   r   Úrepr)rF   Úresolverr×   Úttlr•   s        r!   rÕ   zSrvMonitor._get_seedlist›  sË   è ø€ ð
	Ü#Ø—
‘
Ø—‘×+Ñ+×;Ñ;Ø—‘×/Ñ/óˆHð
 #+×"@Ñ"@Ó"B×B‰MˆH�cÜ�8‹} Ò!ä�ð "ð �N‰N×*Ñ*¬3¨s´F×4RÑ4RÓ+SÔTØˆOð Cùô ò 	ð
 ×ÑÔ Ü”|Ð-GÔQUÐVYÓQZÕ[Üûð	üsA   ‚C5„AB4 Á B2Á!B4 Á=5C5Â2B4 Â4	C2Â=+C-Ã(C5Ã-C2Ã2C5)rG   r   rx   r   rX   )r;   zOptional[list[tuple[str, Any]]])rY   rZ   r[   rI   r.   rÕ   rÈ   rÉ   s   @r!   rË   rË   z  s   ø„ õ.ó&#÷r#   rË   c                  óP   ‡ — e Zd Zdˆ fd„Zd	d„Zd
d„Zdd„Zd	d„Zd	d„Zdd„Z	ˆ xZ
S )rp   c                óÂ   •— t         ‰| �  |d|j                  t        j                  «       || _        t        «       | _        t        «       | _	        t        «       | _        y)z\Maintain round trip times for a server.

        The Topology is weakly referenced.
        Úpymongo_server_rtt_taskN)rc   rI   rd   r   re   rg   r   Ú_moving_averager	   Ú_moving_minr   Ú_lock)rF   rG   rx   rw   ry   s       €r!   rI   z_RttMonitor.__init__¸  sQ   ø€ ô
 	‰ÑØØ%Ø×1Ñ1Ü×)Ñ)ô		
ð ˆŒ
Ü,›ˆÔÜ(›?ˆÔÜ'Ó)ˆ�
r#   c              ƒ  ót   K  — | j                  «        | j                  j                  «       ƒ d {  –—†  y 7 Œ­wr6   )r8   rg   r‰   rL   s    r!   rB   z_RttMonitor.closeÉ  s*   è ø€ Ø×ÑÔð �j‰j×ÑÓ × Ò ús   ‚.8°6±8c              ƒ  óô   K  — | j                   4 ƒd{  –—†  | j                  j                  |«       | j                  j                  |«       ddd«      ƒd{  –—†  y7 ŒK7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)zAdd a RTT sample.N)rç   rå   r¹   ræ   )rF   Úsamples     r!   r¹   z_RttMonitor.add_sampleÏ  sd   è ø€ à—:‘:÷ 	0ñ 	0Ø× Ñ ×+Ñ+¨FÔ3Ø×Ñ×'Ñ'¨Ô/÷	0÷ 	0ñ 	0øð 	0ø÷ 	0÷ 	0ñ 	0üsD   ‚A8“A”A8—7A#ÁA8ÁA!ÁA8Á!A8Á#A5Á)A,Á*A5Á1A8c              ƒ  óð   K  — | j                   4 ƒd{  –—†  | j                  j                  «       | j                  j                  «       fcddd«      ƒd{  –—†  S 7 ŒI7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)zBGet the calculated average, or None if no samples yet and the min.N)rç   rå   rº   ræ   rL   s    r!   rº   z_RttMonitor.getÕ  sk   è ø€ à—:‘:÷ 	Fñ 	FØ×'Ñ'×+Ñ+Ó-¨t×/?Ñ/?×/CÑ/CÓ/EÐE÷	F÷ 	Fò 	Føð 	Fø÷ 	F÷ 	Fñ 	FüsD   ‚A6“A”A6—4A!ÁA6ÁAÁA6ÁA6Á!A3Á'A*Á(A3Á/A6c              ƒ  óð   K  — | j                   4 ƒd{  –—†  | j                  j                  «        | j                  j                  «        ddd«      ƒd{  –—†  y7 ŒI7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)zReset the average RTT.N)rç   rå   r‰   ræ   rL   s    r!   r‰   z_RttMonitor.resetÚ  s`   è ø€ à—:‘:÷ 	%ñ 	%Ø× Ñ ×&Ñ&Ô(Ø×Ñ×"Ñ"Ô$÷	%÷ 	%ñ 	%øð 	%ø÷ 	%÷ 	%ñ 	%üsD   ‚A6“A”A6—5A!ÁA6ÁAÁA6ÁA6Á!A3Á'A*Á(A3Á/A6c              ƒ  ó"  K  — 	 | j                  «       ƒ d {  –—† }| j                  |«      ƒ d {  –—†  y 7 Œ7 Œ# t        $ r | j                  «       ƒ d {  –—†7   Y y t        $ r& | j
                  j                  «       ƒ d {  –—†7   Y y w xY w­wr6   )Ú_pingr¹   r“   rB   r¢   rg   r‰   )rF   Úrtts     r!   r.   z_RttMonitor._runà  sq   è ø€ ð
	%ð Ÿ
™
›×$ˆCØ—/‘/ #Ó&×&Ñ&ð %øØ&ùÜò 	à—*‘*“,×ÓÜò 	%Ø—*‘*×"Ñ"Ó$×$Ó$ð	%üsa   ‚B„: —6˜: °8±: µB¶: ¸: ºBÁAÁBÁBÁ%BÂBÂBÂ	BÂBÂBc              ƒ  óX  K  — | j                   j                  «       4 ƒd{  –—† }| j                  j                  rt	        d«      ‚t        j                  «       }|j                  «       ƒ d{  –—†  t        |«      cddd«      ƒd{  –—†  S 7 Œm7 Œ"7 Œ	# 1 ƒd{  –—†7  sw Y   yxY w­w)z)Run a "hello" command and return the RTT.Nz_RttMonitor closed)	rg   r²   r?   r   r¢   r&   r'   Úhellor)   )rF   r¾   r(   s      r!   rî   z_RttMonitor._pingí  s‰   è ø€ à—:‘:×&Ñ&Ó(÷ 	.ð 	.¨DØ�~‰~×&Ò&ÜÐ 4Ó5Ð5Ü—N‘NÓ$ˆEØ—*‘*“,×ÐÜ& uÓ-÷	.÷ 	.ò 	.øð øð		.ø÷ 	.÷ 	.ñ 	.üsW   ‚B*¡B¢B*¥A	BÁ.BÁ/BÁ=B*Â	BÂ
B*ÂBÂB*ÂB'ÂBÂB'Â#B*)rG   r   rx   r   rw   r   rX   )rê   rW   r;   r=   )r;   ztuple[Optional[float], float])r;   rW   )rY   rZ   r[   rI   rB   r¹   rº   r‰   r.   rî   rÈ   rÉ   s   @r!   rp   rp   ·  s'   ø„ õ*ó"!ó0óFó
%ó%÷.r#   rp   c                ób   — t        j                  | t        «      }t        j	                  |«       y r6   )r@   rA   Ú_unregisterÚ	_MONITORSÚadd)r/   rA   s     r!   rE   rE   ý  s   € Ü
�+‰+�gœ{Ó
+€CÜ‡M�M�#Õr#   c                ó.   — t         j                  | «       y r6   )rô   Úremove)Úmonitor_refs    r!   ró   ró     s   € Ü×Ñ�[Õ!r#   c                 óv   — t         €y t        t         «      } | D ]  } |«       }|sŒ|j                  «        Œ d }y r6   )rô   Úlistr8   )ÚmonitorsrA   r/   s      r!   Ú_shutdown_monitorsrü     sD   € ÜÐØô ”I‹€Hð ò $ˆÙ“%ˆÚØ×!Ñ!Õ#ð$ð
 �Gr#   c                 óB   — t         } | r | «        t        } | r | «        y y r6   )rü   r   )Úshutdowns    r!   Ú_shutdown_resourcesrÿ     s!   € ä!€HÙÙŒ
Ü"€HÙÙ�
ð r#   )r    r¢   r;   r=   )r(   rW   r;   rW   )r/   r+   r;   r=   )rø   z"weakref.ReferenceType[MonitorBase]r;   r=   rX   )<Ú__doc__Ú
__future__r   r„   Úatexitr¥   r&   r@   Útypingr   r   r   Úpymongor   r   Úpymongo._csotr	   Ú!pymongo.asynchronous.srv_resolverr
   Úpymongo.errorsr   r   Úpymongo.hellor   Úpymongo.lockr   Úpymongo.loggerr   r   r   Úpymongo.periodic_executorr   Úpymongo.pool_optionsr   Úpymongo.read_preferencesr   Úpymongo.server_descriptionr   Úpymongo.asynchronous.poolr   r   r   Úpymongo.asynchronous.settingsr   Úpymongo.asynchronous.topologyr   Ú_IS_SYNCr"   r)   r+   r^   rË   rp   Úsetrô   rE   ró   rü   rÿ   Úregisterr\   r#   r!   ú<module>r     sÕ   ðñ @å "ã Û Û Û Û ß /Ñ /ç -Ý 'Ý :ß >Ý Ý +ß GÑ GÝ 9Ý )Ý 2Ý 8á÷ñ õ
 ?Ý6à€óó.÷;ñ ;ô|w"ˆkô w"ôt:�ô :ôz=.�+ô =.ñF ‹E€	óó
"óó ñ Ø€F‡O�OÐ'Õ(ð r#   