U
    yh                  	   @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ	 d dl
mZ d dlmZ dddgZeeZd	Zd
ZdZdee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)Optional)
get_logger)barriercreate_c10d_storeget_free_portget_socket_with_portzAddress already in usezSocket Timeoutz_tcp_store/num_members   X  T   )	is_serverserver_addrserver_port
world_sizetimeoutwait_for_workers	use_libuvc              
   C   sJ  |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||	|| tj	|d|d}
|d kr|
 }n
|
|d	}|rt
|||d
 td |W S  tk
rB } zRt|tkr0||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 retriesziCreating c10d store on %s:%s
  world_size  : %s
  is_server   : %s
  timeout(sec): %s
  use_libuv   : %s
)seconds)Z	host_nameportr   Z	is_masterr   r   )r   )r   zSuccessfully created c10d storez)port: %s already in use, attempt: [%s/%s]zon z, port: z already in use)
ValueErrorloggerinfor   	functoolspartialdistZTCPStoredatetime	timedelta_check_full_rankRuntimeErrorstr_ADDRESS_IN_USEwarning)r   r   r   r   r   r   retriesr   attemptr   Zstore_builderstoree r'   ]/var/www/html/venv/lib/python3.8/site-packages/torch/distributed/elastic/utils/distributed.pyr      sh    
     	
	


   
c              
   C   s^   zt | |t|d W nD tk
rX } z&t|tkrFtd| d|n W 5 d }~X Y nX d S )N)Z
key_prefixZbarrier_timeoutztimed out waiting for all z members to join)r   _TCP_STORE_INITr   r    _SOCKET_TIMEOUTTimeoutError)r%   r   r   r&   r'   r'   r(   r   h   s    
r   c               
   C   s2   t  } t|  |  d W  5 Q R  S Q R X d S )Nr
   )r   r   getsockname)sockr'   r'   r(   r   t   s    
)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   z   s"       


")r	   r
   r   Tr   N)r   r   r4   
contextlibr   typingr   Ztorch.distributeddistributedr   Z'torch.distributed.elastic.utils.loggingr   Z%torch.distributed.elastic.utils.storer   __all____name__r   r!   r*   r)   boolr    intfloatr   r   r   r   r'   r'   r'   r(   <module>	   s<   
      K