§
    k•jî�  ã                   ó¨   — 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Zd dlZd dl	m
Z
mZ d dlmZ d dlmZmZmZ d dlmZmZ  G d„ d¦  «        ZdS )é    N)Ú
HaltServerÚAppImportError)ÚPidfile)ÚsockÚsystemdÚutil)Ú__version__ÚSERVER_SOFTWAREc                   óÊ  — e Zd ZdZdZdZi Zg Zi Ze	j
        Zd„ d                     ¦   «         D ¦   «         Z ed„  ee	¦  «        D ¦   «         ¦  «        Zd„ Zd„ Zd	„ Z eee¦  «        Zd
„ Zd„ Zd„ Zd„ Z	d„ Zd„ Zd„ ZeZd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd5d„Z(d6d „Z)d7d"„Z*d#„ Z+d$„ Z,d%„ Z-d&„ Z.d'„ Z/d(„ Z0d)„ Z1d*„ Z2d+„ Z3d,„ Z4d-„ Z5d.„ Z6d/„ Z7d0„ Z8d1„ Z9d2„ Z:d3„ Z;d4„ Z<dS )8ÚArbiterz›
    Arbiter maintain the workers processes alive. It launches or
    kills them if needed. It also manages application reloading
    via SIGHUP/USR2.
    é   é   c                 ó>   — g | ]}t          t          d |z  ¦  «        ‘ŒS )zSIG%s)ÚgetattrÚsignal)Ú.0Úxs     ú_/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/gunicorn/arbiter.pyú
<listcomp>zArbiter.<listcomp>.   s<   € ð Oð Oð OØõ •v˜w¨™{Ñ+Ô+ð Oð Oð Oó    z+HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCHc              #   ó¬   K  — | ]O}|d d…         dk    ¯|d         dk    ¯t          t          |¦  «        |dd …                              ¦   «         fV — ŒPd S )Nr   ÚSIGÚ_)r   r   Úlower)r   Únames     r   ú	<genexpr>zArbiter.<genexpr>0   sk   è è € ð ð Ø6:Ø���Œ8�uÒÐ  a¤¨C¢ õ 
•˜Ñ	Ô	  Q R R¤§¢Ñ 0Ô 0Ð1Ø!/   ðð r   c                 ó  — t           t          j        d<   d | _        d | _        d | _        t          j        ¦   «         | _        |  	                    |¦  «         d | _
        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d | _        d | _        d ddddœ| _        t+          j        ¦   «         }t.          j        d d …         }|                     dt.          j        ¦  «         ||t.          j        dœ| _        d S )Nr
   Fr   ÚMaster)Ú
start_timeÚworkers_spawnedÚworkers_killedÚreloads)ÚargsÚcwdr   )r
   ÚosÚenvironÚ_num_workersÚ _last_logged_active_worker_countÚlogÚqueueÚSimpleQueueÚ	SIG_QUEUEÚsetupÚpidfiler   Ú
worker_ageÚ
reexec_pidÚ
master_pidÚmaster_nameÚdirty_arbiter_pidÚdirty_arbiterÚdirty_pidfileÚ_control_serverÚ_statsr   ÚgetcwdÚsysÚargvÚinsertÚ
executableÚ	START_CTX)ÚselfÚappr$   r#   s       r   Ú__init__zArbiter.__init__5   s  € Ý(7�Œ
Ð$Ñ%à ˆÔØ04ˆÔ-ØˆŒõ Ô*Ñ,Ô,ˆŒà�
Š
�3‰ŒˆàˆŒØˆŒØˆŒØˆŒØˆŒØ#ˆÔð "#ˆÔØ!ˆÔØ!ˆÔð  $ˆÔð Ø ØØð	
ð 
ˆŒõ Œk‰mŒmˆåŒx˜˜˜Œ{ˆØ�Š�A•s”~Ñ&Ô&Ð&ð ØÝŒ~ð
ð 
ˆŒˆˆr   c                 ó   — | j         S ©N)r'   ©r>   s    r   Ú_get_num_workerszArbiter._get_num_workersd   s   € ØÔ Ð r   c                 óZ   — | j         }|| _         | j                             | ||¦  «         d S rB   )r'   ÚcfgÚnworkers_changed)r>   ÚvalueÚ	old_values      r   Ú_set_num_workerszArbiter._set_num_workersg   s2   € ØÔ%ˆ	Ø!ˆÔØŒ×!Ò! $¨¨yÑ9Ô9Ð9Ð9Ð9r   c                 ó2  — || _         |j        | _        | j        €$| j                             |j        ¦  «        | _        dt          j        v r| j                             ¦   «          | j        j        | _        | j        j        | _        | j        j	        | _
        | j        j        | _        | j        j        | _        | j                             d                     d                     d„ t!          | j        j                             ¦   «         d„ ¬¦  «        D ¦   «         ¦  «        ¦  «        ¦  «         | j        j        r3| j        j                             ¦   «         D ]\  }}|t          j        |<   Œ| j        j        r| j                              ¦   «          d S d S )NÚGUNICORN_PIDzCurrent configuration:
{0}ú
c              3   óR   K  — | ]"\  }}d                       ||j        ¦  «        V — Œ#dS )z
  {0}: {1}N)ÚformatrH   )r   ÚconfigrH   s      r   r   z Arbiter.setup.<locals>.<genexpr>   sL   è è € ð ;ð ;á!�F˜Eð ×#Ò# F¨E¬KÑ8Ô8ð;ð ;ð ;ð ;ð ;ð ;r   c                 ó   — | d         S ©Né   © )Úsettings    r   ú<lambda>zArbiter.setup.<locals>.<lambda>ƒ   s
   € ¨g°a¬j€ r   ©Úkey)r?   rF   r)   Úlogger_classr%   r&   Úreopen_filesÚworker_classÚaddressÚworkersÚnum_workersÚtimeoutÚ	proc_nameÚdebugrO   ÚjoinÚsortedÚsettingsÚitemsÚenvÚpreload_appÚwsgi)r>   r?   ÚkÚvs       r   r-   zArbiter.setupm   s~  € ØˆŒØ”7ˆŒàŒ8ÐØ”x×,Ò,¨S¬WÑ5Ô5ˆDŒHð �RœZÐ'Ð'ØŒH×!Ò!Ñ#Ô#Ð#à œHÔ1ˆÔØ”xÔ'ˆŒØœ8Ô+ˆÔØ”xÔ'ˆŒØœÔ+ˆŒàŒ�ŠÐ4×;Ò;Ø�IŠIð ;ð ;õ ˜$œ(Ô+×1Ò1Ñ3Ô3Ø8Ð8ð:ñ :ô :ð;ñ ;ô ;ñ ;ô ;ñ<ô <ñ 	=ô 	=ð 	=ð Œ8Œ<ð 	"Øœœ×*Ò*Ñ,Ô,ð "ð "‘��1Ø !•”
˜1‘�àŒ8Ôð 	ØŒH�MŠM‰OŒOˆOˆOˆOð	ð 	r   c                 ó’  — | j                              dt          ¦  «         t          j        ¦   «         | j        d<   dt
          j        v rGt          t
          j                             d¦  «        ¦  «        | _	        | j
        dz   | _
        d| _        t          j        ¦   «         | _        | j        j        �O| j        j        }| j	        dk    r|dz  }t!          |¦  «        | _        | j                             | j        ¦  «         | j                             | ¦  «         |                      ¦   «          | j        sìd}t+          j        ¦   «         }|r/d| _        t/          t*          j        t*          j        |z   ¦  «        }n`| j	        rYg }t
          j                             d	¦  «                             d
¦  «        D ]$}|                     t          |¦  «        ¦  «         Œ%| j        j        rt;          t<          d¦  «        s%t?          j         | j        | j         |¦  «        | _        d
 !                    d„ | j        D ¦   «         ¦  «        }| j          "                    d¦  «         | j                              d|| j        ¦  «         | j                              d| j        j#        ¦  «         t+          j$        d| j         ¦  «         t;          | j%        d¦  «        r%| j%         &                    | j        | j         ¦  «         | j        j'        dk    r | j        j(        r|  )                    ¦   «          | j         *                    | ¦  «         dS )zS        Initialize the arbiter. Start listening and set pidfile if needed.
        zStarting gunicorn %sr   rL   z.2zMaster.2Nr   TÚGUNICORN_FDú,ÚSO_REUSEPORTc                 ó,   — g | ]}t          |¦  «        ‘ŒS rT   ©Ústr©r   Úlnrs     r   r   z!Arbiter.start.<locals>.<listcomp>¶   s   € Ð!EÐ!EÐ!E¨s¥# c¡(¤(Ð!EÐ!EÐ!Er   zArbiter bootedzListening at: %s (%s)zUsing worker: %sz&READY=1
STATUS=Gunicorn arbiter bootedÚcheck_config)+r)   Úinfor	   Útimer7   r%   r&   ÚintÚgetr1   r`   r2   ÚgetpidÚpidrF   r.   r   ÚcreateÚon_startingÚinit_signalsÚ	LISTENERSr   Ú
listen_fdsÚrangeÚSD_LISTEN_FDS_STARTÚpopÚsplitÚappendÚ
reuse_portÚhasattrÚsocketr   Úcreate_socketsrb   ra   Úworker_class_strÚ	sd_notifyr[   rt   Údirty_workersÚ
dirty_appsÚspawn_dirty_arbiterÚ
when_ready)r>   ÚpidnameÚfdsr   ÚfdÚlisteners_strs         r   ÚstartzArbiter.start�   sÛ  € ð 	Œ�ŠÐ,­kÑ:Ô:Ð:õ %)¤I¡K¤KˆŒ�LÑ!à�RœZÐ'Ð'Ý!¥"¤*§.¢.°Ñ"@Ô"@ÑAÔAˆDŒOØ!œ^¨dÑ2ˆDŒNØ)ˆDÔå”9‘;”;ˆŒØŒ8ÔÐ'Ø”hÔ&ˆGØŒ !Ò#Ð#Ø˜4‘�Ý" 7Ñ+Ô+ˆDŒLØŒL×Ò ¤Ñ)Ô)Ð)ØŒ×Ò˜TÑ"Ô"Ð"à×ÒÑÔÐàŒ~ð 	NØˆCÝ Ô+Ñ-Ô-ˆJØð (Ø#�”Ý�GÔ7Ý#Ô7¸*ÑDñFô F��ð ”ð (Ø�Ýœ*Ÿ.š.¨Ñ7Ô7×=Ò=¸cÑBÔBð (ð (�BØ—J’J�s 2™wœwÑ'Ô'Ð'Ð'à”HÔ'ð N­GµF¸NÑ,KÔ,Kð NÝ!%Ô!4°T´X¸t¼xÈÑ!MÔ!M�”àŸšÐ!EÐ!E°d´nÐ!EÑ!EÔ!EÑFÔFˆØŒ�ŠÐ'Ñ(Ô(Ð(ØŒ�ŠÐ-¨}¸d¼hÑGÔGÐGØŒ�ŠÐ(¨$¬(Ô*CÑDÔDÐDÝÔÐCÀTÄXÑNÔNÐNõ �4Ô$ nÑ5Ô5ð 	?ØÔ×*Ò*¨4¬8°T´XÑ>Ô>Ð>ð Œ8Ô! AÒ%Ð%¨$¬(Ô*=Ð%Ø×$Ò$Ñ&Ô&Ð&ð
 	Œ×Ò˜DÑ!Ô!Ð!Ð!Ð!r   c                 óÈ   — | j                              ¦   «          | j        D ]}t          j        || j        ¦  «         Œt          j        t          j        | j        ¦  «         dS )z‚        Initialize master signal handling. Most of the signals
        are queued. Child signals only wake up the master.
        N)r)   Úclose_on_execÚSIGNALSr   ÚSIGCHLDÚsignal_chld)r>   Úss     r   r}   zArbiter.init_signalsÉ   s_   € ð
 	Œ×ÒÑ Ô Ð ð ”ð 	*ð 	*ˆAÝŒM˜!˜Tœ[Ñ)Ô)Ð)Ð)ÝŒ•f”n dÔ&6Ñ7Ô7Ð7Ð7Ð7r   c                 ó:   — | j                              |¦  «         dS )z3Signal handler - NO LOGGING, just queue the signal.N©r,   Ú
put_nowait©r>   ÚsigÚframes      r   r   zArbiter.signalÕ   ó   € àŒ×!Ò! #Ñ&Ô&Ð&Ð&Ð&r   c                 ó   — |                       ¦   «          t          j        d| j        z  ¦  «         	 |                      ¦   «          |                      ¦   «          	 |                      ¦   «          |                      d¬¦  «        D ]±}|| j        vr| j	         
                    d|¦  «         Œ'| j                             |¦  «        }t          | d|z  d¦  «        }|s| j	                             d|¦  «         Œs|t          j        k    r| j	        j        n| j	        j
        } |d	|¦  «          |¦   «          Œ²|                      ¦   «          |                      ¦   «          |                      ¦   «          �Œ# t&          t(          f$ r |                      ¦   «          Y dS t,          $ r,}|                      |j        |j        ¬
¦  «         Y d}~dS d}~wt2          $ r ‚ t4          $ ri | j	                             dd¬¦  «         |                      d¦  «         | j        �| j                             ¦   «          t=          j        d¦  «         Y dS w xY w)zMain master loop.úmaster [%s]Tç      ð?)r_   zIgnoring unknown signal: %sz	handle_%sNzUnhandled signal: %szHandling signal: %s)ÚreasonÚexit_statusz Unhandled exception in main loop©Úexc_infoFéÿÿÿÿ) r“   r   Ú_setproctitler`   Úmanage_workersÚ_start_control_serverÚmaybe_promote_masterÚwait_for_signalsÚ	SIG_NAMESr)   ru   rx   r   Úerrorr   r—   ra   Úmurder_workersÚmanage_dirty_arbiterÚStopIterationÚKeyboardInterruptÚhaltr   r¤   r¥   Ú
SystemExitÚ	ExceptionÚstopr.   Úunlinkr9   Úexit)r>   rž   ÚsignameÚhandlerÚ	log_levelÚinsts         r   ÚrunzArbiter.runÙ   s~  € à�
Š
‰ŒˆÝÔ˜=¨4¬>Ñ9Ñ:Ô:Ð:ð)	Ø×ÒÑ!Ô!Ð!ð ×&Ò&Ñ(Ô(Ð(ð,Ø×)Ò)Ñ+Ô+Ð+ð  ×0Ò0¸Ð0Ñ=Ô=ð ð �CØ $¤.Ð0Ð0ØœŸšÐ&CÀSÑIÔIÐIØ à"œn×0Ò0°Ñ5Ô5�GÝ% d¨K¸'Ñ,AÀ4ÑHÔH�GØ"ð !ØœŸšÐ'=¸wÑGÔGÐGØ à25½¼Ò2GÐ2G ¤¤ ÈTÌXÌ]�IØ�IÐ3°WÑ=Ô=Ð=Ø�G‘I”I�I�Ià×#Ò#Ñ%Ô%Ð%Ø×#Ò#Ñ%Ô%Ð%Ø×)Ò)Ñ+Ô+Ð+ñ+,øõ, Õ0Ð1ð 	ð 	ð 	Ø�IŠI‰KŒKˆKˆKˆKˆKÝð 	Hð 	Hð 	HØ�IŠI˜Tœ[°dÔ6FˆIÑGÔGÐGÐGÐGÐGÐGÐGÐGøøøøÝð 	ð 	ð 	ØÝð 	ð 	ð 	ØŒH�NŠNÐ=Ø$(ð ñ *ô *ð *à�IŠI�eÑÔÐØŒ|Ð'Ø”×#Ò#Ñ%Ô%Ð%ÝŒH�R‰LŒLˆLˆLˆLˆLð	øøøs%   ²EE5 Å5%IÆ	IÆ&!GÇA<IÉIc                 ó:   — | j                              |¦  «         dS )z;SIGCHLD signal handler - NO LOGGING, just queue the signal.Nr›   r�   s      r   r˜   zArbiter.signal_chld	  r    r   c                 óV   — |                       ¦   «          |                      ¦   «          dS )z6SIGCHLD handling - called from main loop, safe to log.N)Úreap_workersÚreap_dirty_arbiterrC   s    r   Úhandle_chldzArbiter.handle_chld  s,   € à×ÒÑÔÐØ×ÒÑ!Ô!Ð!Ð!Ð!r   c                 ó¾   — | j                              d| j        ¦  «         |                      ¦   «          | j        r!|                      t          j        ¦  «         dS dS )z¶        HUP handling.
        - Reload configuration
        - Start the new worker processes with a new configuration
        - Gracefully shutdown the old worker processes
        zHang up: %sN)r)   ru   r2   Úreloadr3   Úkill_dirty_arbiterr   ÚSIGHUPrC   s    r   Ú
handle_hupzArbiter.handle_hup  s[   € ð 	Œ�Š�m TÔ%5Ñ6Ô6Ð6Ø�Š‰ŒˆàÔ!ð 	3Ø×#Ò#¥F¤MÑ2Ô2Ð2Ð2Ð2ð	3ð 	3r   c                 ó   — t           ‚)zSIGTERM handling)r²   rC   s    r   Úhandle_termzArbiter.handle_term#  s   € åÐr   c                 ó:   — |                       d¦  «         t          ‚)zSIGINT handlingF©r·   r²   rC   s    r   Ú
handle_intzArbiter.handle_int'  ó   € à�	Š	�%ÑÔÐÝÐr   c                 ó:   — |                       d¦  «         t          ‚)zSIGQUIT handlingFrÌ   rC   s    r   Úhandle_quitzArbiter.handle_quit,  rÎ   r   c                 óN   — | xj         dz  c_         |                      ¦   «          dS )zR        SIGTTIN handling.
        Increases the number of workers by one.
        rS   N©r^   rª   rC   s    r   Úhandle_ttinzArbiter.handle_ttin1  s0   € ð
 	ÐÔ˜AÑÐÔØ×ÒÑÔÐÐÐr   c                 óh   — | j         dk    rdS | xj         dz  c_         |                      ¦   «          dS )zR        SIGTTOU handling.
        Decreases the number of workers by one.
        rS   NrÒ   rC   s    r   Úhandle_ttouzArbiter.handle_ttou9  sC   € ð
 Ô˜qÒ Ð ØˆFØÐÔ˜AÑÐÔØ×ÒÑÔÐÐÐr   c                 óÆ   — | j                              ¦   «          |                      t          j        ¦  «         | j        r!|                      t          j        ¦  «         dS dS )zU        SIGUSR1 handling.
        Kill all workers by sending them a SIGUSR1
        N)r)   rZ   Úkill_workersr   ÚSIGUSR1r3   rÆ   rC   s    r   Úhandle_usr1zArbiter.handle_usr1C  s_   € ð
 	Œ×ÒÑÔÐØ×Ò�&œ.Ñ)Ô)Ð)àÔ!ð 	4Ø×#Ò#¥F¤NÑ3Ô3Ð3Ð3Ð3ð	4ð 	4r   c                 ó.   — |                       ¦   «          dS )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)ÚreexecrC   s    r   Úhandle_usr2zArbiter.handle_usr2N  s   € ð 	�Š‰Œˆˆˆr   c                 óÖ   — | j         j        rB| j                             d¦  «         d| _        |                      t          j        ¦  «         dS | j                             d¦  «         dS )zSIGWINCH handlingzgraceful stop of workersr   z SIGWINCH ignored. Not daemonizedN)	rF   Údaemonr)   ru   r^   r×   r   ÚSIGTERMra   rC   s    r   Úhandle_winchzArbiter.handle_winchW  sb   € àŒ8Œ?ð 	?ØŒH�MŠMÐ4Ñ5Ô5Ð5Ø ˆDÔØ×Ò�fœnÑ-Ô-Ð-Ð-Ð-àŒH�NŠNÐ=Ñ>Ô>Ð>Ð>Ð>r   c                 óv  — | j         dk    rd S | j         t          j        ¦   «         k    r�| j                             d¦  «         d| _        d| _         | j        j        | _        t          j        d= | j	        �$| j	         
                    | j        j	        ¦  «         t          j        d| j        z  ¦  «         d S d S )Nr   zMaster has been promoted.r   rL   r¢   )r1   r%   Úgetppidr)   ru   r2   rF   r`   r&   r.   Úrenamer   r©   rC   s    r   r¬   zArbiter.maybe_promote_master`  sª   € ØŒ?˜aÒÐØˆFàŒ?�bœj™lœlÒ*Ð*ØŒH�MŠMÐ5Ñ6Ô6Ð6à'ˆDÔØˆDŒOØ!œXÔ/ˆDŒNÝ”
˜>Ð*àŒ|Ð'Ø”×#Ò# D¤HÔ$4Ñ5Ô5Ð5åÔ˜}¨t¬~Ñ=Ñ>Ô>Ð>Ð>Ð>ð +Ð*r   c                 óD   — | j                              | j        ¦  «         dS )z Wake up the arbiter's main loop.N)r,   rœ   ÚWAKEUP_REQUESTrC   s    r   ÚwakeupzArbiter.wakeupq  s!   € àŒ×!Ò! $Ô"5Ñ6Ô6Ð6Ð6Ð6r   Nr   c                 ól  — |                       ¦   «          |                      ¦   «          |dk    r| j        j        n| j        j        } |d| j        ¦  «         |� |d|¦  «         | j        �| j                             ¦   «          | j         	                    | ¦  «         t          j        |¦  «         dS )z halt arbiter r   zShutting down: %sNz
Reason: %s)Ú_stop_control_serverr·   r)   ru   r¯   r2   r.   r¸   rF   Úon_exitr9   r¹   )r>   r¤   r¥   Úlog_funcs       r   r´   zArbiter.haltu  s´   € ð 	×!Ò!Ñ#Ô#Ð#à�	Š	‰Œˆà$/°1Ò$4Ð$4�4”8”=�=¸$¼(¼.ˆØˆÐ$ dÔ&6Ñ7Ô7Ð7ØÐØˆH�\ 6Ñ*Ô*Ð*àŒ<Ð#ØŒL×ÒÑ!Ô!Ð!ØŒ×Ò˜ÑÔÐÝŒ�ÑÔÐÐÐr   r£   c                 ó�  — g }	 | j                              d|¬¦  «        }|| j        k    r|                     |¦  «         	 	 | j                              ¦   «         }|| j        k    r|                     |¦  «         n# t
          j        $ r Y nw xY wŒQn3# t
          j        $ r Y n"t          $ r t          j	        ¦   «          Y nw xY w|S )ze        Wait for signals with timeout.
        Returns a list of signals that were received.
        T)Úblockr_   )
r,   rx   rå   r„   Ú
get_nowaitr*   ÚEmptyr³   r9   r¹   )r>   r_   Úsignalsrž   s       r   r­   zArbiter.wait_for_signals†  sú   € ð
 ˆð	à”.×$Ò$¨4¸Ð$ÑAÔAˆCØ�dÔ)Ò)Ð)Ø—’˜sÑ#Ô#Ð#ððØœ.×3Ò3Ñ5Ô5�CØ˜dÔ1Ò1Ð1ØŸš sÑ+Ô+Ð+øøÝ”{ð ð ð Ø�Eðøøøðð øÝŒ{ð 	ð 	ð 	ØˆDÝ ð 	ð 	ð 	ÝŒH‰JŒJˆJˆJˆJð	øøøàˆs;   „=B Á9A< Á;B Á<BÂB ÂBÂB ÂCÂ$CÃCTc                 óê  — | j         | j        cxk    odk    nc o| j         o| j        j         }t          j        | j        |¦  «         g | _        t          j	        }|st          j
        }t          j        ¦   «         | j        j        z   }| j        r|                      |¦  «         |                      |¦  «         | }| j        s| j        �r8t          j        ¦   «         |k     �r |s¼	 | j                             ¦   «         }|t          j        t          j
        fv rw| j                             d¦  «         d}|                      t          j
        ¦  «         | j        r|                      t          j
        ¦  «         t          j        ¦   «         dz   }n# t,          $ r Y nw xY w|                      ¦   «          |                      ¦   «          t          j        d¦  «         | j        s| j        rt          j        ¦   «         |k     �° |                      t          j        ¦  «         | j        r|                      t          j        ¦  «         |                      ¦   «          |                      ¦   «          dS )z°        Stop workers

        :attr graceful: boolean, If True (the default) workers will be
        killed gracefully  (ie. trying to wait for the current connection)
        r   zQuick shutdown requestedTç       @çš™™™™™¹?N)r0   r1   r   rF   r…   r   Úclose_socketsr~   r   rß   ÚSIGQUITrv   Úgraceful_timeoutr3   rÆ   r×   ÚWORKERSr,   rí   ÚSIGINTr)   ru   r¶   rÁ   rÂ   ÚsleepÚSIGKILL)r>   Úgracefulr¸   rž   ÚlimitÚquick_shutdownÚpending_sigs          r   r·   zArbiter.stopŸ  se  € ð ŒO˜tœÐ3Ð3Ò3Ð3°!Ò3Ð3Ð3Ð3ð (Ø”LÐ ð(à”HÔ'Ð'ð 	õ
 	Ô˜4œ>¨6Ñ2Ô2Ð2àˆŒÝŒnˆØð 	!Ý”.ˆCÝ”	‘”˜dœhÔ7Ñ7ˆð Ô!ð 	)Ø×#Ò# CÑ(Ô(Ð(ð 	×Ò˜#ÑÔÐà%˜ˆØŒ|ð 	˜tÔ5ñ 	½4¼9¹;¼;ÈÒ;NÑ;Nà!ð ðØ"&¤.×";Ò";Ñ"=Ô"=�KØ"¥v¤}µf´nÐ&EÐEÐEØœŸšÐ&@ÑAÔAÐAØ)-˜Ø×)Ò)­&¬.Ñ9Ô9Ð9ØÔ1ð DØ ×3Ò3µF´NÑCÔCÐCå $¤	¡¤¨cÑ 1˜øøÝ ð ð ð Ø�Dðøøøà×ÒÑÔÐØ×#Ò#Ñ%Ô%Ð%ÝŒJ�s‰OŒOˆOð# Œ|ð 	˜tÔ5ð 	½4¼9¹;¼;ÈÒ;NÑ;Nð& 	×Ò�&œ.Ñ)Ô)Ð)ØÔ!ð 	4Ø×#Ò#¥F¤NÑ3Ô3Ð3à×ÒÑÔÐØ×ÒÑ!Ô!Ð!Ð!Ð!s   Ã)B*F Æ
F!Æ F!c                 ó(  — | j         dk    r| j                             d¦  «         dS | j        dk    r| j                             d¦  «         dS t	          j        ¦   «         }t	          j        ¦   «         | _         | j         dk    rdS | j                             | ¦  «         | j        j	         
                    ¦   «         }t          |¦  «        |d<   | j        rHt          t	          j        ¦   «         ¦  «        |d<   t          t          | j        ¦  «        ¦  «        |d<   n'd                     d	„ | j        D ¦   «         ¦  «        |d
<   t	          j        | j        d         ¦  «         t	          j        | j        d         | j        d         |¦  «         dS )z1        Relaunch the master and workers.
        r   z"USR2 signal ignored. Child exists.Nz#USR2 signal ignored. Parent exists.rL   Ú
LISTEN_PIDÚ
LISTEN_FDSrm   c              3   óX   K  — | ]%}t          |                     ¦   «         ¦  «        V — Œ&d S rB   )rq   Úfilenorr   s     r   r   z!Arbiter.reexec.<locals>.<genexpr>ï  sC   è è € ð .=ð .=Ø&)•�C—J’J‘L”LÑ!Ô!ð.=ð .=ð .=ð .=ð .=ð .=r   rl   r$   r#   )r0   r)   Úwarningr1   r%   ry   ÚforkrF   Úpre_execÚenv_origÚcopyrq   r   Úlenr~   rb   Úchdirr=   Úexecvpe)r>   r1   r&   s      r   rÛ   zArbiter.reexecÕ  sv  € ð Œ?˜aÒÐØŒH×ÒÐAÑBÔBÐBØˆFàŒ?˜aÒÐØŒH×ÒÐBÑCÔCÐCØˆFå”Y‘[”[ˆ
Ýœ'™)œ)ˆŒØŒ?˜aÒÐØˆFàŒ×Ò˜$ÑÔÐà”(Ô#×(Ò(Ñ*Ô*ˆÝ"% j¡/¤/ˆ�ÑàŒ<ð 	=Ý$'­¬	©¬Ñ$4Ô$4ˆG�LÑ!Ý$'­¨D¬NÑ(;Ô(;Ñ$<Ô$<ˆG�LÑ!Ð!à%(§X¢Xð .=ð .=Ø-1¬^ð.=ñ .=ô .=ñ &=ô &=ˆG�MÑ"õ 	Œ�” Ô&Ñ'Ô'Ð'õ 	Œ
�4”> !Ô$ d¤n°VÔ&<¸gÑFÔFÐFÐFÐFr   c                 óþ  — | j         dxx         dz  cc<   | j        j        }| j        j        D ]N}|| j        j        v r | j        j        |         t
          j        |<   Œ0	 t
          j        |= Œ?# t          $ r Y ŒKw xY w| j         	                    ¦   «          |  
                    | j        ¦  «         | j                             ¦   «          || j        j        k    r�| j        D ]}|                     ¦   «          Œt          j        | j        | j        ¦  «        | _        d                     d„ | j        D ¦   «         ¦  «        }| j                             d|¦  «         | j                             | ¦  «         | j        �| j                             ¦   «          | j        j        �=t-          | j        j        ¦  «        | _        | j                             | j        ¦  «         t3          j        d| j        z  ¦  «         | j        }t;          | j        j        ¦  «        D ]}|                      ¦   «          Œ|                       ¦   «          tC          j"        ¦   «         | j        j#        z   }tC          j"        ¦   «         |k     r‚| j$        sd S tK          d„ | j$         &                    ¦   «         D ¦   «         ¦  «        }||k    rd S |  '                    ¦   «          tC          j(        d¦  «         tC          j"        ¦   «         |k     °€d S d S )	Nr"   rS   rm   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rT   rp   rr   s     r   r   z"Arbiter.reload.<locals>.<listcomp>  s   € Ð%IÐ%IÐ%I°3¥c¨#¡h¤hÐ%IÐ%IÐ%Ir   zListening at: %sr¢   c              3   ó$   K  — | ]}|j         V — Œd S rB   ©Úage)r   Úws     r   r   z!Arbiter.reload.<locals>.<genexpr>:  s$   è è € Ð>Ð> 1˜œÐ>Ð>Ð>Ð>Ð>Ð>r   rò   ))r7   rF   r\   rf   r  r%   r&   ÚKeyErrorr?   rÅ   r-   r)   rZ   r~   Úcloser   rˆ   rb   ru   Ú	on_reloadr.   r¸   r   r{   rz   r   r©   r`   r/   r€   r]   Úspawn_workerrª   rv   Ú	monotonicrõ   rö   ÚminÚvaluesrÁ   rø   )	r>   Úold_addressri   rs   r’   Úlast_worker_ager   ÚdeadlineÚoldests	            r   rÅ   zArbiter.reload÷  sç  € àŒ�IÐÐÔ !Ñ#ÐÐÑà”hÔ&ˆð ””ð 
	ð 
	ˆAØ�D”HÔ%Ð%Ð%ð !%¤Ô 1°!Ô 4•”
˜1‘�ðÝœ
 1˜˜øÝð ð ð Ø�Dðøøøð 	Œ�ŠÑÔÐØ�
Š
�4”8ÑÔÐð 	Œ×ÒÑÔÐð ˜$œ(Ô*Ò*Ð*à”~ð ð �Ø—	’	‘”��å!Ô0°´¸4¼8ÑDÔDˆDŒNØŸHšHÐ%IÐ%I¸$¼.Ð%IÑ%IÔ%IÑJÔJˆMØŒH�MŠMÐ,¨mÑ<Ô<Ð<ð 	Œ×Ò˜4Ñ Ô Ð ð Œ<Ð#ØŒL×ÒÑ!Ô!Ð!ð Œ8ÔÐ'Ý" 4¤8Ô#3Ñ4Ô4ˆDŒLØŒL×Ò ¤Ñ)Ô)Ð)õ 	Ô˜=¨4¬>Ñ9Ñ:Ô:Ð:ð œ/ˆõ �t”xÔ'Ñ(Ô(ð 	 ð 	 ˆAØ×ÒÑÔÐÐð 	×ÒÑÔÐõ ”>Ñ#Ô# d¤hÔ&?Ñ?ˆÝŒnÑÔ Ò)Ð)Ø”<ð Ø�åÐ>Ð>¨¬×(;Ò(;Ñ(=Ô(=Ð>Ñ>Ô>Ñ>Ô>ˆFØ˜Ò'Ð'Ø�Ø×ÒÑÔÐÝŒJ�s‰OŒOˆOõ ŒnÑÔ Ò)Ð)Ð)Ð)Ð)Ð)s   ÁA-Á-
A:Á9A:c                 óè  — | j         sdS t          | j                             ¦   «         ¦  «        }|D ]¿\  }}	 t	          j        ¦   «         |j                             ¦   «         z
  | j         k    rŒ=n# t          t          f$ r Y ŒQw xY w|j
        sC| j                             d|¦  «         d|_
        |                      |t          j        ¦  «         ŒŸ|                      |t          j        ¦  «         ŒÀdS )z)        Kill unused/idle workers
        NzWORKER TIMEOUT (pid:%s)T)r_   Úliströ   re   rv   r  ÚtmpÚlast_updateÚOSErrorÚ
ValueErrorÚabortedr)   ÚcriticalÚkill_workerr   ÚSIGABRTrù   )r>   r]   rz   Úworkers       r   r°   zArbiter.murder_workers@  s  € ð Œ|ð 	ØˆFÝ�t”|×)Ò)Ñ+Ô+Ñ,Ô,ˆØ$ð 	6ð 	6‰MˆS�&ðÝ”>Ñ#Ô# f¤j×&<Ò&<Ñ&>Ô&>Ñ>À$Ä,ÒNÐNØð Oøå�ZÐ(ð ð ð Ø�ðøøøð ”>ð 6Ø”×!Ò!Ð";¸SÑAÔAÐAØ!%�”Ø× Ò  ¥f¤nÑ5Ô5Ð5Ð5à× Ò  ¥f¤nÑ5Ô5Ð5Ð5ð	6ð 	6s   ¸6A0Á0BÂBc                 óŒ  — 	 	 t          j        dt           j        ¦  «        \  }}|sdS | j        |k    r	d| _        �nÙd}t          j        |¦  «        rt          j        |¦  «        }nót          j        |¦  «        rßt          j        |¦  «        }	 t          j	        |¦  «        j
        }n%# t          $ r d                     |¦  «        }Y nw xY wd                     ||¦  «        }|t          j        k    r |dz  }| j                             |¦  «         nE|t          j        k    r| j                             |¦  «         n| j                             |¦  «         |�"|dk    r| j                             d||¦  «         || j        k    rd	}t)          || j        ¦  «        ‚|| j        k    rd
}t)          || j        ¦  «        ‚| j                             |d¦  «        }|s�Œà|j                             ¦   «          | j                             | |¦  «         �Œ# t8          $ r!}	|	j        t:          j        k    r‚ Y d}	~	dS d}	~	ww xY w)z7        Reap workers to avoid zombie processes
        Tr¨   r   Nz	signal {}zWorker (pid:{}) was sent {}!z Perhaps out of memory?z$Worker (pid:%s) exited with code %s.zWorker failed to boot.zApp failed to load.)r%   ÚwaitpidÚWNOHANGr0   Ú	WIFEXITEDÚWEXITSTATUSÚWIFSIGNALEDÚWTERMSIGr   ÚSignalsr   r!  rO   rù   r)   r¯   rß   ru   r  ÚWORKER_BOOT_ERRORr   ÚAPP_LOAD_ERRORrö   r‚   r  r  rF   Ú
child_exitr   ÚerrnoÚECHILD)
r>   ÚwpidÚstatusÚexitcoderž   Úsig_nameÚmsgr¤   r&  Úes
             r   rÁ   zArbiter.reap_workersU  s{  € ð4	ð06Ý!œz¨"­b¬jÑ9Ô9‘��fØð Ø�EØ”? dÒ*Ð*Ø&'�D”O‘Oð
  $�HÝ”| FÑ+Ô+ð 2Ý#%¤>°&Ñ#9Ô#9˜˜Ýœ¨Ñ/Ô/ð 2Ý œk¨&Ñ1Ô1˜ð?Ý'-¤~°cÑ':Ô':Ô'?˜H˜HøÝ)ð ?ð ?ð ?Ø'2×'9Ò'9¸#Ñ'>Ô'>˜H˜H˜Hð?øøøà<×CÒCØ  (ñ,ô ,˜ð ¥&¤.Ò0Ð0ØÐ#<Ñ<˜CØ œHŸNšN¨3Ñ/Ô/Ð/Ð/Ø ¥F¤NÒ2Ð2à œHŸMšM¨#Ñ.Ô.Ð.Ð.ð !œH×,Ò,¨SÑ1Ô1Ð1àÐ+°¸A²°ØœŸšÐ'MØ'+¨Xñ7ô 7ð 7ð   4Ô#9Ò9Ð9Ø!9˜Ý(¨°Ô1GÑHÔHÐHØ 4Ô#6Ò6Ð6Ø!6˜Ý(¨°Ô1DÑEÔEÐEà!œ\×-Ò-¨d°DÑ9Ô9�FØ!ð !Ù Ø”J×$Ò$Ñ&Ô&Ð&Ø”H×'Ò'¨¨fÑ5Ô5Ð5ña06øõb ð 	ð 	ð 	ØŒw�%œ,Ò&Ð&Øð 'Ð&Ð&Ð&Ð&Ð&øøøøð	øøøsB   ‚%H ©A'H ÂB+ Â*H Â+CÃ
H ÃCÃEH È
IÈ"H>È>Ic                 ó  — t          | j        ¦  «        | j        k     r|                      ¦   «          | j                             ¦   «         }t          |d„ ¬¦  «        }t          |¦  «        | j        k    rP|                     d¦  «        \  }}|                      |t          j	        ¦  «         t          |¦  «        | j        k    °Pt          |¦  «        }| j
        |k    r:|| _
        | j                             d                     |¦  «        d|ddœ¬¦  «         | j        j        rYt!          d	„ | j        D ¦   «         ¦  «        }|dk    r7| j                             d
                     |¦  «        d|ddœ¬¦  «         dS dS dS )z[        Maintain the number of workers by spawning or killing
        as required.
        c                 ó   — | d         j         S rR   r  )r  s    r   rV   z(Arbiter.manage_workers.<locals>.<lambda>˜  s   € °°!´´€ r   rW   r   z{0} workerszgunicorn.workersÚgauge)ÚmetricrH   Úmtype)Úextrac              3   ó8   K  — | ]} |j         ¦   «         pd V — ŒdS )r   N)Úget_backlog)r   r   s     r   r   z)Arbiter.manage_workers.<locals>.<genexpr>¦  sF   è è € ð 6ð 6Ø"ð +˜$Ô*Ñ,Ô,Ð1°ð 6ð 6ð 6ð 6ð 6ð 6r   zsocket backlog: {0}zgunicorn.backlogÚ	histogramN)r  rö   r^   Úspawn_workersre   rc   r‚   r$  r   rß   r(   r)   ra   rO   rF   Úenable_backlog_metricÚsumr~   )r>   r]   rz   r   Úactive_worker_countÚbacklogs         r   rª   zArbiter.manage_workers�  sµ  € õ
 ˆtŒ|ÑÔ˜tÔ/Ò/Ð/Ø×ÒÑ Ô Ð à”,×$Ò$Ñ&Ô&ˆÝ˜Ð&8Ð&8Ð9Ñ9Ô9ˆÝ�'‰lŒl˜TÔ-Ò-Ð-Ø—{’{ 1‘~”~‰HˆS�!Ø×Ò˜S¥&¤.Ñ1Ô1Ð1õ �'‰lŒl˜TÔ-Ò-Ð-õ " '™lœlÐØÔ0Ð4GÒGÐGØ4GˆDÔ1ØŒH�NŠN˜=×/Ò/Ð0CÑDÔDØ,>Ø+>Ø+2ð"4ð "4ð ñ 5ô 5ð 5ð
 Œ8Ô)ð 	=Ýð 6ð 6Ø&*¤nð6ñ 6ô 6ñ 6ô 6ˆGð ˜!Š|ˆ|Ø”—’Ð4×;Ò;¸GÑDÔDØ0BØ/6Ø/:ð&<ð &<ð ñ =ô =ð =ð =ð =ð	=ð 	=ð ˆ|r   c           	      ó
  — | xj         dz  c_         |                      | j         | j        | j        | j        | j        dz  | j        | j        ¦  «        }| j                             | |¦  «         t          j
        ¦   «         }|dk    r(||_        || j        |<   | j        dxx         dz  cc<   |S | j                             ¦   «         D ]}|j                             ¦   «          Œt          j        ¦   «         |_        	 t#          j        d| j        z  ¦  «         | j                             d|j        ¦  «         | j        j        r$t-          j        | j        | j        ¦  «        |_        | j                             | |¦  «         |                     ¦   «          t7          j        d¦  «         �n.# t:          $ r ‚ t<          $ r{}| j                             dd¬	¦  «         tA          d
|z  t6          j!        ¬¦  «         t6          j!         "                    ¦   «          t7          j        | j#        ¦  «         Y d }~n¤d }~wtH          $ r”}| j         %                    d¦  «         tA          d
|z  t6          j!        ¬¦  «         t6          j!         "                    ¦   «          |j&        st7          j        | j'        ¦  «         t7          j        d¦  «         Y d }~nd }~ww xY w| j                             d|j        ¦  «         	 |j                             ¦   «          | j         (                    | |¦  «         d S # tH          $ r0 | j         )                    dtU          j+        ¦   «         ¦  «         Y d S w xY w# | j                             d|j        ¦  «         	 |j                             ¦   «          | j         (                    | |¦  «         w # tH          $ r/ | j         )                    dtU          j+        ¦   «         ¦  «         Y w w xY wxY w)NrS   rñ   r   r    zworker [%s]zBooting worker with pid: %sz'Exception while loading the applicationTr¦   z%s)ÚfilezException in worker processr¨   zWorker exiting (pid: %s)z Exception during worker exit:
%s),r/   r[   rz   r~   r?   r_   rF   r)   Úpre_forkr%   r  rö   r7   r  r  r  ry   r   r©   r`   ru   r…   r   rˆ   ÚsocketsÚ	post_forkÚinit_processr9   r¹   rµ   r   ra   ÚprintÚstderrÚflushr0  r¶   Ú	exceptionÚbootedr/  Úworker_exitr  Ú	tracebackÚ
format_exc)r>   r&  rz   Úsiblingr9  s        r   r  zArbiter.spawn_worker¯  s  € ØˆŒ˜1ÑˆŒØ×"Ò" 4¤?°D´H¸d¼nØ#'¤8¨T¬\¸CÑ-?Ø#'¤8¨T¬Xñ7ô 7ˆð 	Œ×Ò˜$ Ñ'Ô'Ð'åŒg‰iŒiˆØ�!Š8ˆ8ØˆFŒJØ &ˆDŒL˜ÑØŒKÐ)Ð*Ð*Ô*¨aÑ/Ð*Ð*Ñ*ØˆJð ”|×*Ò*Ñ,Ô,ð 	 ð 	 ˆGØŒK×ÒÑÔÐÐõ ”Y‘[”[ˆŒ
ð	9ÝÔ˜}¨t¬~Ñ=Ñ>Ô>Ð>ØŒH�MŠMÐ7¸¼ÑDÔDÐDØŒxÔ"ð IÝ!%Ô!4°T´X¸t¼xÑ!HÔ!H�”ØŒH×Ò˜t VÑ,Ô,Ð,Ø×ÒÑ!Ô!Ð!ÝŒH�Q‰KŒKˆK‰KøÝð 	ð 	ð 	ØÝð 	*ð 	*ð 	*ØŒH�NŠNÐDØ$(ð ñ *ô *ð *å�$˜‘(¥¤Ð,Ñ,Ô,Ð,ÝŒJ×ÒÑÔÐÝŒH�TÔ(Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)øøøøÝð 	ð 	ð 	ØŒH×ÒÐ<Ñ=Ô=Ð=Ý�$˜‘(¥¤Ð,Ñ,Ô,Ð,ÝŒJ×ÒÑÔÐØ”=ð 1Ý”˜Ô/Ñ0Ô0Ð0ÝŒH�R‰LŒLˆLˆLˆLˆLˆLˆLøøøøð	øøøð ŒH�MŠMÐ4°f´jÑAÔAÐAð9Ø”
× Ò Ñ"Ô"Ð"Ø”×$Ò$ T¨6Ñ2Ô2Ð2Ð2Ð2øÝð 9ð 9ð 9Ø”× Ò Ð!DÝ!*Ô!5Ñ!7Ô!7ñ9ô 9ð 9ð 9ð 9ð 9ð9øøøøð	 ŒH�MŠMÐ4°f´jÑAÔAÐAð9Ø”
× Ò Ñ"Ô"Ð"Ø”×$Ò$ T¨6Ñ2Ô2Ð2Ð2øÝð 9ð 9ð 9Ø”× Ò Ð!DÝ!*Ô!5Ñ!7Ô!7ñ9ô 9ð 9ð 9ð 9ð9øøøøøøs{   Ã<B/F- Æ+M/ Æ-KÇA1H7È2M/ È7KÉB
KËM/ ËKËM/ Ë<4L2 Ì26M,Í+M,Í/!PÎ4OÏPÏ6O?Ï<PÏ>O?Ï?Pc                 óÖ   — t          | j        t          | j        ¦  «        z
  ¦  «        D ]>}|                      ¦   «          t          j        dt          j        ¦   «         z  ¦  «         Œ?dS )z‰        Spawn new workers as needed.

        This is where a worker process leaves the main loop
        of the master process.
        rò   N)r€   r^   r  rö   r  rv   rø   Úrandom)r>   r   s     r   rC  zArbiter.spawn_workersã  sg   € õ �tÔ'­#¨d¬lÑ*;Ô*;Ñ;Ñ<Ô<ð 	.ð 	.ˆAØ×ÒÑÔÐÝŒJ�s�Vœ]™_œ_Ñ,Ñ-Ô-Ð-Ð-ð	.ð 	.r   c                 óˆ   — t          | j                             ¦   «         ¦  «        }|D ]}|                      ||¦  «         ŒdS )z^        Kill all workers with the signal `sig`
        :attr sig: `signal.SIG*` value
        N)r  rö   Úkeysr$  )r>   rž   Úworker_pidsrz   s       r   r×   zArbiter.kill_workersï  sQ   € õ
 ˜4œ<×,Ò,Ñ.Ô.Ñ/Ô/ˆØð 	'ð 	'ˆCØ×Ò˜S #Ñ&Ô&Ð&Ð&ð	'ð 	'r   c                 óÆ  — 	 t          j        ||¦  «         |t          j        t          j        fv r| j        dxx         dz  cc<   dS dS # t          $ rŒ}|j        t          j        k    rq	 | j	         
                    |¦  «        }|j                             ¦   «          | j                             | |¦  «         Y d}~dS # t          t          f$ r Y Y d}~dS w xY w‚ d}~ww xY w)zj        Kill a worker

        :attr pid: int, worker pid
        :attr sig: `signal.SIG*` value
         r!   rS   N)r%   Úkillr   rß   rù   r7   r   r2  ÚESRCHrö   r‚   r  r  rF   rS  r  )r>   rz   rž   r9  r&  s        r   r$  zArbiter.kill_workerø  s  € ð	ÝŒG�C˜ÑÔÐà•v”~¥v¤~Ð6Ð6Ð6Ø”Ð,Ð-Ð-Ô-°Ñ2Ð-Ð-Ñ-Ð-Ð-ð 7Ð6øåð 		ð 		ð 		ØŒw�%œ+Ò%Ð%ðØ!œ\×-Ò-¨cÑ2Ô2�FØ”J×$Ò$Ñ&Ô&Ð&Ø”H×(Ò(¨¨vÑ6Ô6Ð6Ø�F�F�F�F�FøÝ ¥'Ð*ð ð ð Ø�F�F�F�F�F�Fðøøøàøøøøð		øøøs7   ‚AA
 Á

C ÁCÁ*AB>Â>CÃCÃCÃCÃC c                 óÔ   — ddl }| j                             dd¦  «                             dd¦  «        }t          j                             |                     ¦   «         d|› d�¦  «        S )a)  Get the well-known PID file path for orphan detection.

        Uses self.proc_name (not self.cfg.proc_name) so that during USR2
        the new master gets a different PID file path ("myapp.2" vs "myapp").
        This prevents the old dirty arbiter from removing the new one's PID file.
        r   Nú/r   ú zgunicorn-dirty-z.pid)Útempfiler`   Úreplacer%   Úpathrb   Ú
gettempdir)r>   rb  Ú	safe_names      r   Ú_get_dirty_pidfile_pathzArbiter._get_dirty_pidfile_path  sb   € ð 	ˆˆˆØ”N×*Ò*¨3°Ñ4Ô4×<Ò<¸SÀ#ÑFÔFˆ	ÝŒw�|Š|˜H×/Ò/Ñ1Ô1Ð3TÀYÐ3TÐ3TÐ3TÑUÔUÐUr   c                 ó>  — | j         dk    rdS |                      ¦   «         }t          j                             |¦  «        sdS 	 t          |¦  «        5 }t          |                     ¦   «                              ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   t          j	        |d¦  «         | j
                             d|¦  «         t          j	        |t          j        ¦  «         t          d¦  «        D ]=}t          j        d¦  «         	 t          j	        |d¦  «         Œ-# t"          $ r Y  n#w xY wt          j	        |t          j        ¦  «         n# t&          t(          t"          f$ r Y nw xY w	 t          j        |¦  «         dS # t"          $ r Y dS w xY w)z…Kill any orphaned dirty arbiter from a previous crash.

        Only runs on fresh start (master_pid == 0), not during USR2.
        r   Nz(Killing orphaned dirty arbiter (pid: %s)é
   rò   )r1   rg  r%   rd  ÚexistsÚopenrw   ÚreadÚstripr]  r)   r  r   rß   r€   rv   rø   r   rù   r!  ÚIOErrorr¸   )r>   r.   ÚfÚold_pidr   s        r   Ú_cleanup_orphaned_dirty_arbiterz'Arbiter._cleanup_orphaned_dirty_arbiter  sÞ  € ð Œ?˜aÒÐØˆFà×.Ò.Ñ0Ô0ˆÝŒw�~Š~˜gÑ&Ô&ð 	ØˆFð	Ý�g‘”ð 0 !Ý˜aŸfšf™hœhŸnšnÑ.Ô.Ñ/Ô/�ð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0õ ŒG�G˜QÑÔÐàŒH×ÒÐGÈÑQÔQÐQÝŒG�G�Vœ^Ñ,Ô,Ð,å˜2‘Y”Yð 1ð 1�Ý”
˜3‘”�ðÝ”G˜G QÑ'Ô'Ð'Ð'øÝð ð ð Ø�E�Eðøøøõ ”˜¥¤Ñ0Ô0Ð0øøÝ�G¥WÐ-ð 	ð 	ð 	ØˆDð	øøøð	ÝŒI�gÑÔÐÐÐøÝð 	ð 	ð 	ØˆDˆDð	øøøsm   ÁE Á4BÂE ÂBÂE ÂBÂA7E ÄD)Ä(E Ä)
D7Ä3E Ä6D7Ä7"E ÅE4Å3E4Å8F Æ
FÆFc                 ó|  — ddl m}m} | j        rdS |                      ¦   «          |                      ¦   «         | _         || j        | j        | j        ¬¦  «        | _	        | j	        j
        }t          j        ¦   «         }|dk    r?|| _         ||¦  «         |t          j        d<   | j                             d||¦  «         |S 	 | j	                             ¦   «          t!          j        d¦  «         dS # t$          $ r ‚ t&          $ r2 | j                             d¦  «         t!          j        d¦  «         Y dS w xY w)	zž        Spawn the dirty arbiter process.

        The dirty arbiter manages a separate pool of workers for
        long-running, blocking operations.
        r   )ÚDirtyArbiterÚset_dirty_socket_pathN)r.   ÚGUNICORN_DIRTY_SOCKETz%Spawned dirty arbiter (pid: %s) at %sz"Exception in dirty arbiter processr¨   )Úgunicorn.dirtyrs  rt  r3   rq  rg  r5   rF   r)   r4   Úsocket_pathr%   r  r&   ru   r¾   r9   r¹   rµ   r¶   rQ  )r>   rs  rt  rw  rz   s        r   r�   zArbiter.spawn_dirty_arbiterF  sp  € ð 	GÐFÐFÐFÐFÐFÐFÐFàÔ!ð 	ØˆFð 	×,Ò,Ñ.Ô.Ð.ð "×9Ò9Ñ;Ô;ˆÔà)˜\ØŒH�d”hØÔ&ð
ñ 
ô 
ˆÔð Ô(Ô4ˆåŒg‰iŒiˆØ�!Š8ˆ8à%(ˆDÔ"à!Ð! +Ñ.Ô.Ð.Ø2=�BŒJÐ.Ñ/ØŒH�MŠMÐAØ˜{ñ,ô ,ð ,àˆJð	ØÔ×"Ò"Ñ$Ô$Ð$ÝŒH�Q‰KŒKˆKˆKˆKøÝð 	ð 	ð 	ØÝð 	ð 	ð 	ØŒH×ÒÐCÑDÔDÐDÝŒH�R‰LŒLˆLˆLˆLˆLð	øøøs   Ã-C5 Ã5AD;Ä:D;c                 óÐ   — | j         sdS 	 t          j        | j         |¦  «         dS # t          $ r4}|j        t          j        k    rd| _         d| _        Y d}~dS Y d}~dS d}~ww xY w)z\        Send a signal to the dirty arbiter.

        :attr sig: `signal.SIG*` value
        Nr   )r3   r%   r]  r   r2  r^  r4   )r>   rž   r9  s      r   rÆ   zArbiter.kill_dirty_arbitert  s˜   € ð Ô%ð 	ØˆFð	*ÝŒG�DÔ*¨CÑ0Ô0Ð0Ð0Ð0øÝð 	*ð 	*ð 	*ØŒw�%œ+Ò%Ð%Ø)*�Ô&Ø%)�Ô"Ð"Ð"Ð"Ð"Ð"Ð"ð &Ð%Ð%Ð%Ð%Ð%øøøøð	*øøøs   ‹' §
A%±#A Á A%c                 ód  — | j         sdS 	 t          j        | j         t          j        ¦  «        \  }}|sdS t          j        |¦  «        rSt          j        |¦  «        }|dk    r| j                             d||¦  «         n`| j                             d|¦  «         nDt          j	        |¦  «        r0t          j
        |¦  «        }| j                             d||¦  «         d| _         d| _        dS # t          $ r4}|j        t          j        k    rd| _         d| _        Y d}~dS Y d}~dS d}~ww xY w)zA        Reap the dirty arbiter process if it has exited.
        Nr   z*Dirty arbiter (pid:%s) exited with code %szDirty arbiter (pid:%s) exitedz*Dirty arbiter (pid:%s) killed by signal %s)r3   r%   r(  r)  r*  r+  r)   r¯   ru   r,  r-  r  r4   r   r2  r3  )r>   r4  r5  r6  rž   r9  s         r   rÂ   zArbiter.reap_dirty_arbiter„  sj  € ð Ô%ð 	ØˆFð	*Ýœ: dÔ&<½b¼jÑIÔI‰LˆD�&Øð Ø�åŒ|˜FÑ#Ô#ð 
,Ýœ>¨&Ñ1Ô1�Ø˜q’=�=Ø”H—N’NÐ#OØ#'¨ñ3ô 3ð 3ð 3ð ”H—M’MÐ"AÀ4ÑHÔHÐHÐHÝ” Ñ'Ô'ð ,Ý”k &Ñ)Ô)�Ø”× Ò Ð!MØ!% sñ,ô ,ð ,ð &'ˆDÔ"Ø!%ˆDÔÐÐøÝð 	*ð 	*ð 	*ØŒw�%œ,Ò&Ð&Ø)*�Ô&Ø%)�Ô"Ð"Ð"Ð"Ð"Ð"Ð"ð 'Ð&Ð&Ð&Ð&Ð&øøøøð	*øøøs   ‹)C1 ¶B9C1 Ã1
D/Ã;#D*Ä*D/c                 ó´   — | j         rdS | j        j        dk    r<| j        j        r2| j                             d¦  «         |                      ¦   «          dS dS dS )zL        Maintain the dirty arbiter process by respawning if needed.
        Nr   zSpawning dirty arbiter...)r3   rF   r‹   rŒ   r)   ru   r�   rC   s    r   r±   zArbiter.manage_dirty_arbiter£  si   € ð Ô!ð 	ØˆFàŒ8Ô! AÒ%Ð%¨$¬(Ô*=Ð%ØŒH�MŠMÐ5Ñ6Ô6Ð6Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&ð &Ð%Ð%Ð%r   c                 ó¾   — | j         j        }t          j                             |¦  «        s1t          j                             t          j        ¦   «         |¦  «        }|S )z<Get the control socket path, making relative paths absolute.)rF   Úcontrol_socketr%   rd  Úisabsrb   r   r8   )r>   rw  s     r   Ú_get_control_socket_pathz Arbiter._get_control_socket_path²  sD   € à”hÔ-ˆÝŒw�}Š}˜[Ñ)Ô)ð 	CÝœ'Ÿ,š,¥t¤{¡}¤}°kÑBÔBˆKØÐr   c                 ón  — | j         j        r| j                             d¦  «         dS ddlm} |                      ¦   «         }| j         j        }	  || ||¦  «        | _        | j         	                    ¦   «          dS # t          $ r-}| j                             d|¦  «         d| _        Y d}~dS d}~ww xY w)z�        Start the control socket server.

        The server runs in a background thread and accepts commands
        via Unix socket.
        zControl socket disabledNr   )ÚControlSocketServerz"Failed to start control socket: %s)rF   Úcontrol_socket_disabler)   ra   Úgunicorn.ctl.serverr€  r~  Úcontrol_socket_moder6   r“   r¶   r  )r>   r€  rw  Úsocket_moder9  s        r   r«   zArbiter._start_control_server¹  sê   € ð Œ8Ô*ð 	ØŒH�NŠNÐ4Ñ5Ô5Ð5ØˆFð 	<Ð;Ð;Ð;Ð;Ð;à×3Ò3Ñ5Ô5ˆØ”hÔ2ˆð	(Ø#6Ð#6Ø�k ;ñ$ô $ˆDÔ ð Ô ×&Ò&Ñ(Ô(Ð(Ð(Ð(øÝð 	(ð 	(ð 	(ØŒH×ÒÐAÀ1ÑEÔEÐEØ#'ˆDÔ Ð Ð Ð Ð Ð Ð øøøøð	(øøøs   Á+A= Á=
B4Â"B/Â/B4c                 óÀ   — | j         rV	 | j                              ¦   «          n2# t          $ r%}| j                             d|¦  «         Y d}~nd}~ww xY wd| _         dS dS )z0        Stop the control socket server.
        z!Error stopping control server: %sN)r6   r·   r¶   r)   ra   )r>   r9  s     r   rè   zArbiter._stop_control_serverÓ  sŽ   € ð Ôð 	(ðGØÔ$×)Ò)Ñ+Ô+Ð+Ð+øÝð Gð Gð GØ”—’ÐBÀAÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøà#'ˆDÔ Ð Ð ð	(ð 	(s   ‰# £
A­AÁA)Nr   )r£   )T)=Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/  r0  r=   r~   rö   r   ÚNSIGrå   rƒ   r–   ÚdictÚdirr®   r@   rD   rJ   Úpropertyr^   r-   r“   r}   r¾   r˜   rÃ   Ú
handle_cldrÈ   rÊ   rÍ   rÐ   rÓ   rÕ   rÙ   rÜ   rà   r¬   ræ   r´   r­   r·   rÛ   rÅ   r°   rÁ   rª   r  rC  r×   r$  rg  rq  r�   rÆ   rÂ   r±   r~  r«   rè   rT   r   r   r   r      s_  € € € € € ðð ð Ðð €Nà€Ià€IØ€Gð ”[€NðOð OØE×KÒKÑMÔMðOñ Oô O€Gà�ð ð Ø>A¸cÀ&¹k¼kðñ ô ñ ô €Ið
-
ð -
ð -
ð^!ð !ð !ð:ð :ð :ð �(Ð+Ð-=Ñ>Ô>€Kðð ð ð@:"ð :"ð :"ðx
8ð 
8ð 
8ð'ð 'ð 'ð.ð .ð .ð`'ð 'ð 'ð"ð "ð "ð €Jð3ð 3ð 3ðð ð ðð ð ð
ð ð ð
ð ð ðð ð ð	4ð 	4ð 	4ðð ð ð?ð ?ð ?ð?ð ?ð ?ð"7ð 7ð 7ðð ð ð ð"ð ð ð ð24"ð 4"ð 4"ð 4"ðl Gð  Gð  GðDGð Gð GðR6ð 6ð 6ð*8ð 8ð 8ðt=ð =ð =ð@29ð 29ð 29ðh
.ð 
.ð 
.ð'ð 'ð 'ðð ð ð6	Vð 	Vð 	Vð&ð &ð &ðP,ð ,ð ,ð\*ð *ð *ð *ð *ð *ð>	'ð 	'ð 	'ðð ð ð(ð (ð (ð4	(ð 	(ð 	(ð 	(ð 	(r   r   )r2  r%   r*   rX  r   r9   rv   rT  r‡   Úgunicorn.errorsr   r   Úgunicorn.pidfiler   Úgunicornr   r   r   r	   r
   r   rT   r   r   ú<module>r’     s÷   ðð €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø €€€à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø $Ð $Ð $Ð $Ð $Ð $Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1ð
E(ð E(ð E(ð E(ð E(ñ E(ô E(ð E(ð E(ð E(r   