Ë
    }ëëiî�  ã                   ó    — 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y)é    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j                  «       D � ���cg c]  }t        t        d|z  «      ‘Œ c}}}} 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(d2d„Z)d3d„Z*d4d„Z+d „ Z,d!„ Z-d"„ Z.d#„ Z/d$„ Z0d%„ Z1d&„ Z2d'„ Z3d(„ Z4d)„ Z5d*„ Z6d+„ Z7d,„ Z8d-„ Z9d.„ Z:d/„ Z;d0„ Z<d1„ Z=yc c}}}} w )5ÚArbiterz›
    Arbiter maintain the workers processes alive. It launches or
    kills them if needed. It also manages application reloading
    via SIGHUP/USR2.
    é   é   z+HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCHzSIG%sc              #   ó‚   K  — | ]7  }|d d dk(  r-|d   dk7  r%t        t        |«      |dd  j                  «       f–— Œ9 y ­w)Nr   ÚSIGÚ_)ÚgetattrÚsignalÚlower)Ú.0Únames     úA/var/www/eb/venv/lib/python3.12/site-packages/gunicorn/arbiter.pyú	<genexpr>zArbiter.<genexpr>0   sI   è ø€ ò Ø6:Ø��ˆ8�uÒ  a¡¨C¢ô 
”˜Ó	  Q R §¡Ó 0Ô1ñùs   ‚=?c                 ó  — t         t        j                  d<   d | _        d | _        d | _        t        j                  «       | _        | j                  |«       d | _
        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d | _        d | _        d ddddœ| _        t+        j,                  «       }t.        j0                  d d  }|j3                  dt.        j4                  «       ||t.        j4                  dœ| _        y )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‰k‹mˆä�x‰x™ˆ{ˆØ�‰�A”s—~‘~Ô&ð ØÜ�~‰~ñ
ˆ�ó    c                 ó   — | j                   S ©N)r#   ©r:   s    r   Ú_get_num_workerszArbiter._get_num_workersd   s   € Ø× Ñ Ð r=   c                 ód   — | j                   }|| _         | j                  j                  | ||«       y r?   )r#   ÚcfgÚnworkers_changed)r:   ÚvalueÚ	old_values      r   Ú_set_num_workerszArbiter._set_num_workersg   s+   € Ø×%Ñ%ˆ	Ø!ˆÔØ�‰×!Ñ! $¨¨yÕ9r=   c                 óî  — || _         |j                  | _        | j                  €*| j                  j                  |j                  «      | _        dt        j
                  v r| j                  j                  «        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _
        | j                  j                  | _        | j                  j                  | _        | j                  j                  dj                  dj                  d„ t!        | j                  j"                  j%                  «       d„ ¬«      D «       «      «      «       | j                  j&                  r?| j                  j&                  j%                  «       D ]  \  }}|t        j
                  |<   Œ | j                  j(                  r| j                   j+                  «        y y )NÚGUNICORN_PIDzCurrent configuration:
{0}ú
c              3   óZ   K  — | ]#  \  }}d j                  ||j                  «      –— Œ% y­w)z
  {0}: {1}N)ÚformatrE   )r   ÚconfigrE   s      r   r   z Arbiter.setup.<locals>.<genexpr>   s-   è ø€ ò ;á!�F˜Eð ×#Ñ# F¨E¯K©K×8ñ;ùs   ‚)+c                 ó   — | d   S ©Né   © )Úsettings    r   ú<lambda>zArbiter.setup.<locals>.<lambda>ƒ   s
   € ¨g°a©j€ r=   ©Úkey)r;   rC   r%   Úlogger_classr!   r"   Úreopen_filesÚworker_classÚaddressÚworkersÚnum_workersÚtimeoutÚ	proc_nameÚdebugrL   ÚjoinÚsortedÚsettingsÚitemsÚenvÚpreload_appÚwsgi)r:   r;   ÚkÚvs       r   r)   zArbiter.setupm   sb  € ØˆŒØ—7‘7ˆŒà�8‰8ÐØ—x‘x×,Ñ,¨S¯W©WÓ5ˆDŒHð œRŸZ™ZÑ'Ø�H‰H×!Ñ!Ô#à ŸH™H×1Ñ1ˆÔØ—x‘x×'Ñ'ˆŒØŸ8™8×+Ñ+ˆÔØ—x‘x×'Ñ'ˆŒØŸ™×+Ñ+ˆŒà�‰�‰Ð4×;Ñ;Ø�I‰Iñ ;ô ˜$Ÿ(™(×+Ñ+×1Ñ1Ó3Ù8ô:ô;ó ;ó<ô 	=ð �8‰8�<Š<ØŸ™Ÿ™×*Ñ*Ó,ò "‘��1Ø !”—
‘
˜1’ð"ð �8‰8×ÒØ�H‰H�M‰M�Oð  r=   c                 óŽ  — | j                   j                  dt        «       t        j                  «       | j                  d<   dt
        j                  v rHt        t
        j                  j                  d«      «      | _	        | j                  dz   | _
        d| _        t        j                  «       | _        | j                  j                  �_| j                  j                  }| j                  dk7  r|dz  }t!        |«      | _        | j                  j#                  | j                  «       | j                  j%                  | «       | j'                  «        | j(                  süd}t+        j,                  «       }|r3d| _        t/        t*        j0                  t*        j0                  |z   «      }n[| j                  rOg }t
        j                  j3                  d	«      j5                  d
«      D ]  }|j7                  t        |«      «       Œ | j                  j8                  rt;        t<        d«      s0t?        j@                  | j                  | j                   |«      | _        d
jC                  | j(                  D �cg c]  }tE        |«      ‘Œ c}«      }| j                   jG                  d«       | j                   j                  d|| j                  «       | j                   j                  d| j                  jH                  «       t+        jJ                  d| j                   «       t;        | jL                  d«      r0| jL                  jO                  | j                  | j                   «       | j                  jP                  dkD  r&| j                  jR                  r| jU                  «        | j                  jW                  | «       yc c}w )zS        Initialize the arbiter. Start listening and set pidfile if needed.
        zStarting gunicorn %sr   rI   z.2zMaster.2Nr   TÚGUNICORN_FDú,ÚSO_REUSEPORTzArbiter bootedzListening at: %s (%s)zUsing worker: %sz&READY=1
STATUS=Gunicorn arbiter bootedÚcheck_config),r%   Úinfor	   Útimer3   r!   r"   ÚintÚgetr-   r]   r.   ÚgetpidÚpidrC   r*   r   ÚcreateÚon_startingÚinit_signalsÚ	LISTENERSr   Ú
listen_fdsÚrangeÚSD_LISTEN_FDS_STARTÚpopÚsplitÚappendÚ
reuse_portÚhasattrÚsocketr   Úcreate_socketsr_   Ústrr^   Úworker_class_strÚ	sd_notifyrX   rl   Údirty_workersÚ
dirty_appsÚspawn_dirty_arbiterÚ
when_ready)r:   ÚpidnameÚfdsrw   ÚfdÚlnrÚlisteners_strs          r   ÚstartzArbiter.start�   sž  € ð 	�‰�‰Ð,¬kÔ:ô %)§I¡I£Kˆ�‰�LÑ!àœRŸZ™ZÑ'Ü!¤"§*¡*§.¡.°Ó"@ÓAˆDŒOØ!Ÿ^™^¨dÑ2ˆDŒNØ)ˆDÔä—9‘9“;ˆŒØ�8‰8×ÑÐ'Ø—h‘h×&Ñ&ˆGØ�‰ !Ò#Ø˜4‘�Ü" 7Ó+ˆDŒLØ�L‰L×Ñ §¡Ô)Ø�‰×Ñ˜TÔ"à×ÑÔà�~Š~ØˆCÜ ×+Ñ+Ó-ˆJÙØ#�”ÜœG×7Ñ7Ü#×7Ñ7¸*ÑDóF‘ð —’Ø�ÜŸ*™*Ÿ.™.¨Ó7×=Ñ=¸cÓBò (�BØ—J‘Jœs 2›wÕ'ð(ð —H‘H×'Ò'¬G´F¸NÔ,KÜ!%×!4Ñ!4°T·X±X¸t¿x¹xÈÓ!M�”àŸ™°d·n±nÖ!E¨s¤# c¥(Ò!EÓFˆØ�‰�‰Ð'Ô(Ø�‰�‰Ð-¨}¸d¿h¹hÔGØ�‰�‰Ð(¨$¯(©(×*CÑ*CÔDÜ×ÑÐCÀTÇXÁXÔNô �4×$Ñ$ nÔ5Ø×Ñ×*Ñ*¨4¯8©8°T·X±XÔ>ð �8‰8×!Ñ! AÒ%¨$¯(©(×*=Ò*=Ø×$Ñ$Ô&ð
 	�‰×Ñ˜DÕ!ùò# "Fs   É6Oc                 óö   — | j                   j                  «        | j                  D ]"  }t        j                  || j                  «       Œ$ t        j                  t        j                  | j
                  «       y)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   ru   zArbiter.init_signalsÉ   sS   € ð
 	�‰×ÑÔ ð —‘ò 	*ˆAÜ�M‰M˜!˜TŸ[™[Õ)ð	*ä�‰”f—n‘n d×&6Ñ&6Õ7r=   c                 ó:   — | j                   j                  |«       y)z3Signal handler - NO LOGGING, just queue the signal.N©r(   Ú
put_nowait©r:   ÚsigÚframes      r   r   zArbiter.signalÕ   ó   € à�‰×!Ñ! #Õ&r=   c                 ó–  — | j                  «        t        j                  d| j                  z  «       	 | j	                  «        | j                  «        	 | j                  «        | j                  d¬«      D ]Æ  }|| j                  vr| j                  j                  d|«       Œ.| j                  j                  |«      }t        | d|z  d«      }|s| j                  j                  d|«       Œx|t        j                  k(  r| j                  j                   n| j                  j                  } |d	|«        |«        ŒÈ | j#                  «        | j	                  «        | j%                  «        �Œ# t&        t(        f$ r | j+                  «        Y yt,        $ r1}| j+                  |j.                  |j0                  ¬
«       Y d}~yd}~wt2        $ r ‚ t4        $ rl | j                  j                  dd¬«       | j7                  d«       | j8                  �| j8                  j;                  «        t=        j>                  d«       Y y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%   rm   rp   r   Úerrorr   r‘   r^   Úmurder_workersÚmanage_dirty_arbiterÚStopIterationÚKeyboardInterruptÚhaltr   rž   rŸ   Ú
SystemExitÚ	ExceptionÚstopr*   Úunlinkr5   Úexit)r:   r˜   ÚsignameÚhandlerÚ	log_levelÚinsts         r   ÚrunzArbiter.runÙ   sÔ  € à�
‰
ŒÜ×Ñ˜=¨4¯>©>Ñ9Ô:ð)	Ø×ÑÔ!ð ×&Ñ&Ô(àØ×)Ñ)Ô+ð  ×0Ñ0¸Ð0Ó=ò �CØ $§.¡.Ñ0ØŸ™Ÿ™Ð&CÀSÔIØ à"Ÿn™n×0Ñ0°Ó5�GÜ% d¨K¸'Ñ,AÀ4ÓH�GÙ"ØŸ™Ÿ™Ð'=¸wÔGØ à25¼¿¹Ò2G §¡§¢ÈTÏXÉXÏ]É]�IÙÐ3°WÔ=Ù•Iðð ×#Ñ#Ô%Ø×#Ñ#Ô%Ø×)Ñ)Ô+ñ+ øô, Ô0Ð1ò 	Ø�I‰IŽKÜò 	HØ�I‰I˜TŸ[™[°d×6FÑ6FˆI×GÑGûÜò 	ØÜò 	Ø�H‰H�N‰NÐ=Ø$(ð ô *à�I‰I�eÔØ�|‰|Ð'Ø—‘×#Ñ#Ô%Ü�H‰H�RŽLð	ús%   ´D>E2 Å2IÆIÆ'GÇA>IÉIc                 ó:   — | j                   j                  |«       y)z;SIGCHLD signal handler - NO LOGGING, just queue the signal.Nr•   r—   s      r   r’   zArbiter.signal_chld	  rš   r=   c                 óD   — | j                  «        | j                  «        y)z6SIGCHLD handling - called from main loop, safe to log.N)Úreap_workersÚreap_dirty_arbiterr@   s    r   Úhandle_chldzArbiter.handle_chld  s   € à×ÑÔØ×ÑÕ!r=   c                 óÈ   — | j                   j                  d| j                  «       | j                  «        | j                  r | j                  t        j                  «       yy)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%   rm   r.   Úreloadr/   Úkill_dirty_arbiterr   ÚSIGHUPr@   s    r   Ú
handle_hupzArbiter.handle_hup  sE   € ð 	�‰�‰�m T×%5Ñ%5Ô6Ø�‰Œà×!Ò!Ø×#Ñ#¤F§M¡MÕ2ð "r=   c                 ó   — t         ‚)zSIGTERM handling)r¬   r@   s    r   Úhandle_termzArbiter.handle_term#  s   € äÐr=   c                 ó0   — | j                  d«       t        ‚)zSIGINT handlingF©r±   r¬   r@   s    r   Ú
handle_intzArbiter.handle_int'  ó   € à�	‰	�%ÔÜÐr=   c                 ó0   — | j                  d«       t        ‚)zSIGQUIT handlingFrÆ   r@   s    r   Úhandle_quitzArbiter.handle_quit,  rÈ   r=   c                 óN   — | xj                   dz  c_         | j                  «        y)zR        SIGTTIN handling.
        Increases the number of workers by one.
        rP   N©r[   r¤   r@   s    r   Úhandle_ttinzArbiter.handle_ttin1  s!   € ð
 	×Ò˜AÑÕØ×ÑÕr=   c                 ón   — | j                   dk  ry| xj                   dz  c_         | j                  «        y)zR        SIGTTOU handling.
        Decreases the number of workers by one.
        rP   NrÌ   r@   s    r   Úhandle_ttouzArbiter.handle_ttou9  s2   € ð
 ×Ñ˜qÒ ØØ×Ò˜AÑÕØ×ÑÕr=   c                 óÎ   — | j                   j                  «        | j                  t        j                  «       | j
                  r | j                  t        j                  «       yy)zU        SIGUSR1 handling.
        Kill all workers by sending them a SIGUSR1
        N)r%   rW   Úkill_workersr   ÚSIGUSR1r/   rÀ   r@   s    r   Úhandle_usr1zArbiter.handle_usr1C  sF   € ð
 	�‰×ÑÔØ×Ñœ&Ÿ.™.Ô)à×!Ò!Ø×#Ñ#¤F§N¡NÕ3ð "r=   c                 ó$   — | j                  «        y)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)Úreexecr@   s    r   Úhandle_usr2zArbiter.handle_usr2N  s   € ð 	�‰�r=   c                 óê   — | j                   j                  rB| j                  j                  d«       d| _        | j                  t        j                  «       y| j                  j                  d«       y)zSIGWINCH handlingzgraceful stop of workersr   z SIGWINCH ignored. Not daemonizedN)	rC   Údaemonr%   rm   r[   rÑ   r   ÚSIGTERMr^   r@   s    r   Úhandle_winchzArbiter.handle_winchW  sI   € à�8‰8�?Š?Ø�H‰H�M‰MÐ4Ô5Ø ˆDÔØ×ÑœfŸn™nÕ-à�H‰H�N‰NÐ=Õ>r=   c                 óÌ  — | j                   dk(  ry | j                   t        j                  «       k7  r³| j                  j	                  d«       d| _        d| _         | j                  j                  | _        t        j                  d= | j                  �/| j                  j                  | j                  j                  «       t        j                  d| j                  z  «       y y )Nr   zMaster has been promoted.r   rI   rœ   )r-   r!   Úgetppidr%   rm   r.   rC   r]   r"   r*   Úrenamer   r£   r@   s    r   r¦   zArbiter.maybe_promote_master`  s¢   € Ø�?‰?˜aÒØà�?‰?œbŸj™j›lÒ*Ø�H‰H�M‰MÐ5Ô6à'ˆDÔØˆDŒOØ!ŸX™X×/Ñ/ˆDŒNÜ—
‘
˜>Ð*à�|‰|Ð'Ø—‘×#Ñ# D§H¡H×$4Ñ$4Ô5ä×Ñ˜}¨t¯~©~Ñ=Õ>ð +r=   c                 óN   — | j                   j                  | j                  «       y)z Wake up the arbiter's main loop.N)r(   r–   ÚWAKEUP_REQUESTr@   s    r   ÚwakeupzArbiter.wakeupq  s   € à�‰×!Ñ! $×"5Ñ"5Õ6r=   Nc                 óŽ  — | j                  «        | j                  «        |dk(  r| j                  j                  n| j                  j                  } |d| j
                  «       |�	 |d|«       | j                  �| j                  j                  «        | j                  j                  | «       t        j                  |«       y)z halt arbiter r   zShutting down: %sNz
Reason: %s)Ú_stop_control_serverr±   r%   rm   r©   r.   r*   r²   rC   Úon_exitr5   r³   )r:   rž   rŸ   Úlog_funcs       r   r®   zArbiter.haltu  s�   € ð 	×!Ñ!Ô#à�	‰	Œà$/°1Ò$4�4—8‘8—=’=¸$¿(¹(¿.¹.ˆÙÐ$ d×&6Ñ&6Ô7ØÐÙ�\ 6Ô*à�<‰<Ð#Ø�L‰L×ÑÔ!Ø�‰×Ñ˜ÔÜ�‰�Õr=   c                 ó¢  — g }	 | j                   j                  d|¬«      }|| j                  k7  r|j                  |«       	 	 | j                   j	                  «       }|| j                  k7  r|j                  |«       Œ<# t
        j                  $ r Y |S w xY w# t
        j                  $ r Y |S t        $ r t        j                  «        Y |S w xY w)ze        Wait for signals with timeout.
        Returns a list of signals that were received.
        T)Úblockr\   )
r(   rp   rß   r|   Ú
get_nowaitr&   ÚEmptyr­   r5   r³   )r:   r\   Úsignalsr˜   s       r   r§   zArbiter.wait_for_signals†  sÍ   € ð
 ˆð	à—.‘.×$Ñ$¨4¸Ð$ÓAˆCØ�d×)Ñ)Ò)Ø—‘˜sÔ#àðØŸ.™.×3Ñ3Ó5�CØ˜d×1Ñ1Ò1ØŸ™ sÔ+ð	 øô
 —{‘{ò Øð
 ˆðûä�{‰{ò 	Øð ˆô !ò 	Ü�H‰H�JØˆð	ús;   „>B Á:A> Á=B Á>BÂB ÂBÂB ÂCÂ.CÃCc                 ó€  — | j                   | j                  cxk(  xr dk(  nc xr& | j                   xr | j                  j                   }t        j                  | j                  |«       g | _        t        j                  }|st        j                  }t        j                  «       | j                  j                  z   }| j                  r| j                  |«       | j                  |«       | }| j                   s| j                  �r;t        j                  «       |k  �r#|s»	 | j"                  j%                  «       }|t        j&                  t        j                  fv r~| j(                  j+                  d«       d}| j                  t        j                  «       | j                  r| j                  t        j                  «       t        j                  «       dz   }| j/                  «        | j1                  «        t        j2                  d«       | j                   s| j                  rt        j                  «       |k  r�Œ#| j                  t        j4                  «       | j                  r| j                  t        j4                  «       | j/                  «        | j1                  «        y# t,        $ r Y ŒÜw xY w)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)r,   r-   r   rC   r}   r   Úclose_socketsrv   r   rÙ   ÚSIGQUITrn   Úgraceful_timeoutr/   rÀ   rÑ   ÚWORKERSr(   rç   ÚSIGINTr%   rm   r°   r»   r¼   ÚsleepÚSIGKILL)r:   Úgracefulr²   r˜   ÚlimitÚquick_shutdownÚpending_sigs          r   r±   zArbiter.stopŸ  sú  € ð �O‰O˜tŸ™Ö3°!Ô3ò (Ø—L‘LÐ ò(à—H‘H×'Ñ'Ð'ð 	ô
 	×Ñ˜4Ÿ>™>¨6Ô2àˆŒÜ�n‰nˆÙÜ—.‘.ˆCÜ—	‘	“˜dŸh™h×7Ñ7Ñ7ˆð ×!Ò!Ø×#Ñ# CÔ(ð 	×Ñ˜#Ôà%˜ˆØ�|Š|˜t×5Ó5¼4¿9¹9»;ÈÓ;Ná!ðØ"&§.¡.×";Ñ";Ó"=�KØ"¤v§}¡}´f·n±nÐ&EÑEØŸ™Ÿ™Ð&@ÔAØ)-˜Ø×)Ñ)¬&¯.©.Ô9Ø×1Ò1Ø ×3Ñ3´F·N±NÔCä $§	¡	£¨cÑ 1˜ð ×ÑÔØ×#Ñ#Ô%Ü�J‰J�sŒOð# �|Š|˜t×5Ò5¼4¿9¹9»;ÈÔ;Nð& 	×Ñœ&Ÿ.™.Ô)Ø×!Ò!Ø×#Ñ#¤F§N¡NÔ3à×ÑÔØ×ÑÕ!øô !ò Ùðús   Ä&B:J1 Ê1	J=Ê<J=c                 óP  — | j                   dk7  r| j                  j                  d«       y| j                  dk7  r| j                  j                  d«       yt	        j
                  «       }t	        j                  «       | _         | j                   dk7  ry| j                  j                  | «       | j                  j                  j                  «       }t        |«      |d<   | j                  rBt        t	        j
                  «       «      |d<   t        t        | j                  «      «      |d<   n%dj                  d	„ | j                  D «       «      |d
<   t	        j                   | j"                  d   «       t	        j$                  | j"                  d   | j"                  d   |«       y)z1        Relaunch the master and workers.
        r   z"USR2 signal ignored. Child exists.Nz#USR2 signal ignored. Parent exists.rI   Ú
LISTEN_PIDÚ
LISTEN_FDSrj   c              3   óN   K  — | ]  }t        |j                  «       «      –— Œ y ­wr?   )r�   Úfileno)r   r‹   s     r   r   z!Arbiter.reexec.<locals>.<genexpr>ï  s    è ø€ ò .=Ø&)”�C—J‘J“L×!ñ.=ùs   ‚#%ri   r    r   )r,   r%   Úwarningr-   r!   rq   ÚforkrC   Úpre_execÚenv_origÚcopyr�   r   Úlenrv   r_   Úchdirr9   Úexecvpe)r:   r-   r"   s      r   rÕ   zArbiter.reexecÕ  s:  € ð �?‰?˜aÒØ�H‰H×ÑÐAÔBØà�?‰?˜aÒØ�H‰H×ÑÐBÔCØä—Y‘Y“[ˆ
ÜŸ'™'›)ˆŒØ�?‰?˜aÒØà�‰×Ñ˜$Ôà—(‘(×#Ñ#×(Ñ(Ó*ˆÜ"% j£/ˆ�Ñà�<Š<Ü$'¬¯	©	«Ó$4ˆG�LÑ!Ü$'¬¨D¯N©NÓ(;Ó$<ˆG�LÒ!à%(§X¡Xñ .=Ø-1¯^©^ô.=ó &=ˆG�MÑ"ô 	�‰�—‘ Ñ&Ô'ô 	�
‰
�4—>‘> !Ñ$ d§n¡n°VÑ&<¸gÕFr=   c                 ó  — | j                   dxx   dz  cc<   | j                  j                  }| j                  j                  D ]W  }|| j                  j                  v r+| j                  j                  |   t
        j                  |<   ŒF	 t
        j                  |= ŒY | j                  j                  «        | j                  | j                  «       | j                  j                  «        || j                  j                  k7  rž| j                  D ]  }|j                  «        Œ t        j                   | j                  | j                  «      | _        dj#                  | j                  D �cg c]  }t%        |«      ‘Œ c}«      }| j                  j'                  d|«       | j                  j)                  | «       | j*                  �| j*                  j-                  «        | j                  j*                  �It/        | j                  j*                  «      | _        | j*                  j1                  | j2                  «       t5        j6                  d| j8                  z  «       | j:                  }t=        | j                  j>                  «      D ]  }| jA                  «        Œ | jC                  «        tE        jF                  «       | j                  jH                  z   }tE        jF                  «       |k  r{| jJ                  sy tM        d„ | jJ                  jO                  «       D «       «      }||kD  ry | jQ                  «        tE        jR                  d«       tE        jF                  «       |k  rŒzy y # t        $ r Y �Œ<w xY wc c}w )Nr   rP   rj   zListening at: %srœ   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr?   ©Úage)r   Úws     r   r   z!Arbiter.reload.<locals>.<genexpr>:  s   è ø€ Ò> 1˜Ÿ�Ñ>ùs   ‚rì   )*r3   rC   rY   rc   r   r!   r"   ÚKeyErrorr;   r¿   r)   r%   rW   rv   Úcloser   r€   r_   r�   rm   Ú	on_reloadr*   r²   r   rs   rr   r   r£   r]   r+   rx   rZ   Úspawn_workerr¤   rn   Ú	monotonicrï   rð   ÚminÚvaluesr»   rò   )	r:   Úold_addressrf   r‹   rŒ   Úlast_worker_ager   ÚdeadlineÚoldests	            r   r¿   zArbiter.reload÷  sž  € à�‰�IÓ !Ñ#Óà—h‘h×&Ñ&ˆð —‘—‘ò 
	ˆAØ�D—H‘H×%Ñ%Ñ%ð !%§¡× 1Ñ 1°!Ñ 4”—
‘
˜1’ðÜŸ
™
 1™ð
	ð 	�‰�‰ÔØ�
‰
�4—8‘8Ôð 	�‰×ÑÔð ˜$Ÿ(™(×*Ñ*Ò*à—~‘~ò �Ø—	‘	•ðô "×0Ñ0°·±¸4¿8¹8ÓDˆDŒNØŸH™H¸$¿.¹.Ö%I°3¤c¨#¥hÒ%IÓJˆMØ�H‰H�M‰MÐ,¨mÔ<ð 	�‰×Ñ˜4Ô ð �<‰<Ð#Ø�L‰L×ÑÔ!ð �8‰8×ÑÐ'Ü" 4§8¡8×#3Ñ#3Ó4ˆDŒLØ�L‰L×Ñ §¡Ô)ô 	×Ñ˜=¨4¯>©>Ñ9Ô:ð Ÿ/™/ˆô �t—x‘x×'Ñ'Ó(ò 	 ˆAØ×ÑÕð	 ð 	×ÑÔô —>‘>Ó# d§h¡h×&?Ñ&?Ñ?ˆÜ�n‰nÓ Ò)Ø—<’<ØäÑ>¨¯©×(;Ñ(;Ó(=Ô>Ó>ˆFØ˜Ò'ØØ×ÑÔÜ�J‰J�sŒOô �n‰nÓ Õ)øô_  ò Úðüò" &Js   ÂM4Å/NÍ4	NÎ Nc                 ó   — | j                   syt        | j                  j                  «       «      }|D ]´  \  }}	 t	        j
                  «       |j                  j                  «       z
  | j                   k  rŒD	 |j                  sD| j                  j                  d|«       d|_
        | j                  |t        j                  «       Œ•| j                  |t        j                   «       Œ¶ y# t        t        f$ r Y ŒÉw xY w)z)        Kill unused/idle workers
        NzWORKER TIMEOUT (pid:%s)T)r\   Úlistrð   rb   rn   r  ÚtmpÚlast_updateÚOSErrorÚ
ValueErrorÚabortedr%   ÚcriticalÚkill_workerr   ÚSIGABRTró   )r:   rZ   rr   Úworkers       r   rª   zArbiter.murder_workers@  sÑ   € ð �|Š|ØÜ�t—|‘|×)Ñ)Ó+Ó,ˆØ$ò 	6‰MˆS�&ðÜ—>‘>Ó# f§j¡j×&<Ñ&<Ó&>Ñ>À$Ç,Á,ÒNØð Oð
 —>’>Ø—‘×!Ñ!Ð";¸SÔAØ!%�”Ø× Ñ  ¤f§n¡nÕ5à× Ñ  ¤f§n¡nÕ5ñ	6øô œZÐ(ò Ùðús   º<C+Ã+C=Ã<C=c                 óÖ  — 	 	 t        j                  dt         j                  «      \  }}|sy| j                  |k(  r	d| _        �nÏd}t        j                  |«      rt        j
                  |«      }nÚt        j                  |«      rÅt        j                  |«      }	 t        j                  |«      j                  }dj                  ||«      }|t        j                  k(  r!|dz  }| j                  j                  |«       nJ|t        j                   k(  r| j                  j#                  |«       n| j                  j%                  |«       |�"|dk7  r| j                  j                  d||«       || j&                  k(  rd}t)        || j&                  «      ‚|| j*                  k(  rd	}t)        || j*                  «      ‚| j,                  j/                  |d«      }|s�ŒÜ|j0                  j3                  «        | j4                  j7                  | |«       �Œ# t        $ r dj                  |«      }Y �Œww xY w# t8        $ r(}	|	j:                  t:        j<                  k7  r‚ Y d}	~	yd}	~	ww xY w)
z7        Reap workers to avoid zombie processes
        r¢   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ÚWNOHANGr,   Ú	WIFEXITEDÚWEXITSTATUSÚWIFSIGNALEDÚWTERMSIGr   ÚSignalsr   r  rL   ró   r%   r©   rÙ   rm   rý   ÚWORKER_BOOT_ERRORr   ÚAPP_LOAD_ERRORrð   rz   r  r  rC   Ú
child_exitr  ÚerrnoÚECHILD)
r:   ÚwpidÚstatusÚexitcoder˜   Úsig_nameÚmsgrž   r  Úes
             r   r»   zArbiter.reap_workersU  s  € ð4	ØÜ!Ÿz™z¨"¬b¯j©jÓ9‘��fÙØØ—?‘? dÒ*Ø&'�D–Oð
  $�HÜ—|‘| FÔ+Ü#%§>¡>°&Ó#9™ÜŸ™¨Ô/Ü Ÿk™k¨&Ó1˜ð?Ü'-§~¡~°cÓ':×'?Ñ'?˜Hð =×CÑCØ  (ó,˜ð ¤&§.¡.Ò0ØÐ#<Ñ<˜CØ ŸH™HŸN™N¨3Õ/Ø ¤F§N¡NÒ2à ŸH™HŸM™M¨#Õ.ð !ŸH™H×,Ñ,¨SÔ1àÐ+°¸A²ØŸ™Ÿ™Ð'MØ'+¨Xô7ð   4×#9Ñ#9Ò9Ø!9˜Ü(¨°×1GÑ1GÓHÐHØ 4×#6Ñ#6Ò6Ø!6˜Ü(¨°×1DÑ1DÓEÐEà!Ÿ\™\×-Ñ-¨d°DÓ9�FÙ!Ù Ø—J‘J×$Ñ$Ô&Ø—H‘H×'Ñ'¨¨fÔ5ña øô"  *ò ?Ø'2×'9Ñ'9¸#Ó'>›Hð?ûô@ ò 	Ø�w‰wœ%Ÿ,™,Ò&Øô 'ûð	úsB   ‚*H7 ­A/H7 ÂH Â<EH7 ÈH4È0H7 È3H4È4H7 È7	I(É I#É#I(c                 óö  — t        | j                  «      | j                  k  r| j                  «        | j                  j	                  «       }t        |d„ ¬«      }t        |«      | j                  kD  rM|j                  d«      \  }}| j                  |t        j                  «       t        |«      | j                  kD  rŒMt        |«      }| j                  |k7  r7|| _
        | j                  j                  dj                  |«      d|ddœ¬«       | j                  j                  rSt!        d	„ | j"                  D «       «      }|dk\  r1| j                  j                  d
j                  |«      d|ddœ¬«       yyy)z[        Maintain the number of workers by spawning or killing
        as required.
        c                 ó    — | d   j                   S rO   r  )r	  s    r   rS   z(Arbiter.manage_workers.<locals>.<lambda>˜  s   € °°!±·±€ r=   rT   r   z{0} workerszgunicorn.workersÚgauge)ÚmetricrE   Úmtype)Úextrac              3   óF   K  — | ]  } |j                   «       xs d –— Œ y­w)r   N)Úget_backlog)r   r   s     r   r   z)Arbiter.manage_workers.<locals>.<genexpr>¦  s+   è ø€ ò 6Ø"ð +˜$×*Ñ*Ó,Ò1°Ó1ñ 6ùs   ‚!zsocket backlog: {0}zgunicorn.backlogÚ	histogramN)r  rð   r[   Úspawn_workersrb   r`   rz   r  r   rÙ   r$   r%   r^   rL   rC   Úenable_backlog_metricÚsumrv   )r:   rZ   rr   r   Úactive_worker_countÚbacklogs         r   r¤   zArbiter.manage_workers�  sS  € ô
 ˆt�|‰|Ó˜t×/Ñ/Ò/Ø×ÑÔ à—,‘,×$Ñ$Ó&ˆÜ˜Ñ&8Ô9ˆÜ�'‹l˜T×-Ñ-Ò-Ø—{‘{ 1“~‰HˆS�!Ø×Ñ˜S¤&§.¡.Ô1ô �'‹l˜T×-Ñ-Ó-ô " '›lÐØ×0Ñ0Ð4GÒGØ4GˆDÔ1Ø�H‰H�N‰N˜=×/Ñ/Ð0CÓDØ,>Ø+>Ø+2ñ"4ð ô 5ð
 �8‰8×)Ò)Üñ 6Ø&*§n¡nô6ó 6ˆGð ˜!Š|Ø—‘—‘Ð4×;Ñ;¸GÓDØ0BØ/6Ø/:ñ&<ð õ =ð ð	 *r=   c           	      óê  — | xj                   dz  c_         | j                  | j                   | j                  | j                  | j                  | j
                  dz  | j                  | j                  «      }| j                  j                  | |«       t        j                  «       }|dk7  r/||_        || j                  |<   | j                  dxx   dz  cc<   |S | j                  j                  «       D ]  }|j                  j                  «        Œ t        j                   «       |_        	 t#        j$                  d| j&                  z  «       | j                  j)                  d|j                  «       | j                  j*                  r/t-        j.                  | j                  | j                  «      |_        | j                  j3                  | |«       |j5                  «        t7        j8                  d«       | j                  j)                  d|j                  «       	 |j                  j                  «        | j                  jQ                  | |«       y # t:        $ r ‚ t<        $ r‚}| j                  j?                  dd¬	«       tA        d
|z  t6        jB                  ¬«       t6        jB                  jE                  «        t7        j8                  | jF                  «       Y d }~Œíd }~wtH        $ r¢}| j                  jK                  d«       tA        d
|z  t6        jB                  ¬«       t6        jB                  jE                  «        |jL                  st7        j8                  | jN                  «       t7        j8                  d«       Y d }~�Œ–d }~ww xY w# tH        $ r1 | j                  jS                  dtU        jV                  «       «       Y y w xY w# | j                  j)                  d|j                  «       	 |j                  j                  «        | j                  jQ                  | |«       w # tH        $ r1 | j                  jS                  dtU        jV                  «       «       Y w w xY wxY w)NrP   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+   rX   rr   rv   r;   r\   rC   r%   Úpre_forkr!   rþ   rð   r3   r  r  r  rq   r   r£   r]   rm   r}   r   r€   ÚsocketsÚ	post_forkÚinit_processr5   r³   r¯   r   r^   ÚprintÚstderrÚflushr)  r°   Ú	exceptionÚbootedr(  Úworker_exitrý   Ú	tracebackÚ
format_exc)r:   r  rr   Úsiblingr2  s        r   r  zArbiter.spawn_worker¯  s$  € Ø�Š˜1Ñ�Ø×"Ñ" 4§?¡?°D·H±H¸d¿n¹nØ#'§8¡8¨T¯\©\¸CÑ-?Ø#'§8¡8¨T¯X©Xó7ˆð 	�‰×Ñ˜$ Ô'ä�g‰g‹iˆØ�!Š8ØˆFŒJØ &ˆD�L‰L˜ÑØ�K‰KÐ)Ó*¨aÑ/Ó*ØˆJð —|‘|×*Ñ*Ó,ò 	 ˆGØ�K‰K×ÑÕð	 ô —Y‘Y“[ˆŒ
ð	9Ü×Ñ˜}¨t¯~©~Ñ=Ô>Ø�H‰H�M‰MÐ7¸¿¹ÔDØ�x‰x×"Ò"Ü!%×!4Ñ!4°T·X±X¸t¿x¹xÓ!H�”Ø�H‰H×Ñ˜t VÔ,Ø×ÑÔ!Ü�H‰H�QŒKð" �H‰H�M‰MÐ4°f·j±jÔAð9Ø—
‘
× Ñ Ô"Ø—‘×$Ñ$ T¨6Õ2øô' ò 	ØÜò 	*Ø�H‰H�N‰NÐDØ$(ð ô *ä�$˜‘(¤§¡Õ,Ü�J‰J×ÑÔÜ�H‰H�T×(Ñ(×)Ñ)ûÜò 	Ø�H‰H×ÑÐ<Ô=Ü�$˜‘(¤§¡Õ,Ü�J‰J×ÑÔØ—=’=Ü—‘˜×/Ñ/Ô0Ü�H‰H�R�LŠLûð	ûô ò 9Ø—‘× Ñ Ð!DÜ!*×!5Ñ!5Ó!7ö9ð9ûð	 �H‰H�M‰MÐ4°f·j±jÔAð9Ø—
‘
× Ñ Ô"Ø—‘×$Ñ$ T¨6Õ2øÜò 9Ø—‘× Ñ Ð!DÜ!*×!5Ñ!5Ó!7ö9ð9ýsu   Ä-CI È"6N ÉNÉ+A8K(Ë#O Ë(NË4BNÎO ÎNÎO Î7OÏOÏ'Q2Ï>6P5Ð4Q2Ð57Q/Ñ,Q2Ñ.Q/Ñ/Q2c                 óØ   — t        | j                  t        | j                  «      z
  «      D ]<  }| j	                  «        t        j                  dt        j                  «       z  «       Œ> y)z‰        Spawn new workers as needed.

        This is where a worker process leaves the main loop
        of the master process.
        rì   N)rx   r[   r  rð   r  rn   rò   Úrandom)r:   r   s     r   r<  zArbiter.spawn_workersã  sO   € ô �t×'Ñ'¬#¨d¯l©lÓ*;Ñ;Ó<ò 	.ˆAØ×ÑÔÜ�J‰J�sœVŸ]™]›_Ñ,Õ-ñ	.r=   c                 ó|   — t        | j                  j                  «       «      }|D ]  }| j                  ||«       Œ y)z^        Kill all workers with the signal `sig`
        :attr sig: `signal.SIG*` value
        N)r  rð   Úkeysr  )r:   r˜   Úworker_pidsrr   s       r   rÑ   zArbiter.kill_workersï  s:   € ô
 ˜4Ÿ<™<×,Ñ,Ó.Ó/ˆØò 	'ˆCØ×Ñ˜S #Õ&ñ	'r=   c                 óä  — 	 t        j                  ||«       |t        j                  t        j                  fv r| j
                  dxx   dz  cc<   yy# t        $ r“}|j                  t        j                  k(  rp	 | j                  j                  |«      }|j                  j                  «        | j                  j                  | |«       Y d}~y# t        t        f$ r Y Y d}~y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   rP   N)r!   Úkillr   rÙ   ró   r3   r  r+  ÚESRCHrð   rz   r  r  rC   rL  r
  )r:   rr   r˜   r2  r  s        r   r  zArbiter.kill_workerø  s¾   € ð	Ü�G‰G�C˜Ôà”v—~‘~¤v§~¡~Ð6Ñ6Ø—‘Ð,Ó-°Ñ2Ô-ð 7øäò 		Ø�w‰wœ%Ÿ+™+Ò%ðØ!Ÿ\™\×-Ñ-¨cÓ2�FØ—J‘J×$Ñ$Ô&Ø—H‘H×(Ñ(¨¨vÔ6ÜøÜ ¤'Ð*ò Ýðúàûð		ús7   ‚AA Á	C/ÁC*Á:ACÃC&ÃC*Ã%C&Ã&C*Ã*C/c                 óÆ   — ddl }| j                  j                  dd«      j                  dd«      }t        j                  j                  |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!   Úpathr_   Ú
gettempdir)r:   r[  Ú	safe_names      r   Ú_get_dirty_pidfile_pathzArbiter._get_dirty_pidfile_path  sQ   € ó 	Ø—N‘N×*Ñ*¨3°Ó4×<Ñ<¸SÀ#ÓFˆ	Ü�w‰w�|‰|˜H×/Ñ/Ó1°_ÀYÀKÈtÐ3TÓUÐUr=   c                 ó  — | j                   dk7  ry| j                  «       }t        j                  j	                  |«      sy	 t        |«      5 }t        |j                  «       j                  «       «      }ddd«       t        j                  d«       | j                  j                  d|«       t        j                  |t        j                  «       t        d«      D ].  }t        j                   d«       	 t        j                  |d«       Œ0 t        j                  |t        j$                  «       	 t        j*                  |«       y# 1 sw Y   ŒÖxY w# t"        $ r Y  Œ/w xY w# t&        t(        t"        f$ r Y ŒIw xY w# t"        $ r Y y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ì   )r-   r`  r!   r]  ÚexistsÚopenro   ÚreadÚstriprV  r%   rý   r   rÙ   rx   rn   rò   r  ró   r  ÚIOErrorr²   )r:   r*   ÚfÚold_pidr   s        r   Ú_cleanup_orphaned_dirty_arbiterz'Arbiter._cleanup_orphaned_dirty_arbiter  s;  € ð �?‰?˜aÒØà×.Ñ.Ó0ˆÜ�w‰w�~‰~˜gÔ&Øð	Ü�g“ð 0 !Ü˜aŸf™f›hŸn™nÓ.Ó/�÷0ô �G‰G�G˜QÔà�H‰H×ÑÐGÈÔQÜ�G‰G�GœVŸ^™^Ô,ä˜2“Yò 1�Ü—
‘
˜3”ðÜ—G‘G˜G QÕ'ð1ô —‘˜¤§¡Ô0ð
	Ü�I‰I�gÕ÷-0ð 0ûô ò Úðûô œG¤WÐ-ò 	Ùð	ûô ò 	Ùð	úsa   ÁE& Á(E
Á5BE& Ã7EÄ&E& Ä4F  Å
EÅE& Å	E#ÅE& Å"E#Å#E& Å&E=Å<E=Æ 	FÆFc                 ó¤  — ddl m}m} | j                  ry| j	                  «        | j                  «       | _         || j                  | j                  | j                  ¬«      | _	        | j                  j                  }t        j                  «       }|dk7  rA|| _         ||«       |t        j                  d<   | j                  j                  d||«       |S 	 | j                  j                  «        t!        j"                  d«       y# t$        $ r ‚ t&        $ r3 | j                  j)                  d«       t!        j"                  d«       Y y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.dirtyrl  rm  r/   rj  r`  r1   rC   r%   r0   Úsocket_pathr!   rþ   r"   rm   r¸   r5   r³   r¯   r°   rJ  )r:   rl  rm  rp  rr   s        r   r†   zArbiter.spawn_dirty_arbiterF  s  € ÷ 	Gà×!Ò!Øð 	×,Ñ,Ô.ð "×9Ñ9Ó;ˆÔá)Ø�H‰H�d—h‘hØ×&Ñ&ô
ˆÔð ×(Ñ(×4Ñ4ˆä�g‰g‹iˆØ�!Š8à%(ˆDÔ"á! +Ô.Ø2=ŒB�J‰JÐ.Ñ/Ø�H‰H�M‰MÐAØ˜{ô,àˆJð	Ø×Ñ×"Ñ"Ô$Ü�H‰H�Q�KøÜò 	ØÜò 	Ø�H‰H×ÑÐCÔDÜ�H‰H�RŽLð	ús   Ã/D
 Ä
AEÅEc                 óì   — | j                   sy	 t        j                  | j                   |«       y# t        $ r:}|j                  t        j
                  k(  rd| _         d| _        Y d}~yY d}~yd}~ww xY w)z\        Send a signal to the dirty arbiter.

        :attr sig: `signal.SIG*` value
        Nr   )r/   r!   rV  r  r+  rW  r0   )r:   r˜   r2  s      r   rÀ   zArbiter.kill_dirty_arbitert  sa   € ð ×%Ò%Øð	*Ü�G‰G�D×*Ñ*¨CÕ0øÜò 	*Ø�w‰wœ%Ÿ+™+Ò%Ø)*�Ô&Ø%)�×"Ñ"ô &ûð	*ús   � 0 °	A3¹+A.Á.A3c                 ó’  — | j                   sy	 t        j                  | j                   t        j                  «      \  }}|syt        j                  |«      rUt        j
                  |«      }|dk7  r| j                  j                  d||«       nd| j                  j                  d|«       nGt        j                  |«      r2t        j                  |«      }| j                  j                  d||«       d| _         d| _        y# t        $ r:}|j                  t        j                  k(  rd| _         d| _        Y d}~yY d}~y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)r/   r!   r!  r"  r#  r$  r%   r©   rm   r%  r&  rý   r0   r  r+  r,  )r:   r-  r.  r/  r˜   r2  s         r   r¼   zArbiter.reap_dirty_arbiter„  s  € ð ×%Ò%Øð	*ÜŸ:™: d×&<Ñ&<¼b¿j¹jÓI‰LˆD�&ÙØä�|‰|˜FÔ#ÜŸ>™>¨&Ó1�Ø˜q’=Ø—H‘H—N‘NÐ#OØ#'¨õ3ð —H‘H—M‘MÐ"AÀ4ÕHÜ—‘ Ô'Ü—k‘k &Ó)�Ø—‘× Ñ Ð!MØ!% sô,ð &'ˆDÔ"Ø!%ˆDÕøÜò 	*Ø�w‰wœ%Ÿ,™,Ò&Ø)*�Ô&Ø%)�×"Ñ"ô 'ûð	*ús   �3D ÁB?D Ä	EÄ+EÅEc                 óÖ   — | j                   ry| j                  j                  dkD  rC| j                  j                  r,| j                  j                  d«       | j                  «        yyy)zL        Maintain the dirty arbiter process by respawning if needed.
        Nr   zSpawning dirty arbiter...)r/   rC   r„   r…   r%   rm   r†   r@   s    r   r«   zArbiter.manage_dirty_arbiter£  sS   € ð ×!Ò!Øà�8‰8×!Ñ! AÒ%¨$¯(©(×*=Ò*=Ø�H‰H�M‰MÐ5Ô6Ø×$Ñ$Õ&ð +>Ð%r=   c                 óÔ   — | j                   j                  }t        j                  j	                  |«      s2t        j                  j                  t        j                  «       |«      }|S )z<Get the control socket path, making relative paths absolute.)rC   Úcontrol_socketr!   r]  Úisabsr_   r   r4   )r:   rp  s     r   Ú_get_control_socket_pathz Arbiter._get_control_socket_path²  sA   € à—h‘h×-Ñ-ˆÜ�w‰w�}‰}˜[Ô)ÜŸ'™'Ÿ,™,¤t§{¡{£}°kÓBˆKØÐr=   c                 ó†  — | j                   j                  r| j                  j                  d«       yddlm} | j                  «       }| j                   j                  }	  || ||«      | _        | j                  j                  «        y# t        $ r-}| j                  j                  d|«       d| _        Y d}~y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)rC   Úcontrol_socket_disabler%   r^   Úgunicorn.ctl.serverry  rw  Úcontrol_socket_moder2   r�   r°   rý   )r:   ry  rp  Úsocket_moder2  s        r   r¥   zArbiter._start_control_server¹  s¤   € ð �8‰8×*Ò*Ø�H‰H�N‰NÐ4Ô5Øõ 	<à×3Ñ3Ó5ˆØ—h‘h×2Ñ2ˆð	(Ù#6Ø�k ;ó$ˆDÔ ð × Ñ ×&Ñ&Õ(øÜò 	(Ø�H‰H×ÑÐAÀ1ÔEØ#'ˆD× Ñ ûð	(ús   Á )B
 Â
	C Â#B;Â;C c                 óÆ   — | j                   r#	 | j                   j                  «        d| _         yy# t        $ r&}| j                  j	                  d|«       Y d}~Œ3d}~ww xY w)z0        Stop the control socket server.
        z!Error stopping control server: %sN)r2   r±   r°   r%   r^   )r:   r2  s     r   râ   zArbiter._stop_control_serverÓ  s^   € ð ×ÒðGØ×$Ñ$×)Ñ)Ô+ð $(ˆDÕ ð  øô ò GØ—‘—‘ÐBÀA×FÑFûðGús   Ž1 ±	A ºAÁA )Nr   )r�   )T)>Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(  r)  r9   rv   rð   r   ÚNSIGrß   r{   r   r�   ÚdictÚdirr¨   r<   rA   rG   Úpropertyr[   r)   r�   ru   r¸   r’   r½   Ú
handle_cldrÂ   rÄ   rÇ   rÊ   rÍ   rÏ   rÓ   rÖ   rÚ   r¦   rà   r®   r§   r±   rÕ   r¿   rª   r»   r¤   r  r<  rÑ   r  r`  rj  r†   rÀ   r¼   r«   rw  r¥   râ   )r   Úxr   r   s   0000r   r   r      s�  „ ñð Ðð €Nà€Ià€IØ€Gð —[‘[€Nð F×KÑKÓM÷Oñ OØô ”v˜w¨™{Õ+õ O€Gáñ Ù>AÀ&»kôó €Iò
-
ò^!ò:ñ Ð+Ð-=Ó>€Kòò@:"òx
8ò'ò.ò`'ò"ð €Jò3òòò
ò
òò	4òò?ò?ò"7óó"ó24"òl GòDGòR6ò*8òt=ò@29òh
.ò'òò6	Vò&òP,ò\*ò *ò>	'òò(ó4	(ùõKOs   ²C4
r   )r+  r!   r&   rQ  r   r5   rn   rM  r   Úgunicorn.errorsr   r   Úgunicorn.pidfiler   Úgunicornr   r   r   r	   r
   r   rQ   r=   r   ú<module>rŒ     s=   ðó Û 	Û Û Û Û 
Û Û Û ç 6Ý $ß (Ñ (ç 1÷
E(ò E(r=   