B
    4\;%                 @   s  d dl mZmZ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mZmZ d dlmZ d dlZd dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
l m!Z!m"Z"m#Z#m$Z$m%Z% e!g ddd Z&e!g ddd Z'e!eddd Z(e!g ddddd Z)dd Z*e!g ddd Z+e#e!edgddidd d! Z,G d"d# d#eZ-e!ded$d%d& Z.e!ded'e-id(d)d* Z/e#e!dg d+d,d- Z0e!ded$d.d/ Z1ej2j3ej45d0d1d2e!dg d+d3d4 Z6ej2j3ej45d5 d6d2e!dg d+d7d8 Z7e" d9d: Z8e!ded;gd<d=d> Z9e!dgded?d@idddAdBdC Z:e!g ddDdEdF Z;e!g ddDdGdH Z<e#e" dIdJ Z=e!g ddDdKdL Z>dS )M    )print_functiondivisionabsolute_importN)valmapfirst)gen)Nannyrpc	SchedulerWorker)CommClosedError)time)dumps)ignoringtmpfile)gen_clustergen_testslowinccaptured_logger)ncoresc          	   c   sN  t | j| jd| jd}|dV  t|j}| s<t| j	|j
 dksPt| j|j
 jd dksjt| V  | rt|j
| j	kst|j
| jkst| V  | rt|j
| j	kst|j
| jkst| V  | st| j	|j
 dkst| j|j
 jd dkst| V  | r6tW d Q R X | V  d S )N   )r   loopr   nannyi   )r   ipportr   _startr	   addressis_aliveAssertionErrorr   worker_addressworkersZserviceskillZinstantiateZ	terminate_close)snnn r'   ;lib/python3.7/site-packages/distributed/tests/test_nanny.py
test_nanny   s*    



r)   c             #   sh   t | jd| jd  dV    s*t fddtdD V   fddtdD V    V  d S )Nr   )r   r   r   c                s   g | ]}   qS r'   )r"   ).0i)r%   r'   r(   
<listcomp>=   s    z#test_many_kills.<locals>.<listcomp>   c                s   g | ]}   qS r'   )r"   )r*   r+   )r%   r'   r(   r,   >   s    )r   r   r   r   r   r   ranger#   )r$   r'   )r%   r(   test_many_kills8   s    r/   )r   c             C   sT   |j t|kst|j t|ks$tt|jt|ks:tt|jt|ksPtd S )N)r    strr   reprr   )r$   abr'   r'   r(   test_strB   s    r4      T)r   timeoutclientc       	   	   c   s  t |j|jd|jd}| V  |j}tj|s6t	|j
}t|j
}|jttddddV  |j}|d k	srt	tt | jtjd|j
gdV  W d Q R X t }x,|j|krtdV  t | d	k st	qW t }x,| stdV  t | d	k st	qW t }x@|j
|jks(|jd krLtdV  t | d	k st	qW |j}| V  tj|rpt	tj|rt	||jkst	|  |  d S )
Nr   )r   r      )xy)datar   )r!   g{Gz?r-   )r   r   r   r   r   Z
worker_dirospathexistsr   r    r	   Zupdate_datar   r   pidr   r   _run_exitr   r   sleepr   r   r#   Z	close_rpcstop)	cr$   r%   Z	first_dirZoriginal_addressZwwr?   startZ
second_dirr'   r'   r(   test_nanny_process_failureJ   s<    


"
rF   c              C   s   t tdd} d S )Nz	127.0.0.1iR"  )r0   r   )_r'   r'   r(   test_nanny_no_portu   s    rH   c          	   c   s   t d t| j| jd| jd}| V  t|j<}|j	t
dd dV }|d dks\t|d	 d
ksltW d Q R X | V  d S )Npsutilr   )r   r   c               S   s   dS )Nr8   r'   r'   r'   r'   r(   <lambda>   s    ztest_run.<locals>.<lambda>)ZfunctionstatusZOKresultr8   )pytestimportorskipr   r   r   r   r   r	   r   runr   r   r#   )r$   r%   r&   responser'   r'   r(   test_runy   s    

rQ   )z	127.0.0.1r8   Z	reconnectF)r   r   worker_kwargsc             c   sB   |   V  t }x,|jdkr<tdV  t |d k stqW d S )Nclosedg?	   )closer   rK   r   rB   r   )r$   wrE   r'   r'   r(   test_close_on_disconnect   s
    
rW   c               @   s   e Zd ZdS )	SomethingN)__name__
__module____qualname__r'   r'   r'   r(   rX      s   rX   )r7   r   c             c   s<   |  dddV }dt| d ks*t|jtks8td S )Nc             S   s
   t | jS )N)r0   	__class__)dask_workerr'   r'   r(   rJ      s    z)test_nanny_worker_class.<locals>.<lambda>r   r   )N)r@   listvaluesr   r   )rD   r$   w1w2outr'   r'   r(   test_nanny_worker_class   s    rc   Zworker_class)r7   r   rR   c             c   s<   |  dddV }dt| d ks*t|jtks8td S )Nc             S   s
   t | jS )N)r0   r\   )r]   r'   r'   r(   rJ      s    z-test_nanny_alt_worker_class.<locals>.<lambda>rX   r   )N)r@   r^   r_   r   r   rX   )rD   r$   r`   ra   rb   r'   r'   r(   test_nanny_alt_worker_class   s    rd   )r7   r   c             c   s@   |   V  t| jdd}| V  tdV  |jdks<td S )Nr8   )Zdeath_timeout   rS   )rU   r   r   r   r   rB   rK   r   )r$   rV   r'   r'   r(   test_nanny_death_timeout   s
    

rf   c             #   s6   t j fdd}|dd V  |dd V  d S )Nc             3   sX   j | ddd jd}j | dddjd}|j|jks<t|V }|V }||ksTtd S )Nr   l        F)Zpurer!   )submitr    keyr   )funcr9   r:   )r2   r3   rD   r'   r(   
check_func   s    z$test_random_seed.<locals>.check_funcc             S   s   t | |S )N)randomrandint)r2   r3   r'   r'   r(   rJ      s    z"test_random_seed.<locals>.<lambda>c             S   s   t j| |S )N)nprk   rl   )r2   r3   r'   r'   r(   rJ      s    )r   	coroutine)rD   r$   r2   r3   rj   r'   )r2   r3   rD   r(   test_random_seed   s    	ro   winz num_fds not supported on windows)reasonc             c   s   t d}| }t| j}| V  | V  ~t  |	 }x:t
dD ].}t| j}| V  tdV  | V  qLW t }x>|	 |krtd||	  tdV  t |d k stqW d S )NrI   re   g?zfds:
   )rM   rN   ZProcessr   r   r   r#   gcZcollectZnum_fdsr.   r   rB   r   printr   )r$   rI   procrV   Zbeforer+   rE   r'   r'   r(   test_num_fds   s$    





rv   Zlinuxz Need 127.0.0.2 to mean localhostc             c   sZ   xTdD ]L}t |j}||V  dd }| |V }|t| ksHt| V  qW d S )N)ztcp://0.0.0.0ztcp://127.0.0.2c             S   s   | j jS )N)ZlistenerZlisten_address)r]   r'   r'   r(   ri      s    z1test_worker_uses_same_host_as_nanny.<locals>.func)r   r   r   rO   r   r_   r   r#   )rD   r$   Zhostr%   ri   rL   r'   r'   r(   #test_worker_uses_same_host_as_nanny   s    

rw   c           	   c   sf   t  V} t| d}|d t| d}| V  t|j|jhksFt|	 V  |
  W d Q R X d S )N)Zscheduler_fileiH  )r   r
   rE   r   r   setr!   r    r   r#   rC   )fnr$   rV   r'   r'   r(   test_scheduler_file   s    




rz   )z	127.0.0.1r   )r7   r   r   c          	   c   s   |  dV }ttdtjd}|jddV }W d Q R X | }d| ksRtt	 }x,|j
dkrtdV  t	 |d k sZtqZW d S )	N{   zdistributed.nanny)levelg?)r6   z	timed outZ	cancelled   )Zscatterr   logging	getLoggerZERRORrestartgetvaluelowerr   r   rK   r   rB   )rD   r$   r2   r9   loggerrP   rb   rE   r'   r'   r(   test_nanny_timeout   s    
r   memory_limitg    חA)r   r7   r   rR   r6   Zcheck_new_threadsc       	   	   #   s   ddl m   fdd}|jj}ttdn}| |}t  }x.|jj|krntdV  t  |d k sBt	qBW |
 }d| kst	d	| kst	W d Q R X d S )
Nr   )rB   c                 s$   g } x|  dd   d qW d S )N   0i@KL g{Gz?)append)L)rB   r'   r(   leak  s    z"test_nanny_terminate.<locals>.leakzdistributed.nannyg?rr   r   memory)r   rB   Zprocessr?   r   r~   r   rg   r   r   r   r   )	rD   r$   r2   r   ru   r   futurerE   rb   r'   )rB   r(   test_nanny_terminate  s    
r   )r   r7   c             c   s   t |j|jdd}| V  | dd V }||jtiks>t| dd V }d|ksZtd|jksht| 	t
d}|V dksttd	V  | 	t
dV  | V  d S )
Nr   )r   r   c             S   s
   t | jS )N)typer;   )r]   r'   r'   r(   rJ   '  s    z9test_avoid_memory_monitor_if_zero_limit.<locals>.<lambda>c             S   s
   t | jS )N)r^   periodic_callbacks)r]   r'   r'   r(   rJ   )  s    r   r8   r   g{Gz?)r   r   r   r   rO   r    dictr   r   rg   r   r   rB   r#   )rD   r$   r   typZpcsr   r'   r'   r(   'test_avoid_memory_monitor_if_zero_limit#  s    
r   c          	   c   s   t jd|ji^ t|jd}| V  |jj|jks<tt	 }x(|j
sjtdV  t	 |d k sDtqDW W d Q R X | V  d S )Nzscheduler-address)r   g?rr   )daskZconfigrx   r   r   r   r   Z	schedulerr   r   r!   r   rB   r#   )rD   r$   r   rE   r'   r'   r(   test_scheduler_address_config6  s    
 r   c           	   c   sd   t d"} td}|  tdV  W d Q R X |  } d|  ksLt| d|  ks`t| d S )Ndistributedz127.0.0.1:44737   errorr   )r   r   r   r   rB   r   r   r   )logrV   r'   r'   r(   test_wait_for_schedulerE  s    
r   c             c   s   t |j|jdddid}t |j|jdddid}| | gV  | dd V }||jd|jdiksjt| | gV  d S )Nr   FOOZ123)r   r   envZ456c               S   s
   t jd S )Nr   )r<   environr'   r'   r'   r(   rJ   W  s    z+test_environment_variable.<locals>.<lambda>)r   r   r   r   rO   r    r   r#   )rD   r$   r2   r3   Zresultsr'   r'   r(   test_environment_variableR  s    r   )?Z
__future__r   r   r   rs   r~   r<   rk   sysZnumpyrm   rM   Ztoolzr   r   Ztornador   r   r   r   r	   r
   r   Zdistributed.corer   Zdistributed.metricsr   Zdistributed.protocol.pickler   Zdistributed.utilsr   r   Zdistributed.utils_testr   r   r   r   r   r)   r/   r4   rF   rH   rQ   rW   rX   rc   rd   rf   ro   ZmarkZskipifplatform
startswithrv   rw   rz   r   r   r   r   r   r   r'   r'   r'   r(   <module>   sb   
+


