Ë
    qûàgÞS  ã                   ó˜   — 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g Z	g 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d„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d(d„Z'd„ Z(d)d„Z)d„ Z*d „ Z+d!„ Z,d"„ Z-d#„ Z.d$„ Z/d%„ Z0d&„ Z1d'„ Z2yc c}}}} w )*Ú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     úN/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/gunicorn/arbiter.pyú	<genexpr>zArbiter.<genexpr>-   sI   è ø€ ò Ø6:Ø��ˆ8�uÒ  a¡¨C¢ô 
”˜Ó	  Q R §¡Ó 0Ô1ñùs   ‚=?c                 ó’  — t         t        j                  d<   d | _        d | _        d | _        | j                  |«       d | _        d| _        d| _	        d| _
        d| _        d| _        t        j                  «       }t        j                   d d  }|j#                  dt        j$                  «       ||t        j$                  dœ| _        y )Nr
   Fr   ÚMaster)ÚargsÚcwdr   )r
   ÚosÚenvironÚ_num_workersÚ _last_logged_active_worker_countÚlogÚsetupÚpidfiler   Ú
worker_ageÚ
reexec_pidÚ
master_pidÚmaster_namer   ÚgetcwdÚsysÚargvÚinsertÚ
executableÚ	START_CTX)ÚselfÚappr   r   s       r   Ú__init__zArbiter.__init__2   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_workersN   s   € Ø× Ñ Ð r1   c                 ód   — | j                   }|| _         | j                  j                  | ||«       y r3   )r   ÚcfgÚnworkers_changed)r.   ÚvalueÚ	old_values      r   Ú_set_num_workerszArbiter._set_num_workersQ   s+   € Ø×%Ñ%ˆ	Ø!ˆÔØ�‰×!Ñ! $¨¨yÕ9r1   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)Úformatr9   )r   Úconfigr9   s      r   r   z Arbiter.setup.<locals>.<genexpr>i   s-   è ø€ ò ;á!�F˜Eð ×#Ñ# F¨E¯K©K×8ñ;ùs   ‚)+c                 ó   — | d   S ©Né   © )Úsettings    r   ú<lambda>zArbiter.setup.<locals>.<lambda>m   s
   € ¨g°a©j€ r1   ©Úkey)r/   r7   r!   Úlogger_classr   r   Úreopen_filesÚworker_classÚaddressÚworkersÚnum_workersÚtimeoutÚ	proc_nameÚdebugr@   ÚjoinÚsortedÚsettingsÚitemsÚenvÚpreload_appÚwsgi)r.   r/   ÚkÚvs       r   r"   zArbiter.setupW   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ð  r1   c                 ó‚  — | j                   j                  dt        «       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&        j,                  t&        j,                  |z   «      }n[| j                  rOg }t        j                  j/                  d«      j1                  d	«      D ]  }|j3                  t        |«      «       Œ t5        j6                  | j                  | j                   |«      | _        d	j9                  | j$                  D �cg c]  }t;        |«      ‘Œ c}«      }| j                   j=                  d
«       | j                   j                  d|| j                  «       | j                   j                  d| j                  j>                  «       t'        j@                  d| j                   «       tC        | jD                  d«      r0| jD                  jG                  | j                  | j                   «       | j                  jI                  | «       yc c}w )zS        Initialize the arbiter. Start listening and set pidfile if needed.
        zStarting gunicorn %sr=   z.2zMaster.2Nr   TÚGUNICORN_FDú,zArbiter bootedzListening at: %s (%s)zUsing worker: %sz&READY=1
STATUS=Gunicorn arbiter bootedÚcheck_config)%r!   Úinfor	   r   r   ÚintÚgetr&   rQ   r'   ÚgetpidÚpidr7   r#   r   ÚcreateÚon_startingÚinit_signalsÚ	LISTENERSr   Ú
listen_fdsÚrangeÚSD_LISTEN_FDS_STARTÚpopÚsplitÚappendr   Úcreate_socketsrS   ÚstrrR   Úworker_class_strÚ	sd_notifyÚhasattrrL   r_   Ú
when_ready)r.   ÚpidnameÚfdsri   ÚfdÚlnrÚlisteners_strs          r   ÚstartzArbiter.startw   sD  € ð 	�‰�‰Ð,¬kÔ:àœ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Õ'ð(ô "×0Ñ0°·±¸4¿8¹8ÀSÓIˆDŒNàŸ™°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Ô>à�‰×Ñ˜DÕ!ùò "Fs   È/L<c                 óÚ  — | j                   D ]  }t        j                  |«       Œ t        j                  «       x| _         }|D ],  }t	        j
                  |«       t	        j                  |«       Œ. | 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)ÚPIPEr   ÚcloseÚpiper   Úset_non_blockingÚclose_on_execr!   ÚSIGNALSr   ÚSIGCHLDÚhandle_chld)r.   ÚpÚpairÚss       r   rg   zArbiter.init_signals¨   s²   € ð —‘ò 	ˆAÜ�H‰H�Q�Kð	ô Ÿ7™7›9Ð$ˆŒ	�DØò 	"ˆAÜ×!Ñ! !Ô$Ü×Ñ˜qÕ!ð	"ð 	�‰×ÑÔ ð —‘ò 	*ˆAÜ�M‰M˜!˜TŸ[™[Õ)ð	*ä�‰”f—n‘n d×&6Ñ&6Õ7r1   c                 óŒ   — t        | j                  «      dk  r,| j                  j                  |«       | j                  «        y y )Né   )ÚlenÚ	SIG_QUEUErn   Úwakeup©r.   ÚsigÚframes      r   r   zArbiter.signal¾   s3   € Üˆt�~‰~Ó Ò"Ø�N‰N×!Ñ! #Ô&Ø�K‰K�Mð #r1   c                 óh  — | j                  «        t        j                  d| j                  z  «       	 | j	                  «        	 | j                  «        | j                  r| j                  j                  d«      nd}|€1| j                  «        | j                  «        | j	                  «        Œm|| j                  vr| j                  j                  d|«       Œ˜| j                  j                  |«      }t        | d|z  d«      }|s| j                  j                  d|«       Œâ| j                  j                  d|«        |«        | j!                  «        �Œ# t"        t$        f$ r | j'                  «        Y yt(        $ r1}| j'                  |j*                  |j,                  ¬	«       Y d}~yd}~wt.        $ r ‚ t0        $ rl | j                  j                  d
d¬«       | j3                  d«       | j4                  �| j4                  j7                  «        t9        j:                  d«       Y yw xY w)zMain master loop.úmaster [%s]Tr   NzIgnoring unknown signal: %sz	handle_%szUnhandled signal: %szHandling signal: %s)ÚreasonÚexit_statusz Unhandled exception in main loop©Úexc_infoFéÿÿÿÿ)rz   r   Ú_setproctitlerQ   Úmanage_workersÚmaybe_promote_masterrŠ   rl   ÚsleepÚmurder_workersÚ	SIG_NAMESr!   r`   rb   r   Úerrorr‹   ÚStopIterationÚKeyboardInterruptÚhaltr   r‘   r’   Ú
SystemExitÚ	ExceptionÚstopr#   Úunlinkr)   Úexit)r.   r�   ÚsignameÚhandlerÚinsts        r   ÚrunzArbiter.runÃ   sµ  € à�
‰
ŒÜ×Ñ˜=¨4¯>©>Ñ9Ô:ð%	Ø×ÑÔ!àØ×)Ñ)Ô+à/3¯~ª~�d—n‘n×(Ñ(¨Ô+À4�Ø�;Ø—J‘J”LØ×'Ñ'Ô)Ø×'Ñ'Ô)Øà˜dŸn™nÑ,Ø—H‘H—M‘MÐ"?ÀÔEØàŸ.™.×,Ñ,¨SÓ1�Ü! $¨°gÑ(=¸tÓD�ÙØ—H‘H—N‘NÐ#9¸7ÔCØØ—‘—‘Ð3°WÔ=Ù”	Ø—‘”ñ+ øô, Ô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'E ÅH1Å<H1Æ'F0Æ0A>H1È0H1c                 óD   — | j                  «        | j                  «        y)zSIGCHLD handlingN)Úreap_workersr‹   rŒ   s      r   rƒ   zArbiter.handle_chldï   s   € à×ÑÔØ�‰�r1   c                 óp   — | j                   j                  d| j                  «       | j                  «        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!   r`   r'   Úreloadr4   s    r   Ú
handle_hupzArbiter.handle_hupô   s%   € ð 	�‰�‰�m T×%5Ñ%5Ô6Ø�‰�r1   c                 ó   — t         ‚)zSIGTERM handling)r�   r4   s    r   Úhandle_termzArbiter.handle_termþ   s   € äÐr1   c                 ó0   — | j                  d«       t        ‚)zSIGINT handlingF©r¢   r�   r4   s    r   Ú
handle_intzArbiter.handle_int  ó   € à�	‰	�%ÔÜÐr1   c                 ó0   — | j                  d«       t        ‚)zSIGQUIT handlingFr±   r4   s    r   Úhandle_quitzArbiter.handle_quit  r³   r1   c                 óN   — | xj                   dz  c_         | j                  «        y)zR        SIGTTIN handling.
        Increases the number of workers by one.
        rD   N©rO   r—   r4   s    r   Úhandle_ttinzArbiter.handle_ttin  s!   € ð
 	×Ò˜AÑÕØ×ÑÕr1   c                 ón   — | j                   dk  ry| xj                   dz  c_         | j                  «        y)zR        SIGTTOU handling.
        Decreases the number of workers by one.
        rD   Nr·   r4   s    r   Úhandle_ttouzArbiter.handle_ttou  s2   € ð
 ×Ñ˜qÒ ØØ×Ò˜AÑÕØ×ÑÕr1   c                 óv   — | j                   j                  «        | j                  t        j                  «       y)zU        SIGUSR1 handling.
        Kill all workers by sending them a SIGUSR1
        N)r!   rK   Úkill_workersr   ÚSIGUSR1r4   s    r   Úhandle_usr1zArbiter.handle_usr1  s&   € ð
 	�‰×ÑÔØ×Ñœ&Ÿ.™.Õ)r1   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)Úreexecr4   s    r   Úhandle_usr2zArbiter.handle_usr2&  s   € ð 	�‰�r1   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)	r7   Údaemonr!   r`   rO   r¼   r   ÚSIGTERMrR   r4   s    r   Úhandle_winchzArbiter.handle_winch/  sI   € à�8‰8�?Š?Ø�H‰H�M‰MÐ4Ô5Ø ˆDÔØ×ÑœfŸn™nÕ-à�H‰H�N‰NÐ=Õ>r1   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   r=   r�   )r&   r   Úgetppidr!   r`   r'   r7   rQ   r   r#   Úrenamer   r–   r4   s    r   r˜   zArbiter.maybe_promote_master8  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¯~©~Ñ=Õ>ð +r1   c                 óÒ   — 	 t        j                  | j                  d   d«       y# t        $ r7}|j                  t        j
                  t        j                  fvr‚ Y d}~yd}~ww xY w)z;        Wake up the arbiter by writing to the PIPE
        rD   ó   .N)r   Úwriter|   ÚOSErrorÚerrnoÚEAGAINÚEINTR)r.   Úes     r   r‹   zArbiter.wakeupI  sN   € ð	Ü�H‰H�T—Y‘Y˜q‘\ 4Õ(øÜò 	Ø�w‰wœuŸ|™|¬U¯[©[Ð9Ñ9Øô :ûð	ús   ‚#& ¦	A&¯-A!Á!A&Nc                 ón  — | 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)r¢   r!   r`   rœ   r'   r#   r£   r7   Úon_exitr)   r¤   )r.   r‘   r’   Úlog_funcs       r   rŸ   zArbiter.haltS  s‚   € à�	‰	Œà$/°1Ò$4�4—8‘8—=’=¸$¿(¹(¿.¹.ˆÙÐ$ d×&6Ñ&6Ô7ØÐÙ�\ 6Ô*à�<‰<Ð#Ø�L‰L×ÑÔ!Ø�‰×Ñ˜ÔÜ�‰�Õr1   c                 óÒ  — 	 t        j                   | j                  d   gg g d«      }|d   syt        j                  | j                  d   d«      r&	 t        j                  | j                  d   d«      rŒ%yy# t        $ rG}t        |d|j                  d   «      }|t        j                  t        j                  fvr‚ Y d}~yd}~wt        $ r t        j                  «        Y yw xY w)zm        Sleep until PIPE is readable or we timeout.
        A readable PIPE means a signal occurred.
        r   g      ð?NrD   rÍ   )Úselectr|   r   ÚreadrÌ   r   r   rÍ   rÎ   rÏ   rž   r)   r¤   )r.   ÚreadyrÐ   Úerror_numbers       r   r™   zArbiter.sleepa  s´   € ð
	Ü—M‘M 4§9¡9¨Q¡< .°"°b¸#Ó>ˆEØ˜’8ØÜ—'‘'˜$Ÿ)™) A™,¨Ô*Øô —'‘'˜$Ÿ)™) A™,¨×*øäò 	ä" 1 g¨q¯v©v°a©yÓ9ˆLØ¤E§L¡L´%·+±+Ð#>Ñ>Øô ?ûä ò 	Ü�H‰HŽJð	ús#   ‚+A8 ®AA8 Á8	C&Â=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                  |«       | j                  rPt        j                  «       |k  r9t        j                  d«       | j                  rt        j                  «       |k  rŒ9| j                  t        j                   «       y)z°        Stop workers

        :attr graceful: boolean, If True (the default) workers will be
        killed gracefully  (ie. trying to wait for the current connection)
        r   çš™™™™™¹?N)r%   r&   r   r7   Ú
reuse_portr   Úclose_socketsrh   r   rÄ   ÚSIGQUITÚtimeÚgraceful_timeoutr¼   ÚWORKERSr™   ÚSIGKILL)r.   Úgracefulr£   r�   Úlimits        r   r¢   zArbiter.stopt  så   € ð �O‰O˜tŸ™Ö3°!Ô3ò (Ø—L‘LÐ ò(à—H‘H×'Ñ'Ð'ð 	ô
 	×Ñ˜4Ÿ>™>¨6Ô2àˆŒÜ�n‰nˆÙÜ—.‘.ˆCÜ—	‘	“˜dŸh™h×7Ñ7Ñ7ˆà×Ñ˜#Ôà�lŠlœtŸy™y›{¨UÒ2Ü�J‰J�sŒOð �lŠlœtŸy™y›{¨UÓ2ð 	×Ñœ&Ÿ.™.Õ)r1   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.r=   Ú
LISTEN_PIDÚ
LISTEN_FDSr^   c              3   óN   K  — | ]  }t        |j                  «       «      –— Œ y ­wr3   )rp   Úfileno)r   rx   s     r   r   z!Arbiter.reexec.<locals>.<genexpr>©  s    è ø€ ò .=Ø&)”�C—J‘J“L×!ñ.=ùs   ‚#%r]   r   r   )r%   r!   Úwarningr&   r   rc   Úforkr7   Úpre_execÚenv_origÚcopyrp   r   r‰   rh   rS   Úchdirr-   Ú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ÕFr1   c                 óR  — | 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(                  j/                  | j0                  «       t3        j4                  d| j6                  z  «       t9        | j                   j:                  «      D ]  }| j=                  «        Œ | j?                  «        y # t        $ r Y �Œsw xY wc c}w )Nr^   zListening at: %sr�   ) r7   rM   rW   rì   r   r   ÚKeyErrorr/   r¬   r"   r!   rK   rh   r}   r   ro   rS   rp   r`   Ú	on_reloadr#   r£   r   re   rd   r   r–   rQ   rj   rN   Úspawn_workerr—   )r.   Úold_addressrZ   rx   ry   r   s         r   r¬   zArbiter.reload±  sù  € Ø—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Ø×ÑÕð	 ð 	×ÑÕøôQ  ò Úðüò" &Js   Á4JÅJ$Ê	J!Ê J!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)rP   Úlistrà   rV   rÞ   Ú	monotonicÚtmpÚlast_updaterÌ   Ú
ValueErrorÚabortedr!   ÚcriticalÚkill_workerr   ÚSIGABRTrá   )r.   rN   rd   Ú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| _        �nX|dz	  }|dk7  r| j                  j                  d||«       || j                  k(  rd}t        || j                  «      ‚|| j                  k(  rd}t        || j                  «      ‚|dkD  r| j                  j                  d||«       nj|dkD  re	 t        j                  |«      j                  }d	j                  ||«      }|t        j                  k(  r|d
z  }| j                  j                  |«       | j                  j!                  |d«      }|s�Œe|j"                  j%                  «        | j&                  j)                  | |«       �Œœ# t        $ r dj                  |«      }Y Œ¹w xY w# t*        $ r(}|j,                  t,        j.                  k7  r‚ Y d}~yd}~ww xY w)z7        Reap workers to avoid zombie processes
        r•   r   é   z#Worker (pid:%s) exited with code %szWorker failed to boot.zApp failed to load.z$Worker (pid:%s) exited with code %s.zcode {}zWorker (pid:{}) was sent {}!z Perhaps out of memory?N)r   ÚwaitpidÚWNOHANGr%   r!   rœ   ÚWORKER_BOOT_ERRORr   ÚAPP_LOAD_ERRORr   ÚSignalsr   rú   r@   rá   rà   rl   rø   r}   r7   Ú
child_exitrÌ   rÍ   ÚECHILD)	r.   ÚwpidÚstatusÚexitcoder‘   Úsig_nameÚmsgrÿ   rÐ   s	            r   rª   zArbiter.reap_workersý  sÃ  € ð1	ØÜ!Ÿz™z¨"¬b¯j©jÓ9‘��fÙØØ—?‘? dÒ*Ø&'�D–Oð
  &¨™{�HØ 1’}ØŸ™Ÿ™Ð'LÈdÐT\Ô]Ø 4×#9Ñ#9Ò9Ø!9˜Ü(¨°×1GÑ1GÓHÐHØ 4×#6Ñ#6Ò6Ø!6˜Ü(¨°×1DÑ1DÓEÐEà !’|ð Ÿ™Ÿ™Ð'MØ'+¨Xõ7à !šð@Ü'-§~¡~°fÓ'=×'BÑ'B˜Hð =×CÑCØ  (ó,˜ð "¤V§^¡^Ò3ØÐ#<Ñ<˜CØŸ™Ÿ™ sÔ+à!Ÿ\™\×-Ñ-¨d°DÓ9�FÙ!Ù Ø—J‘J×$Ñ$Ô&Ø—H‘H×'Ñ'¨¨fÔ5ñ[ øô>  *ò @Ø'0×'7Ñ'7¸Ó'?šHð@ûô ò 	Ø�w‰wœ%Ÿ,™,Ò&Øô 'ûð	úsB   ‚*F? ­B5F? Ã#F ÄBF? ÆF<Æ9F? Æ;F<Æ<F? Æ?	G0ÇG+Ç+G0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  r8|| _
        | j                  j                  dj                  |«      d|ddœ¬«       y	y	)
z[        Maintain the number of workers by spawning or killing
        as required.
        c                 ó    — | d   j                   S rC   )Úage)Úws    r   rG   z(Arbiter.manage_workers.<locals>.<lambda>=  s   € °°!±·±€ r1   rH   r   z{0} workerszgunicorn.workersÚgauge)Úmetricr9   Úmtype)ÚextraN)r‰   rà   rO   Úspawn_workersrV   rT   rl   rý   r   rÄ   r    r!   rR   r@   )r.   rN   rd   r   Úactive_worker_counts        r   r—   zArbiter.manage_workers4  së   € ô
 ˆ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ð Hr1   c           	      ó¬  — | xj                   dz  c_         | j                  | j                   | j                  | j                  | j                  | j
                  dz  | j                  | j                  «      }| j                  j                  | |«       t        j                  «       }|dk7  r||_        || j                  |<   |S | j                  j                  «       D ]  }|j                  j                  «        Œ t        j                  «       |_        	 t!        j"                  d| j$                  z  «       | j                  j'                  d|j                  «       | j                  j)                  | |«       |j+                  «        t-        j.                  d«       | j                  j'                  d|j                  «       	 |j                  j                  «        | j                  jG                  | |«       y # t0        $ r ‚ t2        $ r‚}| j                  j5                  dd¬«       t7        d	|z  t,        j8                  ¬
«       t,        j8                  j;                  «        t-        j.                  | j<                  «       Y d }~Œíd }~wt>        $ r_ | j                  jA                  d«       |jB                  st-        j.                  | jD                  «       t-        j.                  d«       Y �ŒWw xY w# t>        $ r1 | j                  jI                  dtK        jL                  «       «       Y y w xY w# | j                  j'                  d|j                  «       	 |j                  j                  «        | j                  jG                  | |«       w # t>        $ r1 | j                  jI                  dtK        jL                  «       «       Y w w xY wxY w)NrD   g       @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$   rL   rd   rh   r/   rP   r7   r!   Úpre_forkr   rê   rà   Úvaluesrø   r}   rc   r   r–   rQ   r`   Ú	post_forkÚinit_processr)   r¤   r    r   rR   ÚprintÚstderrÚflushr  r¡   Ú	exceptionÚbootedr  Úworker_exitré   Ú	tracebackÚ
format_exc)r.   rÿ   rd   ÚsiblingrÐ   s        r   ró   zArbiter.spawn_workerJ  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˜ÑØˆJð —|‘|×*Ñ*Ó,ò 	 ˆGØ�K‰K×ÑÕð	 ô —Y‘Y“[ˆŒ
ð	9Ü×Ñ˜}¨t¯~©~Ñ=Ô>Ø�H‰H�M‰MÐ7¸¿¹ÔDØ�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×ÑÐ<Ô=Ø—=’=Ü—‘˜×/Ñ/Ô0Ü�H‰H�R�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ýso   ÄB	G= Ç6K: Ç=K7ÈA8JÊL7 ÊA'K7Ë3L7 Ë6K7Ë7L7 Ë:7L4Ì3L4Ì7'OÍ6NÎOÎ7OÏOÏOÏO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)rj   rO   r‰   rà   ró   rÞ   r™   Úrandom)r.   r   s     r   r  zArbiter.spawn_workersx  sO   € ô �t×'Ñ'¬#¨d¯l©lÓ*;Ñ;Ó<ò 	.ˆAØ×ÑÔÜ�J‰J�sœVŸ]™]›_Ñ,Õ-ñ	.r1   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_pidsrd   s       r   r¼   zArbiter.kill_workers„  s:   € ô
 ˜4Ÿ<™<×,Ñ,Ó.Ó/ˆØò 	'ˆCØ×Ñ˜S #Õ&ñ	'r1   c                 óp  — 	 t        j                  ||«       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
         N)r   ÚkillrÌ   rÍ   ÚESRCHrà   rl   rø   r}   r7   r#  rñ   )r.   rd   r�   rÐ   rÿ   s        r   rý   zArbiter.kill_worker�  s�   € ð	Ü�G‰G�C˜ÕøÜò 		Ø�w‰wœ%Ÿ+™+Ò%ðØ!Ÿ\™\×-Ñ-¨cÓ2�FØ—J‘J×$Ñ$Ô&Ø—H‘H×(Ñ(¨¨vÔ6ÜøÜ ¤'Ð*ò Ýðúàûð		ús3   ‚ ™	B5¢B0Á ABÂB,Â%B0Â+B,Â,B0Â0B5)Nr   )T)3Ú__name__Ú
__module__Ú__qualname__Ú__doc__r  r  r-   rh   rà   r|   rŠ   rm   r   r   r�   ÚdictÚdirr›   r0   r5   r;   ÚpropertyrO   r"   rz   rg   r¨   rƒ   r­   r¯   r²   rµ   r¸   rº   r¾   rÁ   rÅ   r˜   r‹   rŸ   r™   r¢   rÀ   r¬   rš   rª   r—   ró   r  r¼   rý   )r   Úxr   r   s   0000r   r   r      s?  „ ñð Ðð €Nà€Ià€IØ€GØ€Dð €IàE×KÑKÓM÷Oñ OØô ”v˜w¨™{Õ+õ O€Gáñ Ù>AÀ&»kôó €Iò

ò8!ò:ñ Ð+Ð-=Ó>€Kòò@/"òb8ò,ò
*òXò
òòò
ò
òò*òò?ò?ò"óòó&*ò6 GòD5òn6ò*5òn5ò,,9ò\
.ò'óùõEOs   ªC
r   )rÍ   r   r(  rÕ   r   r)   rÞ   r$  Úgunicorn.errorsr   r   Úgunicorn.pidfiler   Úgunicornr   r   r   r	   r
   r   rE   r1   r   ú<module>r:     s:   ðó Û 	Û Û Û Û 
Û Û ç 6Ý $ß (Ñ (ç 1÷K
ò K
r1   