Ë
    Ü_Ëi”´  ã                  ó<  — 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Zddl	Z	ddl
Z
ddl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mZmZmZ ddl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'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZEmFZFmGZGmHZHmIZI erddlJmKZK ddlLmMZM ddlNmOZOmPZP dZQ eR eeS«      j¨                  «      ZUdd„ZV G d„ d«      ZW G d„ d«      ZX	 	 	 	 	 	 dd„ZYd d„ZZy)!z<Internal class to monitor a topology of one or more servers.é    )ÚannotationsN)ÚPath)ÚTYPE_CHECKINGÚAnyÚCallableÚMappingÚOptionalÚcast)Ú_csotÚcommonÚhelpers_sharedÚperiodic_executor)Ú_ServerSessionÚ_ServerSessionPool)ÚMonitorBaseÚ
SrvMonitor)ÚPool)ÚServer)	ÚConnectionFailureÚInvalidOperationÚNetworkTimeoutÚNotPrimaryErrorÚOperationFailureÚPyMongoErrorÚServerSelectionTimeoutErrorÚWaitQueueTimeoutErrorÚ
WriteError)ÚHello)Ú_async_cond_waitÚ_async_create_conditionÚ_async_create_lock)Ú_SDAM_LOGGERÚ_SERVER_SELECTION_LOGGERÚ
_debug_logÚ_SDAMStatusMessageÚ_ServerSelectionStatusMessage)ÚPoolOptions)ÚServerDescription)Ú	SelectionÚany_server_selectorÚarbiter_server_selectorÚsecondary_server_selectorÚwritable_server_selector)ÚSRV_POLLING_TOPOLOGIESÚTOPOLOGY_TYPEÚTopologyDescriptionÚ)_updated_topology_description_srv_pollingÚupdated_topology_description)ÚObjectId)ÚTopologySettings)ÚClusterTimeÚ_AddressFc                ó‚   —  | «       }|sy	 	 |j                  «       }|\  }} ||Ž  Œ# t        j                  $ r Y yw xY w)NFT)Ú
get_nowaitÚqueueÚEmpty)Ú	queue_refÚqÚeventÚfnÚargss        ú`/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/pymongo/asynchronous/topology.pyÚprocess_events_queuerA   W   sV   € Ù‹€AÙØà
ð	Ø—L‘L“NˆEð ‰HˆB�Ù�‰Ið øô �{‰{ò 	Øð
 ð	ús   �( ¨>½>c                  óN  — e Zd ZdZd/d„Zd0d„Zd1d„Z	 	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d3d„Z	 d4	 	 	 	 	 	 	 	 	 	 	 	 	 d5d„Z	 	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d6d„Z		 	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d6d	„Z
	 	 d7	 	 	 	 	 	 	 	 	 d8d
„Z	 	 d9	 	 	 	 	 	 	 d:d„Z	 	 d9	 	 	 	 	 	 	 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dAd„ZdBd„ZdBd„ZdCdDd„ZdEd„Zd0d„Zd0d„ZedFd„«       ZdGd„ZdHd„Z dId„Z!dJd „Z"d0d!„Z#dKd"„Z$dLd#„Z%dLd$„Z&d0d%„Z'd0d&„Z(dMd'„Z)dMd(„Z*dNd)„Z+d0d*„Z,dOd+„Z-dPd,„Z.dQd-„Z/dRd.„Z0y)SÚTopologyz*Monitor a topology of one or more servers.c           	     ó.
  ‡— |j                   | _         |j                  j                  | _        | j                  d uxr | j                  j                  | _        | j                  d uxr | j                  j                  | _        d | _        d | _	        | j
                  s| j                  rt        j                  d¬«      | _        t        j                  t        j                  «      r*t!        t        t"        j$                  | j                   ¬«       | j                  rX| j                  €J ‚| j                  €J ‚| j                  j'                  | j                  j(                  | j                   ff«       || _        t-        |j/                  «       |j1                  «       |j2                  d d |«      }|| _        t-        t6        j8                  i d d d | j*                  «      }| j                  rd| j                  €J ‚| j                  €J ‚| j                  j'                  | j                  j:                  || j4                  | j                   ff«       t        j                  t        j                  «      rHt!        t        t"        j<                  | j                   t?        |«      t?        | j4                  «      ¬«       |j@                  D ]½  }| j
                  rY| j                  €J ‚| j                  €J ‚| j                  j'                  | j                  jB                  || j                   ff«       t        j                  t        j                  «      sŒŒt!        t        t"        jD                  | j                   |d   |d   ¬«       Œ¿ tG        |jI                  «       «      | _%        d| _&        d| _'        tQ        «       | _)        tU        | jR                  tV        r| j*                  jX                  nd «      | _-        i | _.        d | _/        d | _0        tc        «       | _2        | j
                  s| j                  rŠ| j                  €J ‚dˆfd	„}tg        jh                  tj        jl                  tj        jn                  |d
¬«      }tq        jr                  | j                  |jt                  «      Š|| _	        |jw                  «        d | _<        | j*                  jz                  �1| j*                  j|                  st        | | j*                  «      | _<        g | _@        y )Néd   )Úmaxsize©ÚmessageÚ
topologyId©rH   rI   ÚpreviousDescriptionÚnewDescriptionr   é   )rH   rI   Ú
serverHostÚ
serverPortFc               “  ó"   •K  — t        ‰ «      S ­w©N)rA   )Úweaks   €r@   Útargetz!Topology.__init__.<locals>.targetÂ   s   øè ø€ Ü+¨DÓ1Ð1ùs   ƒÚpymongo_events_thread)ÚintervalÚmin_intervalrS   Úname)ÚreturnÚbool)AÚ_topology_idÚ_pool_optionsÚ_event_listenersÚ
_listenersÚenabled_for_serverÚ_publish_serverÚenabled_for_topologyÚ_publish_tpÚ_eventsÚ_Topology__events_executorr9   ÚQueuer"   ÚisEnabledForÚloggingÚDEBUGr$   r%   ÚSTART_TOPOLOGYÚputÚpublish_topology_openedÚ	_settingsr0   Úget_topology_typeÚget_server_descriptionsÚreplica_set_nameÚ_descriptionr/   ÚUnknownÚ$publish_topology_description_changedÚTOPOLOGY_CHANGEÚreprÚseedsÚpublish_server_openedÚSTART_SERVERÚlistÚserver_descriptionsÚ_seed_addressesÚ_openedÚ_closedr!   Ú_lockr    Ú_IS_SYNCÚcondition_classÚ
_conditionÚ_serversÚ_pidÚ_max_cluster_timer   Ú_session_poolr   ÚAsyncPeriodicExecutorr   ÚEVENTS_QUEUE_FREQUENCYÚMIN_HEARTBEAT_INTERVALÚweakrefÚrefÚcloseÚopenÚ_srv_monitorÚfqdnÚload_balancedr   Ú_monitor_tasks)ÚselfÚtopology_settingsÚtopology_descriptionÚ
initial_tdÚseedrS   ÚexecutorrR   s          @r@   Ú__init__zTopology.__init__k   s
  ø€ Ø-×:Ñ:ˆÔØ+×9Ñ9×JÑJˆŒØ#Ÿ™°dÐ:Òa¸t¿¹×?aÑ?aˆÔØŸ?™?°$Ð6Ò_¸4¿?¹?×;_Ñ;_ˆÔð 15ˆŒØ&*ˆÔà×Ò 4×#3Ò#3Ü Ÿ;™;¨sÔ3ˆDŒLä×$Ñ$¤W§]¡]Ô3ÜÜÜ*×9Ñ9Ø×,Ñ,õð ×ÒØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñ˜dŸo™o×EÑEÈ×HYÑHYÐG[Ð\Ô]Ø*ˆŒÜ2Ø×/Ñ/Ó1Ø×5Ñ5Ó7Ø×.Ñ.ØØØó 
Ðð 1ˆÔÜ(Ü×!Ñ! 2 t¨T°4¸¿¹ó
ˆ
ð ×ÒØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ ×!2Ñ!2°D×4EÑ4EÐFðôô ×$Ñ$¤W§]¡]Ô3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨Ó$4Ü# D×$5Ñ$5Ó6õð &×+Ñ+ò 	ˆDØ×#Ò#Ø—|‘|Ð/Ð/Ð/Ø—‘Ð2Ð2Ð2Ø—‘× Ñ  $§/¡/×"GÑ"GÈ$ÐPT×PaÑPaÐIbÐ!cÔdÜ×(Ñ(¬¯©Õ7ÜÜ Ü.×;Ñ;Ø#×0Ñ0Ø# A™wØ# A™wöð	ô  $Ð$8×$LÑ$LÓ$NÓOˆÔØˆŒØˆŒÜ'Ó)ˆŒ
Ü1Ø�J‰J½(˜Ÿ™×6Ò6Èó
ˆŒð 13ˆŒØ#'ˆŒ	Ø8<ˆÔÜ/Ó1ˆÔà×Ò 4×#3Ò#3Ø—<‘<Ð+Ð+Ð+õ2ô )×>Ñ>Ü×6Ñ6Ü#×:Ñ:ØØ,ô	ˆHô —;‘;˜tŸ|™|¨X¯^©^Ó<ˆDØ%-ˆDÔ"Ø�M‰MŒOà ˆÔØ�>‰>×ÑÐ*°4·>±>×3OÒ3OÜ *¨4°·±Ó @ˆDÔð 24ˆÕó    c              ƒ  óÎ  K  — t        j                  «       }| j                  €|| _        nÆ|| j                  k7  r·|| _        t        j                  dd dk\  r
dt
        fi}nddi}t        j                  	 di |¤Ž | j                  4 ƒd{  –—†  | j                  j                  «       D ]  }|j                  «       ƒ d{  –—†  Œ | j                  j                  «        ddd«      ƒd{  –—†  | j                  4 ƒd{  –—†  | j                  «       ƒ d{  –—†  ddd«      ƒd{  –—†  y7 Œ£7 Œp7 ŒF# 1 ƒd{  –—†7  sw Y   ŒVxY w7 ŒH7 Œ27 Œ$# 1 ƒd{  –—†7  sw Y   yxY w­w)a¸  Start monitoring, or restart after a fork.

        No effect if called multiple times.

        .. warning:: Topology is shared among multiple threads and is protected
          by mutual exclusion. Using Topology from a process other than the one
          that initialized it will emit a warning and may result in deadlock. To
          prevent this from happening, AsyncMongoClient must be created after any
          forking.

        Né   )é   é   Úskip_file_prefixesÚ
stacklevelé   )z¸AsyncMongoClient opened before fork. May not be entirely fork-safe, proceed with caution. See PyMongo's documentation for details: https://dochub.mongodb.org/core/pymongo-fork-deadlock)ÚosÚgetpidr�   ÚsysÚversion_infoÚ_pymongo_dirÚwarningsÚwarnr|   r€   Úvaluesr‰   rƒ   ÚresetÚ_ensure_opened)r�   ÚpidÚkwargsÚservers       r@   rŠ   zTopology.openÚ   sO  è ø€ ô �i‰i‹kˆØ�9‰9ÐØˆD�IØ�D—I‘IÒØˆDŒIÜ×Ñ  Ð# wÒ.Ø.´°Ð@‘à&¨Ð*�ä�M‰MðHñð ò	ð —z‘z÷ +ñ +à"Ÿm™m×2Ñ2Ó4ò )�FØ Ÿ,™,›.×(Ñ(ð)ð ×"Ñ"×(Ñ(Ô*÷+÷ +ð —:‘:÷ 	(ñ 	(Ø×%Ñ%Ó'×'Ð'÷	(÷ 	(ð 	(ð+øð )øð+ø÷ +÷ +ñ +úð	(øØ'øð	(ø÷ 	(÷ 	(ñ 	(üs®   ‚B	E%ÂD/ÂE%Â1D5Ã D1Ã D5Ã!E%Ã,D3Ã-E%ÄE
ÄE%ÄEÄEÄEÄE%Ä)EÄ*E%Ä1D5Ä3E%Ä5EÄ;D>Ä<EÅE%ÅEÅE%ÅE"ÅEÅE"ÅE%c                ó^   — t        j                  «       }|€| j                  j                  S |S rQ   )r   Ú	remainingrk   Úserver_selection_timeout)r�   Útimeouts     r@   Úget_server_selection_timeoutz%Topology.get_server_selection_timeout  s(   € ä—/‘/Ó#ˆØˆ?Ø—>‘>×:Ñ:Ð:Øˆr–   Nc           
   ƒ  óÄ  K  — |€| j                  «       }n|}t        s$| j                  r| j                  «       ƒ d{  –—†  | j                  4 ƒd{  –—†  | j                  ||||||¬«      ƒ d{  –—† }|D �	cg c]+  }	t        t        | j                  |	j                  «      «      ‘Œ- c}	cddd«      ƒd{  –—†  S 7 Œ€7 Œm7 ŒPc c}	w 7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)aŠ  Return a list of Servers matching selector, or time out.

        :param selector: function that takes a list of Servers and returns
            a subset of them.
        :param operation: The name of the operation that the server is being selected for.
        :param server_selection_timeout: maximum seconds to wait.
            If not provided, the default value common.SERVER_SELECTION_TIMEOUT
            is used.
        :param address: optional server address to select.

        Calls self.open() if needed.

        Raises exc:`ServerSelectionTimeoutError` after
        `server_selection_timeout` if no matching servers are found.
        N)Údeprioritized_servers)
r¯   r}   rŽ   Úcleanup_monitorsr|   Ú_select_servers_loopr
   r   Úget_server_by_addressÚaddress)
r�   ÚselectorÚ	operationr­   rµ   Úoperation_idr±   Úserver_timeoutrx   Úsds
             r@   Úselect_serverszTopology.select_servers  sæ   è ø€ ð0 $Ð+Ø!×>Ñ>Ó@‰Nà5ˆNõ ˜D×/Ò/Ø×'Ñ'Ó)×)Ð)à—:‘:÷ 	ñ 	Ø(,×(AÑ(AØØØØØØ&;ð )Bó )÷ #Ðð PcöØIK””V˜T×7Ñ7¸¿
¹
ÓCÕDò÷	÷ 	ñ 	ð *øð	øð#úòð	ø÷ 	÷ 	ñ 	üs{   ‚;C ½B>¾C ÁC ÁC ÁCÁ1CÁ2CÁ:0CÂ*CÂ,C Â8C	Â9C Ã C ÃCÃCÃ	C ÃCÃCÃCÃC c              ƒ  óÊ  K  — t        j                  «       }||z   }d}	t        j                  t        j
                  «      rLt        t        t        j                  |||| j                  | j                  j                  j                  ¬«       | j                  j                  ||| j                  j                  |r|D �
cg c]  }
|
j                  ‘Œ c}
nd¬«      }|�sß|dk(  s||kD  r«t        j                  t        j
                  «      r\t        t        t        j                   |||| j                  | j                  j                  j                  | j#                  |«      ¬«       t%        | j#                  |«      › d|› d| j                  ›�«      ‚|	spt        t        t        j&                  |||| j                  | j                  j                  j                  t)        d	|t        j                  «       z
  z  «      ¬
«       d}	| j+                  «       ƒ d{  –—†  | j-                  «        t/        | j0                  t2        j4                  «      ƒ d{  –—†  | j                  j7                  «        t        j                  «       }| j                  j                  ||| j                  j                  ¬«      }|s�Œß| j                  j7                  «        |S c c}
w 7 ŒÅ7 Œ‹­w)z7select_servers() guts. Hold the lock when calling this.F)rH   r¶   r·   ÚoperationIdÚtopologyDescriptionÚclientIdN)Úcustom_selectorr±   r   )rH   r¶   r·   r½   r¾   r¿   Úfailurez, Timeout: zs, Topology Description: iè  )rH   r¶   r·   r½   r¾   r¿   ÚremainingTimeMST)rÀ   )ÚtimeÚ	monotonicr#   re   rf   rg   r$   r&   ÚSTARTEDÚdescriptionÚ_topology_settingsrZ   ro   Úapply_selectorrk   Úserver_selectorÚFAILEDÚ_error_messager   ÚWAITINGÚintr§   Ú_request_check_allr   r   r   r†   Úcheck_compatible)r�   r¶   r®   r·   r¸   rµ   r±   ÚnowÚend_timeÚlogged_waitingrª   rx   s               r@   r³   zTopology._select_servers_loop7  s~  è ø€ ô �n‰nÓˆØ˜‘=ˆØˆä#×0Ñ0´·±Ô?ÜÜ(Ü5×=Ñ=Ø!Ø#Ø(Ø$(×$4Ñ$4Ø×)Ñ)×<Ñ<×IÑIõð #×/Ñ/×>Ñ>ØØØ ŸN™N×:Ñ:á$ð EZÖ"Z¸& 6×#5Ó#5Ó"Zàð ?ó 
Ðò &à˜!Š|˜s Xš~Ü+×8Ñ8¼¿¹ÔGÜÜ0Ü =× DÑ DØ!)Ø"+Ø$0Ø,0×,<Ñ,<Ø!%×!1Ñ!1×!DÑ!D×!QÑ!QØ $× 3Ñ 3°HÓ =õ	ô 2Ø×*Ñ*¨8Ó4Ð5°[ÀÀ	ÐIbÐcg×csÑcsÐbvÐwóð ñ "ÜÜ,Ü9×AÑAØ%Ø'Ø ,Ø(,×(8Ñ(8Ø!×-Ñ-×@Ñ@×MÑMÜ$'¨°¼4¿>¹>Ó;KÑ0KÑ(LÓ$Mõ	ð "&�à×%Ñ%Ó'×'Ð'Ø×#Ñ#Ô%ô # 4§?¡?´F×4QÑ4QÓR×RÐRØ×Ñ×.Ñ.Ô0Ü—.‘.Ó"ˆCØ"&×"3Ñ"3×"BÑ"BØ˜'°4·>±>×3QÑ3Qð #Có #ÐóS &ðZ 	×Ñ×*Ñ*Ô,Ø"Ð"ùòg #[ðH (øð Sús8   ‚B=K#Â?KÃEK#ÈKÈ;K#ÉK!ÉA&K#Ê>"K#Ë!K#c              ƒ  ó  K  — | j                  ||||||«      ƒ d {  –—† }t        |«      dk(  r|d   S t        j                  |d«      \  }}	|j                  j
                  |	j                  j
                  k  r|S |	S 7 Œa­w)NrM   r   r˜   )r»   ÚlenÚrandomÚsampleÚpoolÚoperation_count)
r�   r¶   r·   r­   rµ   r±   r¸   ÚserversÚserver1Úserver2s
             r@   Ú_select_serverzTopology._select_server‰  s‡   è ø€ ð ×+Ñ+ØØØ$ØØØ!ó
÷ 
ˆô ˆw‹<˜1ÒØ˜1‘:ÐÜ!Ÿ=™=¨°!Ó4Ñˆ�Ø�<‰<×'Ñ'¨7¯<©<×+GÑ+GÒGØˆNàˆNð
ús   ‚B œA>�A"B c              ƒ  ó  K  — | j                  ||||||¬«      ƒ d{  –—† }t        j                  «       r)t        j                  |j                  j
                  «       t        j                  t        j                  «      r|t        t        t        j                  |||| j                  | j                  j                  j                  |j                  j                  d   |j                  j                  d   ¬«	       |S 7 Œâ­w)zALike select_servers, but choose a random server if several match.©r¸   Nr   rM   )rH   r¶   r·   r½   r¾   r¿   rN   rO   )rÜ   r   Úget_timeoutÚset_rttrÆ   Úmin_round_trip_timer#   re   rf   rg   r$   r&   Ú	SUCCEEDEDrÇ   rZ   rµ   )r�   r¶   r·   r­   rµ   r±   r¸   rª   s           r@   Úselect_serverzTopology.select_server¢  sÛ   è ø€ ð ×*Ñ*ØØØ$ØØ!Ø%ð +ó 
÷ 
ˆô ×ÑÔÜ�M‰M˜&×,Ñ,×@Ñ@ÔAÜ#×0Ñ0´·±Ô?ÜÜ(Ü5×?Ñ?Ø!Ø#Ø(Ø$(×$4Ñ$4Ø×)Ñ)×<Ñ<×IÑIØ!×-Ñ-×5Ñ5°aÑ8Ø!×-Ñ-×5Ñ5°aÑ8õ
ð ˆð-
ús   ‚D�D žC#Dc              ƒ  óR   K  — | j                  t        ||||¬«      ƒ d{  –—† S 7 Œ­w)a=  Return a Server for "address", reconnecting if necessary.

        If the server's type is not known, request an immediate check of all
        servers. Time out after "server_selection_timeout" if the server
        cannot be reached.

        :param address: A (host, port) pair.
        :param operation: The name of the operation that the server is being selected for.
        :param server_selection_timeout: maximum seconds to wait.
            If not provided, the default value
            common.SERVER_SELECTION_TIMEOUT is used.
        :param operation_id: The unique id of the current operation being performed. Defaults to None if not provided.

        Calls self.open() if needed.

        Raises exc:`ServerSelectionTimeoutError` after
        `server_selection_timeout` if no matching servers are found.
        rÞ   N)rã   r*   )r�   rµ   r·   r­   r¸   s        r@   Úselect_server_by_addressz!Topology.select_server_by_addressÄ  s9   è ø€ ð2 ×'Ñ'ÜØØ$ØØ%ð (ó 
÷ 
ð 	
ð 
ús   ‚' %¡'c           	   ƒ  óì  K  — | j                   }|j                  |j                     }t        ||«      ryt	        | j                   |«      }|j
                  s)|j                  rf|j                  t        j                  k(  rI| j                  j                  |j                  «      }|r"|j                  j                  «       ƒ d{  –—†  ||k(  }| j                  rg|se| j                  €J ‚| j                   €J ‚| j                  j#                  | j                   j$                  |||j                  | j&                  ff«       || _         | j)                  «       ƒ d{  –—†  | j*                  rf|sd| j                  €J ‚| j                   €J ‚| j                  j#                  | j                   j,                  || j                   | j&                  ff«       t/        j0                  t2        j4                  «      rJ|sHt7        t.        t8        j:                  | j&                  t=        |«      t=        | j                   «      ¬«       | j>                  r†|j                  t        j@                  k(  ri| j                   j                  tB        vrM| j>                  jE                  «       ƒ d{  –—†  tF        s%| jH                  jK                  | j>                  «       | jL                  jO                  «        y7 �Œ(7 �Œ”7 ŒP­w)ziProcess a new ServerDescription on an opened topology.

        Hold the lock when calling this.
        NrJ   )(ro   Ú_server_descriptionsrµ   Ú_is_stale_server_descriptionr2   Úis_readableÚis_server_type_knownÚtopology_typer/   ÚSingler€   Úgetr×   Úreadyr_   rb   r]   ri   Ú"publish_server_description_changedrZ   Ú_update_serversra   rq   r"   re   rf   rg   r$   r%   rr   rs   r‹   rp   r.   r‰   r}   rŽ   Úappendr   Ú
notify_all)	r�   Úserver_descriptionÚ
reset_poolÚinterrupt_connectionsÚtd_oldÚsd_oldÚnew_tdrª   Úsuppress_events	            r@   Ú_process_changezTopology._process_changeå  so  è ø€ ð ×"Ñ"ˆØ×,Ñ,Ð-?×-GÑ-GÑHˆÜ'¨Ð0BÔCàä-¨d×.?Ñ.?ÐASÓTˆà×)Ò)Ø×3Ò3¸×8LÑ8LÔP]×PdÑPdÒ8dà—]‘]×&Ñ&Ð'9×'AÑ'AÓBˆFÙØ—k‘k×'Ñ'Ó)×)Ð)àÐ#5Ñ5ˆØ×Ò©Ø—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×FÑFØÐ/Ð1C×1KÑ1KÈT×M^ÑM^Ð_ðôð #ˆÔØ×"Ñ"Ó$×$Ð$à×Ò¡NØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ˜T×.Ñ.°×0AÑ0AÐBðôô ×$Ñ$¤W§]¡]Ô3¹NÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6õð ×ÒØ× Ñ ¤M×$9Ñ$9Ò9Ø×!Ñ!×/Ñ/Ô7MÑMà×#Ñ#×)Ñ)Ó+×+Ð+ÝØ×#Ñ#×*Ñ*¨4×+<Ñ+<Ô=ð 	�‰×"Ñ"Õ$ð] *ùð 	%ùð6 ,ús9   ‚CK4ÃK,ÃBK4ÅK/ÅEK4Ê!K2Ê"AK4Ë/K4Ë2K4c              ƒ  óÆ  K  — | j                   4 ƒd{  –—†  | j                  r@| j                  j                  |j                  «      r| j                  |||«      ƒ d{  –—†  ddd«      ƒd{  –—†  |rM| j                  j                  |j                  «      }|r%|j                  j                  |¬«      ƒ d{  –—†  yyy7 Œ°7 Œf7 ŒX# 1 ƒd{  –—†7  sw Y   ŒhxY w7 Œ"­w)z>Process a new ServerDescription after an hello call completes.N)rõ   )
r|   rz   ro   Ú
has_serverrµ   rú   r€   rí   r×   r¦   )r�   ró   rô   rõ   rª   s        r@   Ú	on_changezTopology.on_change,  sÛ   è ø€ ð —:‘:÷ 
	bñ 
	bð �|Š| × 1Ñ 1× <Ñ <Ð=O×=WÑ=WÔ XØ×*Ñ*Ð+=¸zÐK`Óa×aÐa÷
	b÷ 
	bñ Ø—]‘]×&Ñ&Ð'9×'AÑ'AÓBˆFÙØ—k‘k×'Ñ'Ð>SÐ'ÓT×TÑTð ð ð
	bøð bøð
	bø÷ 
	b÷ 
	bñ 
	búð Uúsd   ‚C!“C”C!—AC
ÁCÁ C
Á$C!Á/CÁ0AC!Â<CÂ=C!ÃC
ÃC!Ã
CÃCÃCÃC!c           	   ƒ  ól  K  — | j                   }|j                  t        vryt        | j                   |«      | _         | j	                  «       ƒ d{  –—†  | j
                  rd| j                  €J ‚| j                  €J ‚| j                  j                  | j                  j                  || j                   | j                  ff«       t        j                  t        j                  «      rIt        t        t         j"                  | j                  t%        |«      t%        | j                   «      ¬«       yy7 Œá­w)z_Process a new seedlist on an opened topology.
        Hold the lock when calling this.
        NrJ   )ro   rë   r.   r1   rð   ra   rb   r]   ri   rq   rZ   r"   re   rf   rg   r$   r%   rr   rs   )r�   Úseedliströ   s      r@   Ú_process_srv_updatezTopology._process_srv_updateE  s   è ø€ ð ×"Ñ"ˆØ×ÑÔ'=Ñ=ØÜEÀd×FWÑFWÐYaÓbˆÔà×"Ñ"Ó$×$Ð$à×ÒØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ˜T×.Ñ.°×0AÑ0AÐBðôô ×$Ñ$¤W§]¡]Ô3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6öð 4ð 	%ús   ‚AD4ÁD2ÁC"D4c              ƒ  óÖ   K  — | j                   4 ƒd{  –—†  | j                  r| j                  |«      ƒ d{  –—†  ddd«      ƒd{  –—†  y7 Œ:7 Œ7 Œ	# 1 ƒd{  –—†7  sw Y   yxY w­w)z?Process a new list of nodes obtained from scanning SRV records.N)r|   rz   r   )r�   rÿ   s     r@   Úon_srv_updatezTopology.on_srv_updateb  s]   è ø€ ð —:‘:÷ 	9ñ 	9Ø�|Š|Ø×.Ñ.¨xÓ8×8Ð8÷	9÷ 	9ñ 	9øà8øð	9ø÷ 	9÷ 	9ñ 	9üsS   ‚A)“A”A)—!A¸A¹A½A)ÁAÁ	A)ÁAÁA)ÁA&ÁAÁA&Á"A)c                ó8   — | j                   j                  |«      S )aJ  Get a Server or None.

        Returns the current version of the server immediately, even if it's
        Unknown or absent from the topology. Only use this in unittests.
        In driver code, use select_server_by_address, since then you're
        assured a recent view of the server's type and wire protocol version.
        )r€   rí   ©r�   rµ   s     r@   r´   zTopology.get_server_by_addressi  s   € ð �}‰}× Ñ  Ó)Ð)r–   c                ó   — || j                   v S rQ   )r€   r  s     r@   rü   zTopology.has_servers  s   € Ø˜$Ÿ-™-Ð'Ð'r–   c              ƒ  óN  K  — | j                   4 ƒd{  –—†  | j                  j                  }|t        j                  k7  r	 ddd«      ƒd{  –—†  yt        | j                  «       «      d   j                  cddd«      ƒd{  –—†  S 7 Œv7 Œ>7 Œ	# 1 ƒd{  –—†7  sw Y   yxY w­w)z!Return primary's address or None.Nr   )r|   ro   rë   r/   ÚReplicaSetWithPrimaryr-   Ú_new_selectionrµ   )r�   rë   s     r@   Úget_primaryzTopology.get_primaryv  s    è ø€ ð —:‘:÷ 	Nñ 	NØ ×-Ñ-×;Ñ;ˆMØ¤× CÑ CÒCØ÷	N÷ 	Nð 	Nô
 ,¨D×,?Ñ,?Ó,AÓBÀ1ÑE×MÑM÷	N÷ 	Nò 	Nøð 	Nøð 	Nø÷ 	N÷ 	Nñ 	Nüsb   ‚B%“B
”B%—+BÁB%ÁBÁB%Á%BÁ8B%ÂBÂB%ÂB%ÂB%ÂB"ÂBÂB"ÂB%c              ƒ  óª  K  — | j                   4 ƒd{  –—†  | j                  j                  }|t        j                  t        j
                  fvrt        «       cddd«      ƒd{  –—†  S t         || j                  «       «      «      D �ch c]  }|j                  ’Œ c}cddd«      ƒd{  –—†  S 7 ŒŸ7 ŒOc c}w 7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)z+Return set of replica set member addresses.N)
r|   ro   rë   r/   r  ÚReplicaSetNoPrimaryÚsetÚiterr  rµ   )r�   r¶   rë   rº   s       r@   Ú_get_replica_set_membersz!Topology._get_replica_set_members€  sÃ   è ø€ ð
 —:‘:÷ 	Pñ 	PØ ×-Ñ-×;Ñ;ˆMØÜ×3Ñ3Ü×1Ñ1ð%ñ ô “u÷	P÷ 	Pñ 	Pô *.©h°t×7JÑ7JÓ7LÓ.MÓ)NÖO 2�B—J“JÒO÷	P÷ 	Pò 	Pøð 	Púò Pð	Pø÷ 	P÷ 	Pñ 	Püsu   ‚C“B3”C—AB>ÁCÁ%B5Á&CÁ+!B>ÂB7ÂB>Â!CÂ-B<Â.CÂ5CÂ7B>Â<CÂ>CÃCÃCÃCc              ƒ  óH   K  — | j                  t        «      ƒ d{  –—† S 7 Œ­w)z"Return set of secondary addresses.N)r  r,   ©r�   s    r@   Úget_secondarieszTopology.get_secondaries�  s   è ø€ à×2Ñ2Ô3LÓM×MÐMÐMúó   ‚"› œ"c              ƒ  óH   K  — | j                  t        «      ƒ d{  –—† S 7 Œ­w)z Return set of arbiter addresses.N)r  r+   r  s    r@   Úget_arbiterszTopology.get_arbiters“  s   è ø€ à×2Ñ2Ô3JÓK×KÐKÐKúr  c                ó   — | j                   S )z1Return a document, the highest seen $clusterTime.©r‚   r  s    r@   Úmax_cluster_timezTopology.max_cluster_time—  s   € à×%Ñ%Ð%r–   c                ó\   — |r*| j                   r|d   | j                   d   kD  r|| _         y y y )NÚclusterTimer  ©r�   Úcluster_times     r@   Ú_receive_cluster_time_no_lockz&Topology._receive_cluster_time_no_lock›  s=   € ñ ð ×*Ò*Ø Ñ.°×1GÑ1GÈÑ1VÒVà)5�Õ&ð Wð	 r–   c              ƒ  óª   K  — | j                   4 ƒd {  –—†  | j                  |«       d d d «      ƒd {  –—†  y 7 Œ&7 Œ# 1 ƒd {  –—†7  sw Y   y xY w­wrQ   )r|   r  r  s     r@   Úreceive_cluster_timezTopology.receive_cluster_timeª  sJ   è ø€ Ø—:‘:÷ 	=ñ 	=Ø×.Ñ.¨|Ô<÷	=÷ 	=ñ 	=øð 	=ø÷ 	=÷ 	=ñ 	=üs<   ‚A“:”A—>©A´<µA¼A¾AÁAÁAÁAc              ƒ  óè   K  — | j                   4 ƒd{  –—†  | j                  «        t        | j                  |«      ƒ d{  –—†  ddd«      ƒd{  –—†  y7 ŒC7 Œ7 Œ	# 1 ƒd{  –—†7  sw Y   yxY w­w)z=Wake all monitors, wait for at least one to check its server.N)r|   rÎ   r   r   )r�   Ú	wait_times     r@   Úrequest_check_allzTopology.request_check_all®  s`   è ø€ à—:‘:÷ 	?ñ 	?Ø×#Ñ#Ô%Ü" 4§?¡?°IÓ>×>Ð>÷	?÷ 	?ñ 	?øà>øð	?ø÷ 	?÷ 	?ñ 	?üsV   ‚A2“A”A2—*AÁAÁAÁA2ÁAÁA2ÁAÁA2ÁA/Á#A&Á$A/Á+A2c                ó¨   — | j                   j                  t        j                  k(  r| j                   j                  S | j                   j
                  S )z~Return a list of all data-bearing servers.

        This includes any server that might be selected for an operation.
        )ro   rë   r/   rì   Úknown_serversÚreadable_serversr  s    r@   Údata_bearing_serverszTopology.data_bearing_servers´  sB   € ð
 ×Ñ×*Ñ*¬m×.BÑ.BÒBØ×$Ñ$×2Ñ2Ð2Ø× Ñ ×1Ñ1Ð1r–   c           	   ƒ  óR  K  — g }| j                   4 ƒd {  –—†  | j                  «       D ]P  }| j                  |j                     }|j	                  ||j
                  j                  j                  «       f«       ŒR d d d «      ƒd {  –—†  |D ])  \  }}	 |j
                  j                  |«      ƒ d {  –—†  Œ+ y 7 Œ¦7 Œ5# 1 ƒd {  –—†7  sw Y   ŒExY w7 Œ # t        $ rD}t        |d|dd «      }| j                  |j                  j                  |«      ƒ d {  –—†7   ‚ d }~ww xY w­w)Nr   F)r|   r%  r€   rµ   rñ   r×   ÚgenÚget_overallÚremove_stale_socketsr   Ú_ErrorContextÚhandle_errorrÆ   )r�   rÙ   rº   rª   Ú
generationÚexcÚctxs          r@   Úupdate_poolzTopology.update_pool½  s  è ø€ àˆØ—:‘:÷ 	Hñ 	Hà×/Ñ/Ó1ò H�ØŸ™ r§z¡zÑ2�Ø—‘ ¨¯©¯©×(CÑ(CÓ(EÐFÕGðH÷	H÷ 	Hð #*ò 	ÑˆF�JðØ—k‘k×6Ñ6°zÓB×BÑBñ	ð	Høð 	Hø÷ 	H÷ 	Hñ 	Húð CùÜò Ü# C¨¨J¸¸tÓD�Ø×'Ñ'¨×(:Ñ(:×(BÑ(BÀCÓH×HÑHØûðüs‡   ‚D'•B<–D'™A$C Á=D'ÂB>Â	D'ÂCÂ4CÂ5CÂ9D'Â>D'Ã CÃC	ÃCÃD'ÃCÃ	D$Ã 8DÄDÄDÄD$Ä$D'c           	   ƒ  ó”  K  — | j                   4 ƒd{  –—†  | j                  }| j                  j                  «       D ]F  }|j	                  «       ƒ d{  –—†  t
        rŒ"| j                  j                  |j                  «       ŒH | j                  j                  «       | _        | j                  j                  «       j                  «       D ](  \  }}|| j                  v sŒ|| j                  |   _        Œ* | j                  rM| j                  j	                  «       ƒ d{  –—†  t
        s%| j                  j                  | j                  «       d| _        d| _        ddd«      ƒd{  –—†  | j                   �r| j"                  €J ‚| j$                  €J ‚t'        t(        j*                  i | j                  j,                  | j                  j.                  | j                  j0                  | j                  j2                  «      | _        | j"                  j5                  | j$                  j6                  | j                  | j8                  ff«       | j"                  j5                  | j$                  j:                  | j8                  ff«       t=        j>                  t@        jB                  «      rrtE        t<        tF        jH                  | j8                  tK        «      tK        | j                  «      ¬«       tE        t<        tF        jL                  | j8                  ¬«       | jN                  s| j                   rf| jP                  j	                  «        | jP                  jS                  d«      ƒ d{  –—†  tU        tW        jX                  | j"                  «      «       yy7 �Œ‘7 �ŒS7 �Œˆ7 �ŒB# 1 ƒd{  –—†7  sw Y   �ŒSxY w7 ŒP­w)z¤Clear pools and terminate monitors. Topology does not reopen on
        demand. Any further operations will raise
        :exc:`~.errors.InvalidOperation`.
        NFTrJ   rG   rM   )-r|   ro   r€   r¥   r‰   r}   rŽ   rñ   Ú_monitorr¦   rx   ÚitemsrÆ   r‹   rz   r{   ra   rb   r]   r0   r/   rp   rn   Úmax_set_versionÚmax_election_idrÇ   ri   rq   rZ   Úpublish_topology_closedr"   re   rf   rg   r$   r%   rr   rs   ÚSTOP_TOPOLOGYr_   rc   ÚjoinrA   r‡   rˆ   )r�   Úold_tdrª   rµ   rº   s        r@   r‰   zTopology.closeÎ  sü  è ø€ ð
 —:‘:÷ 	 ñ 	 Ø×&Ñ&ˆFØŸ-™-×.Ñ.Ó0ò @�Ø—l‘l“n×$Ð$ÞØ×'Ñ'×.Ñ.¨v¯©Õ?ð@ð !%× 1Ñ 1× 7Ñ 7Ó 9ˆDÔØ#×0Ñ0×DÑDÓF×LÑLÓNò <‘�˜Ø˜dŸm™mÒ+Ø9;�D—M‘M 'Ñ*Õ6ð<ð
 × Ò Ø×'Ñ'×-Ñ-Ó/×/Ð/ÝØ×'Ñ'×.Ñ.¨t×/@Ñ/@ÔAà ˆDŒLØˆDŒL÷)	 ÷ 	 ð. ×ÓØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ü 3Ü×%Ñ%ØØ×!Ñ!×2Ñ2Ø×!Ñ!×1Ñ1Ø×!Ñ!×1Ñ1Ø×!Ñ!×4Ñ4ó!ˆDÔð �L‰L×Ñà—O‘O×HÑHàØ×)Ñ)Ø×)Ñ)ððô	ð �L‰L×Ñ˜dŸo™o×EÑEÈ×HYÑHYÐG[Ð\Ô]Ü×$Ñ$¤W§]¡]Ô3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6õô ÜÔ&8×&FÑ&FÐSW×SdÑSdõð ×Ò 4×#3Ò#3à×"Ñ"×(Ñ(Ô*Ø×(Ñ(×-Ñ-¨aÓ0×0Ð0Ü ¤§¡¨T¯\©\Ó!:Õ;ð	 $4ðs	 ùð %ùð 0ùð	 ù÷ 	 ÷ 	 ò 	 úðx 1ús‚   ‚O“N$”O—=N0ÁN'Á
N0Á BN0Ã#?N0Ä"N*Ä#=N0Å OÅ+N-Å,H	OÍ5OÍ6/OÎ'N0Î*N0Î-OÎ0OÎ6N9Î7OÎ>	Oc                ó   — | j                   S rQ   )ro   r  s    r@   rÆ   zTopology.description  s   € à× Ñ Ð r–   c                ó6   — | j                   j                  «       S )z"Pop all session ids from the pool.)rƒ   Úpop_allr  s    r@   Úpop_all_sessionszTopology.pop_all_sessions  s   € à×!Ñ!×)Ñ)Ó+Ð+r–   c                ó8   — | j                   j                  |«      S )z>Start or resume a server session, or raise ConfigurationError.)rƒ   Úget_server_session)r�   Úsession_timeout_minutess     r@   r>  zTopology.get_server_session  s   € à×!Ñ!×4Ñ4Ð5LÓMÐMr–   c                ó:   — | j                   j                  |«       y rQ   )rƒ   Úreturn_server_session)r�   Úserver_sessions     r@   rA  zTopology.return_server_session  s   € Ø×Ñ×0Ñ0°Õ@r–   c                ó@   — t        j                  | j                  «      S )zmA Selection object, initially including all known servers.

        Hold the lock when calling this.
        )r)   Úfrom_topology_descriptionro   r  s    r@   r  zTopology._new_selection!  s   € ô
 ×2Ñ2°4×3DÑ3DÓEÐEr–   c              ƒ  ó®  K  — | j                   rt        d«      ‚| j                  sðd| _        | j                  «       ƒ d{  –—†  | j                  s| j
                  r| j                  j                  «        | j                  r6| j                  j                  t        v r| j                  j                  «        | j                  j                  rG| j                  t        | j                   d   t#        d| j$                  ddœ«      «      «      ƒ d{  –—†  | j&                  j)                  «       D ]  }|j                  «       ƒ d{  –—†  Œ y7 �Œ7 Œ?7 Œ­w)z[Start monitors, or restart after a fork.

        Hold the lock when calling this.
        z'Cannot use AsyncMongoClient after closeTNr   rM   é   )ÚokÚ	serviceIdÚmaxWireVersion)r{   r   rz   rð   ra   r_   rc   rŠ   r‹   rÆ   rë   r.   rk   r�   rú   r(   ry   r   rZ   r€   r¥   ©r�   rª   s     r@   r§   zTopology._ensure_opened(  s   è ø€ ð
 �<Š<Ü"Ð#LÓMÐMà�|Š|ØˆDŒLØ×&Ñ&Ó(×(Ð(ð ×Ò 4×#7Ò#7Ø×&Ñ&×+Ñ+Ô-ð × Ò  d×&6Ñ&6×&DÑ&DÔH^Ñ&^Ø×!Ñ!×&Ñ&Ô(à�~‰~×+Ò+à×*Ñ*Ü%Ø×,Ñ,¨QÑ/Ü Q°T×5FÑ5FÐZ\Ñ]Ó^óó÷ ð ð —m‘m×*Ñ*Ó,ò 	 ˆFØ—+‘+“-×Ññ	 ð) )ùðøð  ús6   ‚>EÁ EÁCEÄEÄ4EÅEÅEÅEÅEc                ó†  — | j                   j                  |«      }|€y|j                  j                  |j                  |j
                  «      ry|j                  j                  }|j                  }d }|rAt        |d«      r5t        |j                  t        «      r|j                  j                  d«      }t        ||«      S )NTÚdetailsÚtopologyVersion)r€   rí   Ú_poolÚstale_generationÚsock_generationÚ
service_idrÆ   Útopology_versionÚerrorÚhasattrÚ
isinstancerL  ÚdictÚ _is_stale_error_topology_version)r�   rµ   Úerr_ctxrª   Úcur_tvrS  Úerror_tvs          r@   Ú_is_stale_errorzTopology._is_stale_errorI  sž   € Ø—‘×"Ñ" 7Ó+ˆØˆ>àà�<‰<×(Ñ(¨×)@Ñ)@À'×BTÑBTÔUàð ×#Ñ#×4Ñ4ˆØ—‘ˆØˆÙ”W˜U IÔ.Ü˜%Ÿ-™-¬Ô.Ø Ÿ=™=×,Ñ,Ð->Ó?�ä/°¸ÓAÐAr–   c              ƒ  ó  K  — | j                  ||«      ry | j                  |   }|j                  }|j                  }| j                  j
                  r|s|j                  sy t        |t        «      r|j                  ry t        |t        «      ry t        |t        t        f«      �rCt        |d«      r|j                  }n0t        |t        «      rdnd }|j                  j                  d|«      }|t         j"                  v r‡|t         j$                  v }| j                  j
                  s$| j'                  t)        ||¬«      «      ƒ d {  –—†  |s|j*                  dk  r|j-                  |«      ƒ d {  –—†  |j/                  «        y |j                  sT| j                  j
                  s$| j'                  t)        ||¬«      «      ƒ d {  –—†  |j-                  |«      ƒ d {  –—†  y y t        |t0        «      rt        |t2        «      ry | j                  j
                  s$| j'                  t)        ||¬«      «      ƒ d {  –—†  |j-                  |«      ƒ d {  –—†  |j4                  j7                  «        y y 7 �Œ17 �Œ
7 Œµ7 Œž7 ŒC7 Œ,­w)NÚcodei{'  ©rS  é   )r[  r€   rS  rQ  rk   r�   Úcompleted_handshakerU  r   r   r   r   rT  r]  rL  rí   r   Ú_NOT_PRIMARY_CODESÚ_SHUTDOWN_CODESrú   r(   Úmax_wire_versionr¦   Úrequest_checkr   r   r1  Úcancel_check)	r�   rµ   rX  rª   rS  rQ  Úerr_codeÚdefaultÚis_shutting_downs	            r@   Ú_handle_errorzTopology._handle_error]  s  è ø€ Ø×Ñ ¨Ô1Øà—‘˜wÑ'ˆØ—‘ˆØ×'Ñ'ˆ
ð �>‰>×'Ò'±
À7×C^ÒC^Øä�eœ^Ô,°×1LÒ1Lð
 Ü˜œzÔ*àÜ˜¤Ô1AÐBÕCô �u˜fÔ%Ø Ÿ:™:‘ô $.¨e´_Ô#E™%È4�Ø Ÿ=™=×,Ñ,¨V°WÓ=�Øœ>×<Ñ<Ñ<Ø#+¬~×/MÑ/MÐ#MÐ à—~‘~×3Ò3Ø×.Ñ.Ô/@ÀÐPUÔ/VÓW×WÐWÙ#¨×(@Ñ(@ÀAÒ(Eà Ÿ,™, zÓ2×2Ð2Ø×$Ñ$Õ&Ø×0Ò0à—~‘~×3Ò3Ø×.Ñ.Ô/@ÀÐPUÔ/VÓW×WÐWà—l‘l :Ó.×.Ñ.ð 1ô ˜Ô0Ô1Ü˜%Ô!6Ô7Øð —>‘>×/Ò/Ø×*Ñ*Ô+<¸WÈEÔ+RÓS×SÐSà—,‘,˜zÓ*×*Ð*ð �O‰O×(Ñ(Õ*ð 2ð Xùð 3ùð
 Xøà.øð Tøà*úsn   ‚EJÅ	I:Å
)JÅ3I=Å4AJÇ
J ÇJÇ#JÇ$AJÉ JÉJÉJÉ!JÉ=JÊ JÊJÊJÊJc              ƒ  óÀ   K  — | j                   4 ƒd{  –—†  | j                  ||«      ƒ d{  –—†  ddd«      ƒd{  –—†  y7 Œ/7 Œ7 Œ	# 1 ƒd{  –—†7  sw Y   yxY w­w)z®Handle an application error.

        May reset the server to Unknown, clear the pool, and request an
        immediate check depending on the error and the context.
        N)r|   ri  )r�   rµ   rX  s      r@   r+  zTopology.handle_error¡  sX   è ø€ ð —:‘:÷ 	7ñ 	7Ø×$Ñ$ W¨gÓ6×6Ð6÷	7÷ 	7ñ 	7øØ6øð	7ø÷ 	7÷ 	7ñ 	7üsQ   ‚A“A”A—A	­A®A	²A½A¾AÁA	ÁAÁ	AÁAÁAÁAc                ób   — | j                   j                  «       D ]  }|j                  «        Œ y)z3Wake all monitors. Hold the lock when calling this.N)r€   r¥   rd  rJ  s     r@   rÎ   zTopology._request_check_allª  s*   € à—m‘m×*Ñ*Ó,ò 	#ˆFØ× Ñ Õ"ñ	#r–   c           	   ƒ  ó‚  K  — | j                   j                  «       j                  «       D �]c  \  }}|| j                  vrÍ| j                  j                  || | j                  |«      | j                  ¬«      }d}| j                  r+| j                  �t        j                  | j                  «      }t        || j                  |«      || j                  | j                  |¬«      }|| j                  |<   |j                  «       ƒ d{  –—†  Œâ| j                  |   j                   j"                  }|| j                  |   _        ||j"                  k7  s�Œ*| j                  |   j$                  j'                  |j"                  «      ƒ d{  –—†  �Œf t)        | j                  j                  «       «      D ]  \  }}| j                   j+                  |«      rŒ"|j-                  «       ƒ d{  –—†  t.        s%| j0                  j3                  |j4                  «       | j                  j7                  |«       Œ� y7 �Œ17 Œ°7 ŒR­w)zrSync our Servers from TopologyDescription.server_descriptions.

        Hold the lock while calling this.
        )ró   Útopologyr×   r�   N)ró   r×   ÚmonitorÚtopology_idÚ	listenersÚevents)ro   rx   r2  r€   rk   Úmonitor_classÚ_create_pool_for_monitorr_   rb   r‡   rˆ   r   Ú_create_pool_for_serverrZ   r]   rŠ   rÆ   Úis_writabler×   Úupdate_is_writablerw   rü   r‰   r}   rŽ   rñ   r1  Úpop)r�   rµ   rº   rn  rR   rª   Úwas_writables          r@   rð   zTopology._update_servers¯  sÚ  è ø€ ð
  ×,Ñ,×@Ñ@ÓB×HÑHÓJó 	Y‰KˆG�RØ˜dŸm™mÑ+ØŸ.™.×6Ñ6Ø')Ø!Ø×6Ñ6°wÓ?Ø&*§n¡nð	 7ó �ð �Ø×'Ò'¨D¯L©LÐ,DÜ"Ÿ;™; t§|¡|Ó4�DÜØ')Ø×5Ñ5°gÓ>Ø#Ø $× 1Ñ 1Ø"Ÿo™oØô�ð *0�—‘˜gÑ&Ø—k‘k“m×#Ñ#ð  $Ÿ}™}¨WÑ5×AÑA×MÑM�à57�—‘˜gÑ&Ô2à 2§>¡>Ô1ØŸ-™-¨Ñ0×5Ñ5×HÑHÈÏÉÓX×XÒXð=	Yô@  $ D§M¡M×$7Ñ$7Ó$9Ó:ò 	+‰OˆG�VØ×$Ñ$×/Ñ/°Õ8Ø—l‘l“n×$Ð$ÝØ×'Ñ'×.Ñ.¨v¯©Ô?Ø—‘×!Ñ! 'Õ*ñ	+ð $ùð Yøð %úsE   ‚DH?ÄH8ÄAH?Å5H?Æ
H;ÆAH?ÇH?Ç*H=Ç+AH?È;H?È=H?c                óz   — | j                   j                  || j                   j                  | j                  ¬«      S )N)Ú	client_id)rk   Ú
pool_classÚpool_optionsrZ   r  s     r@   rt  z Topology._create_pool_for_serverÛ  s5   € Ø�~‰~×(Ñ(Ø�T—^‘^×0Ñ0¸D×<MÑ<Mð )ó 
ð 	
r–   c                óH  — | j                   j                  }t        |j                  |j                  |j                  |j
                  |j                  |j                  |j                  d|j                  ¬«	      }| j                   j                  ||d| j                  ¬«      S )NF)	Úconnect_timeoutÚsocket_timeoutÚssl_contextÚtls_allow_invalid_hostnamesÚevent_listenersÚappnameÚdriverÚpause_enabledÚ
server_apiT)Úis_sdamrz  )rk   r|  r'   r~  Ú_ssl_contextr�  r\   rƒ  r„  r†  r{  rZ   )r�   rµ   ÚoptionsÚmonitor_pool_optionss       r@   rs  z!Topology._create_pool_for_monitorà  s“   € Ø—.‘.×-Ñ-ˆô
  +Ø#×3Ñ3Ø"×2Ñ2Ø×,Ñ,Ø(/×(KÑ(KØ#×4Ñ4Ø—O‘OØ—>‘>ØØ×)Ñ)ô
 
Ðð �~‰~×(Ñ(ØÐ)°4À4×CTÑCTð )ó 
ð 	
r–   c                ó0  ‡— | j                   j                  t        j                  t        j                  fv }|rd}n,| j                   j                  t        j
                  k(  rd}nd}| j                   j                  r|t        u r|ryd|z  S d|› d|› d�S t        | j                   j                  «       «      }t        | j                   j                  «       j                  «       «      }|s-|r&d	j                  || j                  j                  «      S d
|z  S |d   j                  Št        ˆfd„|dd D «       «      }|r=‰€d|z  S |r)t!        |«      j#                  | j$                  «      sd|z  S t'        ‰«      S dj)                  d„ |D «       «      S )zeFormat an error message if server selection fails.

        Hold the lock when calling this.
        zreplica set membersÚmongosesrÙ   zNo primary available for writeszNo %s available for writeszNo z match selector "ú"z)No {} available for replica set name "{}"zNo %s availabler   c              3  ó<   •K  — | ]  }|j                   ‰k(  –— Œ y ­wrQ   r^  )Ú.0rª   rS  s     €r@   ú	<genexpr>z*Topology._error_message.<locals>.<genexpr>  s   øè ø€ ÒG°�v—|‘| uÕ,ÑGùs   ƒrM   NzNo %s found yetz\Could not reach any servers in %s. Replica set is configured with internal hostnames or IPs?ú,c              3  ó`   K  — | ]&  }|j                   sŒt        |j                   «      –— Œ( y ­wrQ   )rS  Ústr)r�  rª   s     r@   r�  z*Topology._error_message.<locals>.<genexpr>.  s   è ø€ ÒX°fÈ6Ï<Ë<¤ F§L¡L× 1ÑXùs   ‚.”.)ro   rë   r/   r  r  ÚShardedr#  r-   rw   rx   r¥   Úformatrk   rn   rS  Úallr  Úintersectionry   r“  r7  )r�   r¶   Úis_replica_setÚserver_pluralÚ	addressesrÙ   ÚsamerS  s          @r@   rË   zTopology._error_messageö  s™  ø€ ð
 ×*Ñ*×8Ñ8Ü×/Ñ/Ü×-Ñ-ð=
ð 
ˆñ
 Ø1‰MØ×Ñ×,Ñ,´×0EÑ0EÒEØ&‰Mà%ˆMà×Ñ×*Ò*àÔ3Ñ3Ù!Ø<à7¸-ÑGÐGà˜]˜OÐ+<¸X¸JÀaÐHÐHä˜T×.Ñ.×BÑBÓDÓEˆIÜ˜4×,Ñ,×@Ñ@ÓB×IÑIÓKÓLˆGÙÙ!àF×MÑMØ%ØŸ™×7Ñ7óð ð
 -¨}Ñ<Ð<ð ˜A‘J×$Ñ$ˆEÜÓG¸7À1À2¸;ÔGÓGˆDÙØ�=à,¨}Ñ<Ð<á!¬#¨i«.×*EÑ*EÀd×FZÑFZÔ*[ðFØHQñRðô
 ˜5“zÐ!à—x‘xÑXÀÔXÓXÐXr–   c              ƒ  ó4  K  — g }	 | j                   r6|j                  | j                   j                  «       «       | j                   rŒ6t	        j
                  |D �cg c]  }|j                  «       ‘Œ c}ddiŽƒ d {  –—†  y # t        $ r Y ŒEw xY wc c}w 7 Œ­w)NÚreturn_exceptionsT)rŽ   rñ   rw  Ú
IndexErrorÚasyncioÚgatherr7  )r�   ÚtasksÚts      r@   r²   zTopology.cleanup_monitors0  s‚   è ø€ Øˆð	Ø×%Ò%Ø—‘˜T×0Ñ0×4Ñ4Ó6Ô7ð ×%Ó%ô �n‰n°Ö7¨A˜qŸv™v�xÒ7ÐPÈ4ÑP×PÑPøô ò 	Ùð	üâ7ÐPúsA   ‚B†AB ÁBÁBÁ2
BÁ<BÁ=BÂ	BÂBÂBÂ	Bc                ót   — d}| j                   sd}d| j                  j                  › d|› | j                  ›d�S )NÚ zCLOSED ú<ú ú>)rz   Ú	__class__Ú__name__ro   )r�   Úmsgs     r@   Ú__repr__zTopology.__repr__9  s>   € ØˆØ�|Š|ØˆCØ�4—>‘>×*Ñ*Ð+¨1¨S¨E°$×2CÑ2CÐ1FÀaÐHÐHr–   c                óš   — | j                   }t        t        |j                  «      «      |j                  |j
                  |j                  fS )zDThe properties to use for AsyncMongoClient/Topology equality checks.)rk   ÚtupleÚsortedrt   rn   rŒ   Úsrv_service_name)r�   Útss     r@   Úeq_propszTopology.eq_props?  s8   € à�^‰^ˆÜ”f˜RŸX™XÓ&Ó'¨×)<Ñ)<¸b¿g¹gÀr×GZÑGZÐ[Ð[r–   c                ó|   — t        || j                  «      r!| j                  «       |j                  «       k(  S t        S rQ   )rU  r¨  r±  ÚNotImplemented)r�   Úothers     r@   Ú__eq__zTopology.__eq__D  s.   € Ü�e˜TŸ^™^Ô,Ø—=‘=“? e§n¡nÓ&6Ñ6Ð6ÜÐr–   c                ó4   — t        | j                  «       «      S rQ   )Úhashr±  r  s    r@   Ú__hash__zTopology.__hash__I  s   € Ü�D—M‘M“OÓ$Ð$r–   )r�   r4   )rX   ÚNone)rX   Úfloat)NNNN)r¶   ú Callable[[Selection], Selection]r·   r“  r­   úOptional[float]rµ   úOptional[_Address]r¸   úOptional[int]r±   úOptional[list[Server]]rX   zlist[Server]rQ   )r¶   r»  r®   rº  r·   r“  r¸   r¾  rµ   r½  r±   r¿  rX   úlist[ServerDescription])r¶   r»  r·   r“  r­   r¼  rµ   r½  r±   r¿  r¸   r¾  rX   r   )NN)
rµ   r6   r·   r“  r­   r¾  r¸   r¾  rX   r   )FF)ró   r(   rô   rY   rõ   rY   rX   r¹  )rÿ   zlist[tuple[str, Any]]rX   r¹  )rµ   r6   rX   zOptional[Server])rµ   r6   rX   rY   )rX   r½  )r¶   r»  rX   úset[_Address])rX   rÁ  )rX   zOptional[ClusterTime])r  úOptional[Mapping[str, Any]]rX   r¹  )é   )r   rÍ   rX   r¹  )rX   rÀ  )rX   r0   )rX   zlist[_ServerSession])r?  r¾  rX   r   )rB  r   rX   r¹  )rX   r)   )rµ   r6   rX  r*  rX   rY   )rµ   r6   rX  r*  rX   r¹  )rµ   r6   rX   r   )r¶   r»  rX   r“  )rX   r“  )rX   z>tuple[tuple[_Address, ...], Optional[str], Optional[str], str])r´  ÚobjectrX   rY   )rX   rÍ   )1r©  Ú
__module__Ú__qualname__Ú__doc__r•   rŠ   r¯   r»   r³   rÜ   rã   rå   rú   rý   r   r  r´   rü   r	  r  r  r  r  r  r  r!  r%  r/  r‰   ÚpropertyrÆ   r<  r>  rA  r  r§   r[  ri  r+  rÎ   rð   rt  rs  rË   r²   r«  r±  rµ  r¸  © r–   r@   rC   rC   h   s  „ Ù4óm4ó^%(óNð 59Ø&*Ø&*Ø8<ð-à2ð-ð ð-ð #2ð	-ð
 $ð-ð $ð-ð  6ð-ð 
ó-ðl 9=ðP#à2ðP#ð ðP#ð ð	P#ð
 $ðP#ð $ðP#ð  6ðP#ð 
!óP#ðl 59Ø&*Ø8<Ø&*ðà2ðð ðð #2ð	ð
 $ðð  6ðð $ðð 
óð: 59Ø&*Ø8<Ø&*ð à2ð ð ð ð #2ð	 ð
 $ð ð  6ð ð $ð ð 
ó ðL 37Ø&*ð
àð
ð ð
ð #0ð	
ð
 $ð
ð 
ó
ðH !Ø&+ð	E%à-ðE%ð ðE%ð  $ð	E%ð
 
óE%ðT !Ø&+ð	Uà-ðUð ðUð  $ð	Uð
 
óUó2ó:9ó*ó(óNðPØ8ðPà	óPóNóLó&ó6ó=ô?ó2óó"B<ðH ò!ó ð!ó,óNóAóFó óBBó(B+óH7ó#ó
*+óX
ó

ó,8YótQóIó\ó
ô
%r–   rC   c                  ó,   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dd„Zy)r*  z.An error with context for SDAM error handling.c                óJ   — || _         || _        || _        || _        || _        y rQ   )rS  rc  rP  r`  rQ  )r�   rS  rc  rP  r`  rQ  s         r@   r•   z_ErrorContext.__init__P  s*   € ð ˆŒ
Ø 0ˆÔØ.ˆÔØ#6ˆÔ Ø$ˆ�r–   N)
rS  ÚBaseExceptionrc  rÍ   rP  rÍ   r`  rY   rQ  zOptional[ObjectId])r©  rÅ  rÆ  rÇ  r•   rÉ  r–   r@   r*  r*  M  s:   „ Ù8ð%àð%ð ð%ð ð	%ð
 "ð%ð 'ô%r–   r*  c                ó:   — | �|€y| d   |d   k7  ry| d   |d   k\  S )z9Return True if the error's topologyVersion is <= current.FÚ	processIdÚcounterrÉ  )Ú
current_tvrZ  s     r@   rW  rW  _  s<   € ð Ð˜XÐ-ØØ�+Ñ (¨;Ñ"7Ò7ØØ�iÑ  H¨YÑ$7Ñ7Ð7r–   c                ój   — | j                   |j                   }}|�|€y|d   |d   k7  ry|d   |d   kD  S )z4Return True if the new topologyVersion is < current.FrÎ  rÏ  )rR  )Ú
current_sdÚnew_sdrÐ  Únew_tvs       r@   rè   rè   j  sN   € à#×4Ñ4°f×6MÑ6M�€JØÐ˜V˜^ØØ�+Ñ &¨Ñ"5Ò5ØØ�iÑ  6¨)Ñ#4Ñ4Ð4r–   )r;   z"weakref.ReferenceType[queue.Queue]rX   rY   )rÐ  rÂ  rZ  rÂ  rX   rY   )rÒ  r(   rÓ  r(   rX   rY   )[rÇ  Ú
__future__r   rŸ  rf   rž   r9   rÕ   r    rÃ   r£   r‡   Úpathlibr   Útypingr   r   r   r   r	   r
   Úpymongor   r   r   r   Ú#pymongo.asynchronous.client_sessionr   r   Úpymongo.asynchronous.monitorr   r   Úpymongo.asynchronous.poolr   Úpymongo.asynchronous.serverr   Úpymongo.errorsr   r   r   r   r   r   r   r   r   Úpymongo.hellor   Úpymongo.lockr   r    r!   Úpymongo.loggerr"   r#   r$   r%   r&   Úpymongo.pool_optionsr'   Úpymongo.server_descriptionr(   Úpymongo.server_selectorsr)   r*   r+   r,   r-   Úpymongo.topology_descriptionr.   r/   r0   r1   r2   Úbsonr3   Úpymongo.asynchronous.settingsr4   Úpymongo.typingsr5   r6   r}   r“  Ú__file__Úparentr¢   rA   rC   r*  rW  rè   rÉ  r–   r@   ú<module>rê     sí   ðñ Cå "ã Û Û 	Û Û Û 
Û Û Û Ý ß H× Hç DÓ Dß Rß @Ý *Ý .÷
÷ 
õ 
õ  ÷ñ ÷
õ õ -Ý 8÷õ ÷õ ñ ÝÝ>ß5à€á‘4˜“>×(Ñ(Ó)€ó÷"b%ñ b%÷J%ñ %ð$8Ø+ð8Ø7Rð8à	ó8ô5r–   