o
    bi                     @   s   d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	  m
Z d dlmZ d dlmZmZmZ eeZejZG dd dZdS )    N)ListOptional)Version)get_or_create_event_loop)aiohttpaiohttp_corshdrsc                   @   s\   e Zd ZdededdfddZ	dd	ed
edejj	fddZ
deddfddZdddZdS )HttpServerAgentiplisten_portreturnNc                 C   s(   || _ || _d | _d | _d | _d | _d S N)r
   r   	http_host	http_porthttp_sessionrunner)selfr
   r    r   S/home/ubuntu/.local/lib/python3.10/site-packages/ray/dashboard/http_server_agent.py__init__   s   
zHttpServerAgent.__init__   皙?max_retries
base_delayc                    s4  d}t |d D ]}z.tj| j| jdkrdnd| j}| I dH  |dkr5t	d| j d| d |W   S  t
y } zR|}||k rv|d	|  tdd
 }td| j d|d  d|d  d|dd| 
 t|I dH  ntd| j d|d  d W Y d}~ |W Y d}~q	d}~ww |)aK  Start the TCP site with retry logic and exponential backoff.

        Args:
            max_retries: Maximum number of retry attempts
            base_delay: Base delay in seconds for exponential backoff

        Returns:
            The started site object

        Raises:
            OSError: If all retry attempts fail
        N   z	127.0.0.1z0.0.0.0r   z#Successfully started agent on port z after z retry attempts   r   zFailed to bind to port z
 (attempt /z). Retrying in z.2fz
s. Error: zAgent port #z failed to bind after z
 attempts.)ranger   webTCPSiter   r
   r   startloggerinfoOSErrorrandomuniformwarningasynciosleep	exception)r   r   r   last_exceptionattemptsiteedelayr   r   r   _start_site_with_retry   sT   


z&HttpServerAgent._start_site_with_retrymodulesc           
   	      s2  t tjt dk rtjt d| _nt | _|D ]}tj| qtj	
 }|jt d tj|dtjdddddid}t|j D ]}|| qGtj	|| _| j I d H  |  I d H }|jjd	  ^| _| _}td
| j| j dd |j D }|D ]}	t|	 qtdt| d S )Nz4.0.0)loop)routes*T)zContent-TypezX-Header)allow_credentialsexpose_headersallow_methodsallow_headers)defaultsr   z#Dashboard agent http address: %s:%sc                 S   s   g | ]
}|j tjkr|qS r   )methodr   	METH_HEAD).0rr   r   r   
<listcomp>x   s    z)HttpServerAgent.start.<locals>.<listcomp>zRegistered %s routes.)r   r   __version__ClientSessionr   r   dashboard_optional_utilsDashboardAgentRouteTablebindr   Application
add_routesr2   bound_routesr   setupResourceOptionslistrouteradd	AppRunnerr   r/   _serversocketsgetsocknamer   r   r!   r"   len)
r   r0   cappcorsrouter,   _dump_routesr<   r   r   r   r    M   s>   


zHttpServerAgent.startc                    s&   | j  I d H  | j I d H  d S r   )r   cleanupr   close)r   r   r   r   rV   }   s   zHttpServerAgent.cleanup)r   r   )r   N)__name__
__module____qualname__strintr   floatr   r   r   r/   r   r    rV   r   r   r   r   r	      s    	
40r	   )r'   loggingr$   typingr   r   packaging.versionr   ray.dashboard.optional_utils	dashboardoptional_utilsr@   ray._common.utilsr   ray.dashboard.optional_depsr   r   r   	getLoggerrX   r!   rA   r2   r	   r   r   r   r   <module>   s    
