HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/env/lib/python3.10/site-packages/gunicorn/__pycache__/arbiter.cpython-310.pyc
o

%weT�@s�ddlZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
ddlmZddl
mZmZmZddl
mZmZGdd�de�ZdS)�N)�
HaltServer�AppImportError)�Pidfile)�sock�systemd�util)�__version__�SERVER_SOFTWAREc@sbeZdZdZdZdZiZgZiZgZ	gZ
dd�d��D�Ze
dd�ee�D��Zd	d
�Zdd�Zd
d�Zeee�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Z d'd(�Z!d)d*�Z"d+d,�Z#d-d.�Z$d/d0�Z%dLd3d4�Z&d5d6�Z'dMd8d9�Z(d:d;�Z)d<d=�Z*d>d?�Z+d@dA�Z,dBdC�Z-dDdE�Z.dFdG�Z/dHdI�Z0dJdK�Z1d1S)N�Arbiterz�
    Arbiter maintain the workers processes alive. It launches or
    kills them if needed. It also manages application reloading
    via SIGHUP/USR2.
    ��cCsg|]	}ttd|��qS)zSIG%s)�getattr�signal)�.0�x�r�I/home/arjun/projects/env/lib/python3.10/site-packages/gunicorn/arbiter.py�
<listcomp>,s�zArbiter.<listcomp>z+HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCHccsF�|]}|dd�dkr|ddkrtt|�|dd���fVqdS)Nr�SIG�_)r
r�lower)r�namerrr�	<genexpr>.s���zArbiter.<genexpr>cCs�ttjd<d|_d|_d|_|�|�d|_d|_d|_	d|_
d|_d|_t
��}tjdd�}|�dtj�||tjd�|_dS)Nr	Fr�Master)�args�cwdr)r	�os�environ�_num_workers� _last_logged_active_worker_count�log�setup�pidfiler�
worker_age�
reexec_pid�
master_pid�master_namer�getcwd�sys�argv�insert�
executable�	START_CTX)�self�apprrrrr�__init__3s$

�zArbiter.__init__cCs|jS�N)r�r-rrr�_get_num_workersOszArbiter._get_num_workerscCs |j}||_|j�|||�dSr0)r�cfg�nworkers_changed)r-�value�	old_valuerrr�_set_num_workersRszArbiter._set_num_workerscCs�||_|j|_|jdur|j�|j�|_dtjvr|j��|jj|_|jj|_|jj	|_
|jj|_|jj|_|j�
d�d�dd�t|jj��dd�d�D����|jjrf|jj��D]	\}}|tj|<q\|jjrq|j��dSdS)	N�GUNICORN_FDzCurrent configuration:
{0}�
css"�|]\}}d�||j�VqdS)z
  {0}: {1}N)�formatr5)r�configr5rrrrjs
��
�z Arbiter.setup.<locals>.<genexpr>cSs|dS�N�r)�settingrrr�<lambda>nszArbiter.setup.<locals>.<lambda>��key)r.r3r �logger_classrr�reopen_files�worker_class�address�workers�num_workers�timeout�	proc_name�debugr:�join�sorted�settings�items�env�preload_app�wsgi)r-r.�k�vrrrr!Xs0









����z
Arbiter.setupcCs�|j�dt�dtjvrttj�d��|_|jd|_d|_	t�
�|_|jj
durB|jj
}|jdkr6|d7}t|�|_
|j
�|j�|j�|�|��|js�d}t��}|rdd|_ttjtj|�}n|jr|g}tj�d��d	�D]	}|�t|��qrt�|j|j|�|_d	�d
d�|jD��}|j�d�|j�d
||j�|j�d|jj�t�d|j�t |j!d�r�|j!�"|j|j�|j�#|�dS)zS        Initialize the arbiter. Start listening and set pidfile if needed.
        zStarting gunicorn %s�GUNICORN_PIDz.2zMaster.2NrTr8�,cS�g|]}t|��qSr��str�r�lnrrrrr��z!Arbiter.start.<locals>.<listcomp>zArbiter bootedzListening at: %s (%s)zUsing worker: %sz&READY=1
STATUS=Gunicorn arbiter booted�check_config)$r �inforrr�int�getr%rIr&�getpid�pidr3r"r�create�on_starting�init_signals�	LISTENERSr�
listen_fds�range�SD_LISTEN_FDS_START�pop�split�appendr�create_socketsrKrJ�worker_class_str�	sd_notify�hasattrrDr\�
when_ready)r-�pidname�fdsrf�fd�
listeners_strrrr�startxsF



�z
Arbiter.startcCsz|jD]}t�|�qt��|_}|D]}t�|�t�|�q|j��|jD]	}t	�	||j	�q)t	�	t	j
|j�dS)z�        Initialize master signal handling. Most of the signals
        are queued. Child signals only wake up the master.
        N)�PIPEr�close�piper�set_non_blocking�
close_on_execr �SIGNALSr�SIGCHLD�handle_chld)r-�p�pair�srrrrd�s



zArbiter.init_signalscCs*t|j�dkr|j�|�|��dSdS)N�)�len�	SIG_QUEUErk�wakeup�r-�sig�framerrrr�s�zArbiter.signalc
Csz|��t�d|j�zY|��	|��|jr|j�d�nd}|dur2|��|�	�|��q||j
vr?|j�d|�q|j
�
|�}t|d|d�}|sW|j�d|�q|j�d|�|�|��qttfyu|��YdSty�}z|j|j|jd	�WYd}~dSd}~wty��ty�|jjd
dd�|�d�|jdur�|j��t�d
�YdSw)zMain master loop.�master [%s]TrNzIgnoring unknown signal: %sz	handle_%szUnhandled signal: %szHandling signal: %s)�reason�exit_statusz Unhandled exception in main loop��exc_infoF���)rur�
_setproctitlerI�manage_workers�maybe_promote_masterr�ri�sleep�murder_workers�	SIG_NAMESr r]r_r
�errorr��
StopIteration�KeyboardInterrupt�haltrr�r��
SystemExit�	Exception�stopr"�unlinkr(�exit)r-r��signame�handler�instrrr�run�sP
� ��


�zArbiter.runcCs|��|��dS)zSIGCHLD handlingN)�reap_workersr�r�rrrr}�szArbiter.handle_chldcCs|j�d|j�|��dS)z�        HUP handling.
        - Reload configuration
        - Start the new worker processes with a new configuration
        - Gracefully shutdown the old worker processes
        zHang up: %sN)r r]r&�reloadr1rrr�
handle_hup�szArbiter.handle_hupcCst�)zSIGTERM handling)r�r1rrr�handle_term�szArbiter.handle_termcC�|�d�t�)zSIGINT handlingF�r�r�r1rrr�
handle_int�
zArbiter.handle_intcCr�)zSIGQUIT handlingFr�r1rrr�handle_quitr�zArbiter.handle_quitcCs|jd7_|��dS)zR        SIGTTIN handling.
        Increases the number of workers by one.
        r=N�rGr�r1rrr�handle_ttin
szArbiter.handle_ttincCs(|jdkrdS|jd8_|��dS)zR        SIGTTOU handling.
        Decreases the number of workers by one.
        r=Nr�r1rrr�handle_ttous
zArbiter.handle_ttoucCs|j��|�tj�dS)zU        SIGUSR1 handling.
        Kill all workers by sending them a SIGUSR1
        N)r rC�kill_workersr�SIGUSR1r1rrr�handle_usr1s
zArbiter.handle_usr1cCs|��dS)z�        SIGUSR2 handling.
        Creates a new arbiter/worker set as a fork of the current
        arbiter without affecting old workers. Use this to do live
        deployment with the ability to backout a change.
        N)�reexecr1rrr�handle_usr2'szArbiter.handle_usr2cCs:|jjr|j�d�d|_|�tj�dS|j�d�dS)zSIGWINCH handlingzgraceful stop of workersrz SIGWINCH ignored. Not daemonizedN)	r3�daemonr r]rGr�r�SIGTERMrJr1rrr�handle_winch0s
zArbiter.handle_winchcCsx|jdkrdS|jt��kr:|j�d�d|_d|_|jj|_tjd=|j	dur0|j	�
|jj	�t�d|j�dSdS)NrzMaster has been promoted.rrTr�)
r%r�getppidr r]r&r3rIrr"�renamerr�r1rrrr�9s


�zArbiter.maybe_promote_masterc
CsTzt�|jdd�WdSty)}z|jtjtjfvr�WYd}~dSd}~ww)z;        Wake up the arbiter by writing to the PIPE
        r=�.N)r�writerv�IOError�errno�EAGAIN�EINTR)r-�errrr�Js���zArbiter.wakeupNrcCsl|��|dkr|jjn|jj}|d|j�|dur|d|�|jdur)|j��|j�|�t	�
|�dS)z halt arbiter rzShutting down: %sNz
Reason: %s)r�r r]r�r&r"r�r3�on_exitr(r�)r-r�r��log_funcrrrr�Ts


zArbiter.haltc
Cs�z,t�|jdgggd�}|dsWdSt�|jdd�r*	t�|jdd�sWdSWdStjtfyT}zt|d|jd�}|tj	tj
fvrI�WYd}~dSd}~wtyat�
�YdSw)zm        Sleep until PIPE is readable or we timeout.
        A readable PIPE means a signal occurred.
        rg�?Nr=r�)�selectrvr�readr��OSErrorr
rr�r�r�r�r(r�)r-�readyr��error_numberrrrr�bs ����z
Arbiter.sleepTcCs�|j|jkodkno|jo|jj}t�|j|�g|_tj	}|s)tj
}t��|jj}|�
|�|jrMt��|krMt�d�|jrMt��|ks?|�
tj�dS)z�        Stop workers

        :attr graceful: boolean, If True (the default) workers will be
        killed gracefully  (ie. trying to wait for the current connection)
        r皙�����?N)r$r%rr3�
reuse_portr�
close_socketsrerr��SIGQUIT�time�graceful_timeoutr��WORKERSr��SIGKILL)r-�gracefulr�r��limitrrrr�us ��

�zArbiter.stopcCs�|jdkr
|j�d�dS|jdkr|j�d�dSt��}t��|_|jdkr*dS|j�|�|jj	�
�}t|�|d<|jrQtt���|d<tt
|j��|d<n
d�d	d
�|jD��|d<t�|jd�t�|jd|jd
|�dS)z1        Relaunch the master and workers.
        rz"USR2 signal ignored. Child exists.Nz#USR2 signal ignored. Parent exists.rT�
LISTEN_PID�
LISTEN_FDSrUcss�|]	}t|���VqdSr0)rX�filenorYrrrr�s�
�z!Arbiter.reexec.<locals>.<genexpr>r8rr)r$r �warningr%rr`�forkr3�pre_exec�env_orig�copyrXrr�rerK�chdirr,�execvpe)r-r%rrrrr��s*




�zArbiter.reexecc	CsH|jj}|jjD]!}||jjvr|jj|tj|<qztj|=Wqty)Yqw|j��|�	|j�|j
��||jjkre|jD]}|�
�qCt�|j|j
�|_d�dd�|jD��}|j
�d|�|j�|�|jduru|j��|jjdur�t|jj�|_|j�|j�t�d|j�t|jj�D]}|��q�|��dS)NrUcSrVrrWrYrrrr�r[z"Arbiter.reload.<locals>.<listcomp>zListening at: %sr�)r3rErOr�rr�KeyErrorr.r�r!r rCrerwrrlrKr]�	on_reloadr"r�rrbrarr�rIrgrF�spawn_workerr�)r-�old_addressrRrZrtrrrrr��s8�






zArbiter.reloadc
Cs�|jsdSt|j���}|D]<\}}zt��|j��|jkr!WqWnttfy-Yqw|j	sC|j
�d|�d|_	|�|t
j�q|�|t
j�qdS)z)        Kill unused/idle workers
        NzWORKER TIMEOUT (pid:%s)T)rH�listr�rNr��tmp�last_updater��
ValueError�abortedr �critical�kill_workerr�SIGABRTr�)r-rFra�workerrrrr��s"���zArbiter.murder_workersc	
Csbz�	t�dtj�\}}|sWdS|j|krd|_n}|d?}|dkr)|j�d||�||jkr6d}t||j��||jkrCd}t||j��|dkrP|j�d||�n0|dkr�zt	�
|�j}Wntyjd	�
|�}Ynwd
�
||�}|t	jkrz|d7}|j�|�|j�|d�}|s�q|j��|j�||�qty�}z|jtjkr��WYd}~dSd}~ww)
z7        Reap workers to avoid zombie processes
        Tr�r�z#Worker (pid:%s) exited with code %szWorker failed to boot.zApp failed to load.z$Worker (pid:%s) exited with code %s.zcode {}zWorker (pid:{}) was sent {}!z Perhaps out of memory?N)r�waitpid�WNOHANGr$r r��WORKER_BOOT_ERRORr�APP_LOAD_ERRORr�Signalsrr�r:r�r�rir�rwr3�
child_exitr�r��ECHILD)	r-�wpid�status�exitcoder��sig_name�msgr�r�rrrr��sX


���

�.���zArbiter.reap_workerscCs�t|j�|jkr|��|j��}t|dd�d�}t|�|jkr5|�d�\}}|�|tj	�t|�|jks t|�}|j
|krR||_
|jjd�
|�d|dd�d	�d
Sd
S)z[        Maintain the number of workers by spawning or killing
        as required.
        cSs
|djSr<)�age)�wrrrr?>s
z(Arbiter.manage_workers.<locals>.<lambda>r@rz{0} workerszgunicorn.workers�gauge)�metricr5�mtype)�extraN)r�r�rG�
spawn_workersrNrLrir�rr�rr rJr:)r-rFrar�active_worker_countrrrr�5s$
�
�
��zArbiter.manage_workerscCs"|jd7_|�|j|j|j|j|jd|j|j�}|j�||�t	�
�}|dkr4||_||j|<|S|j��D]}|j
��q9t	��|_z�z"t�d|j�|j�d|j�|j�||�|��t�d�WnQtyq�ty�}z"|jjddd�td	|tjd
�tj��t�|j�WYd}~n!d}~wty�|j� d�|j!s�t�|j"�t�d�YnwW|j�d
|j�z|j
��|j�#||�WdSty�|j�$dt%�&��YdSw|j�d
|j�z|j
��|j�#||�Wwt�y|j�$dt%�&��Yww)Nr=g@rzworker [%s]zBooting worker with pid: %sz'Exception while loading the applicationTr�z%s)�filezException in worker processr�zWorker exiting (pid: %s)z Exception during worker exit:
%s)'r#rDrarer.rHr3r �pre_forkrr�r��valuesr�rwr`rr�rIr]�	post_fork�init_processr(r�r�rrJ�print�stderr�flushr�r��	exception�bootedr��worker_exitr��	traceback�
format_exc)r-r�ra�siblingr�rrrr�Ksn�

�
���

���
��zArbiter.spawn_workercCs8t|jt|j��D]}|��t�dt���q
dS)z�        Spawn new workers as needed.

        This is where a worker process leaves the main loop
        of the master process.
        r�N)rgrGr�r�r�r�r��random)r-rrrrr�ys�zArbiter.spawn_workerscCs(t|j���}|D]}|�||�q	dS)z^        Kill all workers with the signal `sig`
        :attr sig: `signal.SIG*` value
        N)r�r��keysr�)r-r��worker_pidsrarrrr��s�zArbiter.kill_workerscCs�z	t�||�WdStyH}z3|jtjkrCz|j�|�}|j��|j	�
||�WWYd}~dSttfyBYWYd}~dSw�d}~ww)zj        Kill a worker

        :attr pid: int, worker pid
        :attr sig: `signal.SIG*` value
         N)r�killr�r��ESRCHr�rir�rwr3rr�)r-rar�r�r�rrrr��s
���zArbiter.kill_worker)Nr)T)2�__name__�
__module__�__qualname__�__doc__r�r�r,rer�rvr�rjr{�dict�dirrr�r/r2r7�propertyrGr!rurdr�r}r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr
s`	��
 1,

		


"77.	r
)r�rr	r�rr(r�r�gunicorn.errorsrr�gunicorn.pidfiler�gunicornrrrrr	�objectr
rrrr�<module>s