U
    ©Ê¹j  ã                   @   sŠ   d dl Z d dlZd dlmZ d dlmZ d dlmZ ee	ƒZ
dZdZdZdZdeeeeeedœdd„Zdd„ Zdd„ Zejdœdd„ZdS )é    N)Úclosing)Ú
get_loggerzAddress already in usezSocket Timeoutz_tcp_store/num_membersz_tcp_store/last_memberéÿÿÿÿé   éX  Té   )Ú	is_serverÚserver_addrÚserver_portÚ
world_sizeÚtimeoutÚwait_for_workersc              
   C   s$  |dkr$|dkr$t d|› d|› �ƒ‚|dkr8t d|¡ |dkrD|nd}|dkrV|}ntƒ }t d|||| |¡ z<tj|||| tj|d�|d�}	|ržt|	|ƒ t d	¡ |	W S  t	k
�r }
 zPt
|
ƒtk�r
||k rðt d
|||¡ |d7 }nt	d|› d|› d�ƒ|
‚n‚ W 5 d }
~
X Y qHX qHd S )Nr   r   zCserver_port must be specified when world_size > 1, got server_port=z, world_size=z+sever_port: %s, specified, ignoring retrieszVCreating c10d store on %s:%s
  world_size  : %s
  is_server   : %s
  timeout(sec): %s
)Úseconds)Z	host_nameÚportr   Z	is_masterr   r   zSuccessfully created c10d storez)port: %s already in use, attempt: [%s/%s]zon z, port: z already in use)Ú
ValueErrorÚlogÚinfoÚget_free_portÚdistZTCPStoreÚdatetimeÚ	timedeltaÚ_check_full_rankÚRuntimeErrorÚstrÚ_ADDRESS_IN_USEÚwarning)r   r	   r
   r   r   r   ÚretriesÚattemptr   ÚstoreÚe© r    új/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributed/elastic/utils/distributed.pyÚcreate_c10d_store   s^    	ÿ    û
ú	

   ÿ
ÿþr"   c              
   C   sx   |   td¡}||kr |  td¡ z|  t¡ W nD tk
rr } z&t|ƒtkr`td|› d�ƒ|‚n‚ W 5 d }~X Y nX d S )Nr   z<val_ignored>ztimed out waiting for all z members to join)	ÚaddÚ_MEMBER_CHECKINÚsetÚ_LAST_MEMBER_CHECKINÚgetr   r   Ú_SOCKET_TIMEOUTÚTimeoutError)r   r   Úidxr   r    r    r!   r   \   s    
ÿþr   c               
   C   s2   t ƒ } t| ƒ� |  ¡ d W  5 Q R £ S Q R X d S )Nr   )Úget_socket_with_portr   Úgetsockname)Úsockr    r    r!   r   l   s    
r   )Úreturnc                  C   s    t jddt jt jd�} | D ]x}|\}}}}}t   |||¡}z| d¡ | d¡ |W   S  tk
r� } z| ¡  tj	d|d� W 5 d}~X Y qX qt
dƒ‚dS )	aÄ  
    Returns a free port on localhost that is "reserved" by binding a temporary
    socket on it. Close the socket before passing the port to the entity
    that requires it. Usage example

    ::

    sock = _get_socket_with_port()
    with closing(sock):
        port = sock.getsockname()[1]
        sock.close()
        # there is still a race-condition that some other process
        # may grab this port before func() runs
        func(port)
    Ú	localhostN)Úhostr   ÚfamilyÚtype)r/   r   r   zSocket creation attempt failed.)Úexc_infozFailed to create a socket)ÚsocketÚgetaddrinfoÚ	AF_UNSPECÚSOCK_STREAMÚbindÚlistenÚOSErrorÚcloser   r   r   )ÚaddrsÚaddrr1   r2   ÚprotoÚ_Úsr   r    r    r!   r+   r   s"       ÿ


"r+   )r   r   r   Tr   )r   r4   Ú
contextlibr   Ztorch.distributedÚdistributedr   Z'torch.distributed.elastic.utils.loggingr   Ú__name__r   r   r(   r$   r&   Úboolr   ÚintÚfloatr"   r   r   r+   r    r    r    r!   Ú<module>   s2        ùúC