o
    $i                     @   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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)build_addressis_localhost)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   \/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/ray/dashboard/http_server_agent.py__init__   s   
zHttpServerAgent.__init__   皙?max_retries
base_delayc           	         sT  d}t |d D ]}z>tj| j| j| j}| I dH  t| js4tj| jd| j}| I dH  |dkrEt	
d| j d| d |W   S  ty } zR|}||k r|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.1r   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   startr   loggerinfoOSErrorrandomuniformwarningasynciosleep	exception)	r   r   r   last_exceptionattemptsite
local_siteedelayr   r   r   _start_site_with_retry   sb   



z&HttpServerAgent._start_site_with_retrymodulesc           
   	      s6  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
t| 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: %sc                 S   s   g | ]
}|j tjkr|qS r   )methodr
   	METH_HEAD).0rr   r   r   
<listcomp>   s    z)HttpServerAgent.start.<locals>.<listcomp>zRegistered %s routes.) r   r   __version__ClientSessionr   r   dashboard_optional_utilsDashboardAgentRouteTablebindr    Application
add_routesr5   bound_routesr	   setupResourceOptionslistrouteradd	AppRunnerr   r2   _serversocketsgetsocknamer   r   r#   r$   r   len)
r   r3   cappcorsrouter.   _dump_routesr?   r   r   r   r"   U   s@   

zHttpServerAgent.startc                    s&   | j  I d H  | j I d H  d S r   )r   cleanupr   close)r   r   r   r   rY      s   zHttpServerAgent.cleanup)r   r   )r   N)__name__
__module____qualname__strintr   floatr   r    r!   r2   r   r"   rY   r   r   r   r   r      s    	
;1r   )r)   loggingr&   typingr   r   packaging.versionr   ray.dashboard.optional_utils	dashboardoptional_utilsrC   ray._common.network_utilsr   r   ray._common.utilsr   ray.dashboard.optional_depsr   r	   r
   	getLoggerr[   r#   rD   r5   r   r   r   r   r   <module>   s    
