U
    /e                     @  sd   d dl mZ d dlZ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 G dd deZdS )    )annotationsN)Literal)parse_timedelta)WorkerPluginc                   @  sB   e Zd ZdZddddddZd	d
 Zdd Zdd Zdd ZdS )
KillWorkera  Kill Workers Randomly

    This kills workers in a cluster randomly.  It is intended to be used in
    stress testing.

    Parameters
    ----------
    delay: str
        The expected amount of time for a worker to live.
        The actual time will vary, treating worker death as a poisson process.
    mode: str
        or "graceful" which calls worker.close(...)
        Either "sys.exit" which calls sys.exit(0)
        or "segfault" which triggers a segfault
    100 ssys.exitzstr | int | floatz-Literal[('sys.exit', 'graceful', 'segfault')])delaymodec                 C  s*   t || _|dkr td||| _d S )N)r   gracefulsegfaultzCThree modes supported, 'sys.exit', 'graceful', and 'segfault'. got )r   r	   
ValueErrorr
   )selfr	   r
    r   5/tmp/pip-unpacked-wheel-g426oqom/distributed/chaos.py__init__   s    
zKillWorker.__init__c                   s^   || _ | jdkr| j}n"| jdkr*| j}n| jdkr:| j}| j jjjt	d| j
 |d d S )Nr   r   r      )r	   callback)workerr
   r   sys_exitr   ZloopZasyncio_loopZ
call_laterrandomexpovariater	   )r   r   fr   r   r   setup,   s    



zKillWorker.setupc                 C  s   t | jjddd d S )NF)ZnannyZexecutor_wait)asyncioZcreate_taskr   closer   r   r   r   r   :   s    zKillWorker.gracefulc                 C  s   t d d S )Nr   )sysexitr   r   r   r   r   =   s    zKillWorker.sys_exitc                 C  s   t d dS )z
        Magic, from https://gist.github.com/coolreader18/6dbe0be2ae2192e90e1a809f1624c694?permalink_comment_id=3874116#gistcomment-3874116
        r   N)ctypes	string_atr   r   r   r   r   @   s    zKillWorker.segfaultN)r   r   )	__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r      s     r   )
__future__r   r   r   r   r   typingr   Z
dask.utilsr   Zdistributed.diagnostics.pluginr   r   r   r   r   r   <module>   s   