o
    wvXj-f  ã                
   @   sÈ  d Z ddlmZmZ ddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZmZmZ ddlmZ ddlmZ ddlmZ  ddl!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4 dZ5e*e6ƒZ7dZ8dZ9dZ:dZ;dZ<dZ=eddƒZ>e>e<dej?ddƒZ@e>e;d ejAddƒZBe>e:d!ejCddƒZDe>e9d"ejAddƒZEe>e9d#ejFddƒZGejHjIZJejKjIZLejMjIZNejOZOejPZPejQZQejRZRejSZSejTZTejUZUeVeQeSeRhƒZWg ZXi ZYed$d%ƒZZd&d'„ Z[d(d)„ Z\d*d+„ Z]d,d-„ Z^G d.d/„ d/e_ƒZ`dFd0d1„Zaddd2e`d3d3de'eZeWf
d4d5„ZbdFd6d7„Zcd8d9„ Zdedfd:d;„Zeeeafeddfd<d=„Zgd>d?„ ZhdFd@dA„ZidBdC„ ZjdDdE„ ZkdS )Gz‚Trace task execution.

This module defines how the task execution is traced:
errors are recorded, handlers are applied and so on.
é    )Úabsolute_importÚunicode_literalsN)Ú
namedtuple)Úwarn)ÚExceptionInfo)ÚEncodeError)Úloads)Úprepare_accept_content)Ú	safe_reprÚsafe_str)Úcurrent_appÚgroupÚsignalsÚstates)Ú_task_stack)ÚContext)ÚTask)ÚIgnoreÚInvalidTaskErrorÚRejectÚRetry)Ú	monotonicÚtext_t)Ú
get_logger)Úgethostname)Ú
mro_lookup)Úsaferepr)Úget_pickleable_etypeÚget_pickleable_exceptionÚget_pickled_exception)Ú	TraceInfoÚbuild_tracerÚ
trace_taskÚsetup_worker_optimizationsÚreset_worker_optimizationszATask %(name)s[%(id)s] succeeded in %(runtime)ss: %(return_value)sz.Task %(name)s[%(id)s] %(description)s: %(exc)sz%Task %(name)s[%(id)s] %(description)szTask %(name)s[%(id)s] %(exc)sz$Task %(name)s[%(id)s] retry: %(exc)sÚlog_policy_t)ÚformatÚdescriptionÚseverityÚ	tracebackÚmailÚrejectedé   ÚignoredzINTERNAL ERRORzraised expectedzraised unexpectedÚ
trace_ok_t)ÚretvalÚinfoÚruntimeÚretstrc                 C   s   t j| |d|id� dS )zzLog 'fmt % context' with severity 'INFO'.

    'context' is also passed in extra with key 'data' for custom handlers.
    Údata)ÚextraN)Úloggerr0   )ÚfmtÚcontext© r8   úM/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/app/trace.pyr0   x   s   r0   c                 C   s   t | j|tthdgd�S )z+Return true if the task overrides ``attr``.zcelery.app.task)ÚstopÚmonkey_patched)r   Ú	__class__ÚBaseTaskÚobject)ÚtaskÚattrr8   r8   r9   Útask_has_custom€   s   ÿrA   c                 C   s@   t |tƒrtS t |tƒrtS |jrtS | jrt || jƒrtS t	S ©N)
Ú
isinstancer   Úlog_policy_rejectr   Úlog_policy_ignoreÚinternalÚlog_policy_internalÚthrowsÚlog_policy_expectedÚlog_policy_unexpected)r?   ÚeinfoÚexcr8   r8   r9   Úget_log_policy†   s   

rM   c                 C   s   t | ddƒp|S )z8Use 'shadow' in request for the task name if applicable.ÚshadowN)Úgetattr)ÚrequestÚdefaultr8   r8   r9   Úget_task_name“   s   rR   c                   @   sV   e Zd ZdZdZddd„Z	ddd	„Zd
d„ Zdd„ Zddd„Z	ddd„Z
dd„ ZdS )r    z!Information about task execution.©Ústater/   Nc                 C   s   || _ || _d S rB   rS   )ÚselfrT   r/   r8   r8   r9   Ú__init__Ÿ   s   
zTraceInfo.__init__FTc                 C   s4   | }|j r	|j}t| jt| ji| j ||||d�S )N)Ústore_errorsÚcall_errbacks)Úignore_resultÚstore_errors_even_if_ignoredÚRETRYÚhandle_retryÚFAILUREÚhandle_failurerT   )rU   r?   ÚreqÚeagerrX   rW   r8   r8   r9   Úhandle_error_state£   s   þýûzTraceInfo.handle_error_statec                 K   ó   |   ||tƒ ¡ d S rB   ©Ú
_log_errorr   ©rU   r?   r_   Úkwargsr8   r8   r9   Úhandle_reject¯   ó   zTraceInfo.handle_rejectc                 K   rb   rB   rc   re   r8   r8   r9   Úhandle_ignore²   rh   zTraceInfo.handle_ignorec           
      K   sœ   t  ¡ \}}}zD| j}t|||fƒ}	|r!|jj|j|j|	j|d� | 	|j|j|j
|j|	¡ tjj||||	d� tt|jt||jƒt|ƒdœƒ |	W ~S ~w )zHandle retry exception.©rP   )ÚsenderrP   ÚreasonrK   )ÚidÚnamerL   )ÚsysÚexc_infor/   r   ÚbackendÚmark_as_retryrm   rL   r)   Úon_retryÚargsrf   r   Ú
task_retryÚsendr0   Ú	LOG_RETRYrR   rn   r   )
rU   r?   r_   rW   rf   Útype_Ú_Útbrl   rK   r8   r8   r9   r\   µ   s&   ÿ
ÿ
ýzTraceInfo.handle_retryc           	   	   C   s¢   t  ¡ \}}}zG| j}tƒ }t|jƒ|_t|jƒ|_|jj	|j
||j|||d� | ||j
|j|j|¡ tjj||j
||j|j||d� |  |||¡ |W ~S ~w )zHandle exception.)rP   Ústore_resultrX   )rk   Útask_idÚ	exceptionrt   rf   r)   rK   )ro   rp   r/   r   r   r}   r   Útyperq   Úmark_as_failurerm   r)   Ú
on_failurert   rf   r   Útask_failurerv   rd   )	rU   r?   r_   rW   rX   ry   rz   rL   rK   r8   r8   r9   r^   Í   s*   
ýüzTraceInfo.handle_failurec              
   C   s¢   t |jƒ }|_t|ƒt|jƒ|jt|jƒt|jƒf\}}}}}	t|||ƒ}
|j	|j
t||jƒ||||	|
j|jdœ	}tj|
j|
j ¡ ||
jrH|nd d|id� d S )N)	Úhostnamerm   rn   rL   r)   rt   rf   r'   rF   r3   )rp   r4   )r   r}   r
   r   r)   rp   rt   rf   rM   r‚   rm   rR   rn   r'   rF   r5   Úlogr(   r&   Ústrip)rU   r?   r_   rK   Úeobjr}   r)   rp   ÚsargsÚskwargsÚpolicyr7   r8   r8   r9   rd   è   s,   û
÷
þzTraceInfo._log_errorrB   )FT)T)TT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rV   ra   rg   ri   r\   r^   rd   r8   r8   r8   r9   r    š   s    

ÿ

r    c                 C   sº   d }| d urt | dƒr| j}nt ¡ \}}}nt ¡ \}}}tjdkrG|d urEz|j ¡  |jj W n	 ty;   Y nw |j	}|d us'd S d S dtj  krRdk r[n d S t 
¡  d S d S )NÚ__traceback__)é   é   r   )é   é   r   )r�   r   r   )ÚhasattrrŽ   ro   rp   Úversion_infoÚtb_frameÚclearÚf_localsÚRuntimeErrorÚtb_nextÚ	exc_clear)rL   rz   ry   r8   r8   r9   Útraceback_clear  s&   


þù	ÿr›   TFc              !      sp  t ˆdƒrˆnˆj‰|pˆj}ˆj}ˆj}ˆj‰ ˆ o ˆjo | ‰ ˆ o&| ‰ˆp+tƒ ‰ˆjj‰|j	‰
|j
‰	d‰d‰t ˆdƒrBˆj‰t ˆdƒrJˆj‰|j‰|j‰|j‰t ¡ ‰ˆj}|j‰|j‰tj‰tj‰t tj¡‰ˆj‰tjj‰tjj‰tjj‰ddl m!} |j"‰t#df‡‡‡‡fdd	„	‰d‡ ‡‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ f d
d„	}|S )a=  Return a function that traces task execution.

    Catches all exceptions and updates result backend with the
    state and result.

    If the call was successful, it saves the result to the task result
    backend, and sets the task status to `"SUCCESS"`.

    If the call raises :exc:`~@Retry`, it extracts
    the original exception, uses that as the result and sets the task state
    to `"RETRY"`.

    If the call results in an exception, it saves the exception as the task
    result, and sets the task state to `"FAILURE"`.

    Return a function that takes the following arguments:

        :param uuid: The id of the task.
        :param args: List of positional args to pass on to the function.
        :param kwargs: Keyword arguments mapping to pass on to the function.
        :keyword request: Request dict.

    Ú__call__NÚ
on_successÚafter_returnr   )ÚcanvasTc                    s2   ˆr‚ ˆ ||ƒ}|j ˆ| ˆ|d�}|||j|jfS )N)r`   rX   )ra   rT   r/   )rP   rL   ÚuuidrT   rX   ÚIÚR)ÚInfor`   Ú	propagater?   r8   r9   Úon_errori  s   
ÿzbuild_tracer.<locals>.on_errorc                    sŒ  d  } } } } }}	d }
ˆƒ }�zðz|j  W n ty#   tdƒ‚w ˆˆƒ t|p,i |d|d�}
|
jp6| }ˆr?|
j d¡nd }ˆ|
ƒ �z8ˆrRtˆ| ˆ||d� ˆ
| ˆƒ ˆrdˆ| ˆˆdœt|
d� zˆ|i |¤Ž }}t	}	W n§ t
y  } z#ˆt|ƒtdd	�}}|j|j}	}| ˆ|
¡ t|ƒ W Y d }~�nOd }~w tyÎ } z#ˆt|ƒtdd	�}}|j|j}	}| ˆ|
¡ t|ƒ W Y d }~�n!d }~w tyð } zˆ|
|| tdd
�\}}}	}t|ƒ W Y d }~nÿd }~w t�y } zˆ|
|| ƒ\}}}	}t|ƒ W Y d }~nßd }~w t�y   ‚ w z‡ˆjj}|�rtˆjjƒdk�rog g }}|D ]}ˆ|ˆd�}t|tƒ�rF| |¡ �q1| |¡ �q1|D ]}|j|f| ||d� �qO|�rnt|ˆd�j|f| ||d� nˆ|d ˆd�j|f| ||d� |
j}|�r˜ˆ|  ¡ ˆd�}|j|f|| ||d� ˆ| ||
ˆƒ W n t!�y½ } zˆ|
|| ƒ\}}}	}W Y d }~n2d }~ww t"|ˆƒ}ˆƒ | }ˆ�rÒˆ|| ||ƒ ˆ�rÛt#ˆ|d� ˆ�rët$t%| t&|
ˆƒ||dœƒ |	ˆ v�rüˆ�rüˆ|	|| ||d ƒ W zHˆ�rt'ˆ| ˆ||||	d� W ˆƒ  ˆƒ  ˆ�sEzˆƒ  ˆ	ƒ  W nâ t(t)t*f�y*   ‚  t�yD } zt+j,d|dd� W Y d }~nÁd }~ww n»ˆƒ  ˆƒ  ˆ�s~zˆƒ  ˆ	ƒ  W w  t(t)t*f�yc   ‚  t�y} } zt+j,d|dd� W Y d }~w d }~ww w zHˆ�rŽt'ˆ| ˆ||||	d� W ˆƒ  ˆƒ  ˆ�sÇzˆƒ  ˆ	ƒ  W w  t(t)t*f�y¬   ‚  t�yÆ } zt+j,d|dd� W Y d }~w d }~ww w ˆƒ  ˆƒ  ˆ�s zˆƒ  ˆ	ƒ  W w  t(t)t*f�yå   ‚  t�yÿ } zt+j,d|dd� W Y d }~w d }~ww w W n< t*�y   ‚  t�y> } z't-ˆ| ||||ƒ ˆ�r ‚ t.ˆ|ƒ}|
d u�r4ˆ|
|| ƒ\}}}}W Y d }~nd }~ww ˆ||||ƒS )Nz'Task keyword arguments is not a mappingF)rt   Úcalled_directlyrf   Úpriority)rk   r|   r?   rt   rf   )Úpidr‚   rj   T©rF   )rX   r,   ©Úapp)Ú	parent_idÚroot_idr§   r   )Úchainr¬   r­   r§   )rk   Úresult)rm   rn   Úreturn_valuer1   )rk   r|   r?   rt   rf   r/   rT   zProcess cleanup failed: %r)rp   )/ÚitemsÚAttributeErrorr   r   r­   Údelivery_infoÚgetÚsend_prerunÚSTARTEDÚSUCCESSr   ÚREJECTEDr   rT   r/   rg   r›   r   ÚIGNOREDri   r   r[   Ú	ExceptionÚBaseExceptionrP   Ú	callbacksÚlenrC   r   ÚappendÚapply_asyncr®   Úpopr   r   Úsend_successr0   ÚLOG_SUCCESSrR   Úsend_postrunÚKeyboardInterruptÚ
SystemExitÚMemoryErrorr5   ÚerrorÚ_signal_internal_errorÚreport_internal_error)r    rt   rf   rP   r¢   r¡   ÚTÚRstrr/   rT   Útask_requestÚ
time_startr­   Útask_priorityrL   r¼   ÚsigsÚgroupsÚsigÚgroup_r®   Ú_chsigry   ) ÚIGNORE_STATESr£   Ú
_does_infor«   Úbackend_cleanupr`   Úfunr‚   Úinherit_parent_priorityÚloader_cleanupÚloader_task_initÚmark_as_doner   rn   r¥   r¨   Úpop_requestÚpop_taskÚpostrun_receiversÚprerun_receiversÚpublish_resultÚpush_requestÚ	push_taskÚresultrepr_maxsizeÚ	signaturer{   Úsuccess_receiversr?   Útask_after_returnÚtask_on_successr.   Útrack_startedr8   r9   r"   r  s   
ÿÿ
ÿ
ÿÿÿ
þ€€
ÿ€€ÿ

ýý€þýÿ €ÿ

ü
ÿ€þ€
ÿ€ÿúþ
ÿ€ÿúøþ€
ÿ€ÿúþ
ÿ€ÿú€	

€úz build_tracer.<locals>.trace_taskrB   )$rA   ÚrunÚloaderrq   rY   rè   r   ÚconfÚtask_inherit_parent_priorityÚon_task_initÚon_process_cleanupr�   rž   r{   rÛ   Úprocess_cleanupÚosÚgetpidÚrequest_stackÚpushrÀ   r   r5   ÚisEnabledForÚloggingÚINFOrã   r   Útask_prerunÚ	receiversÚtask_postrunÚtask_successÚceleryrŸ   Úmaybe_signaturer]   )rn   r?   rê   r‚   rW   r£   r`   r¤   r«   r   r.   rÔ   rq   rY   rò   rŸ   r"   r8   )!rÔ   r£   rÕ   r«   rÖ   r`   r×   r‚   rØ   rÙ   rÚ   rÛ   r   rn   r¥   r¨   rÜ   rÝ   rÞ   rß   r¤   rà   rá   râ   rã   rä   r{   rå   r?   ræ   rç   r.   rè   r9   r!     sJ   !



L	 %r!   c              
   K   sŠ   |si n|}z| j du rt| j| fi |¤Ž| _ |   ||||¡W S  tyD } zt| |||||ƒ tt| |ƒdddƒW  Y d}~S d}~ww )zTrace task execution.Ng        )Ú	__trace__r!   rn   rº   rÈ   r.   rÉ   )r?   r    rt   rf   rP   ÚoptsrL   r8   r8   r9   r"     s   
 €þr"   c           	   
   C   sV   z(t  ¡ \}}}tƒ }t|jƒ|_t|jƒ|_tjj	| |||||||d� W ~dS ~w )zJSend a special `internal_error` signal to the app for outside body errors.)rk   r|   rt   rf   rP   r}   r)   rK   N)
ro   rp   r   r   r}   r   r~   r   Útask_internal_errorrv   )	r?   r    rt   rf   rP   rL   ry   rz   rK   r8   r8   r9   rÈ   %  s    ø
rÈ   c                 K   s¢   |pt  ¡ }d }	|rt|jjƒ}
|||||
d�\}}}	n|\}}}	tƒ }|j|||ddœfi |	p1i ¤Ž t|j|  |||||d�\}}}}|rLd||fS d||fS )N©ÚacceptF©rt   rf   r‚   Úis_eagerrª   r,   r   )	r   Ú_get_current_objectr	   rë   Úaccept_contentr   Úupdater"   Útasks)rn   r    rP   ÚbodyÚcontent_typeÚcontent_encodingr   r«   Úextra_requestÚembedr  rt   rf   r‚   r¢   r¡   rÊ   rË   r8   r8   r9   Ú_trace_task_ret:  s&   ÿ
þý

ÿr  c	                 K   s”   |st n|}d }
|\}}}|r|||||d�\}}}
n|\}}}
|j|||ddœfi |
p-i ¤Ž ||   ||||¡\}}}}|rEd||fS d||fS )Nr   Fr  r,   r   )Ú
_localizedr  rý   )r?   r    rP   r  r	  r
  r   Ú_locr‚   ry   r  r  r  rt   rf   r¢   r¡   rÊ   rË   r8   r8   r9   Ú_fast_trace_taskS  s$   
ÿ
þýÿr  c                 C   sR   t  ¡ \}}}z| j |d¡}t|||fdd�}ttd ||j¡ƒƒ |W ~S ~w )NÚpickleTr©   z)Exception raised outside body: {0!r}:
{1})	ro   rp   rq   Úprepare_exceptionr   r   ÚRuntimeWarningr&   r)   )r?   rL   Ú_typeÚ_valueÚ_tbrp   r8   r8   r9   rÉ   i  s   ÿÿrÉ   c                 C   sf   |pt ƒ }tƒ  |  ¡  |  ¡  |  ¡  | jt| jjƒ|gt	dd…< t
addlm} t
|_| ¡  dS )z#Setup worker related optimizations.Nr   rj   )r   Ú_install_stack_protectionÚset_currentÚset_defaultÚfinalizeÚ_tasksr	   rë   r  r  r  Útrace_task_retÚcelery.workerrP   Ú__optimize__)r«   r‚   Úrequest_moduler8   r8   r9   r#   v  s   

ýr#   c                  C   s`   t azttdƒ W n	 ty   Y nw zt d¡t_W n	 ty$   Y nw ddl	m
}  t | _dS )z*Reset previously configured optimizations.Ú_stackprotectedúBaseTask.__call__r   rj   N)r  r  Údelattrr=   r²   Ú_patchedrÀ   rœ   ÚKeyErrorr  rP   )r  r8   r8   r9   r$   ™  s   ÿÿ
r$   c                     s:   t tddƒstj td< ‰ ‡ fdd„} | t_dt_d S d S )Nr   Fr!  c                    sT   | j }|j}|r|jst|ƒdkr|jsd|_| j|i |¤ŽS ˆ | g|¢R i |¤ŽS )Nr,   )rò   ÚtopÚ
_protectedr½   r¦   ré   )rU   rt   rf   Ústackr_   ©Úorigr8   r9   Ú__protected_call__º  s   
z5_install_stack_protection.<locals>.__protected_call__T)rO   r=   rœ   r#  r   )r*  r8   r(  r9   r  ©  s   
ôr  rB   )lrŒ   Ú
__future__r   r   rõ   rð   ro   Úcollectionsr   Úwarningsr   Úbilliard.einfor   Úkombu.exceptionsr   Úkombu.serializationr   Úloads_messager	   Úkombu.utils.encodingr
   r   rû   r   r   r   r   Úcelery._stater   Úcelery.app.taskr   r   r=   Úcelery.exceptionsr   r   r   r   Úcelery.fiver   r   Úcelery.utils.logr   Úcelery.utils.nodenamesr   Úcelery.utils.objectsr   Úcelery.utils.safereprr   Úcelery.utils.serializationr   r   r   Ú__all__r‰   r5   rÂ   ÚLOG_FAILUREÚLOG_INTERNAL_ERRORÚLOG_IGNOREDÚLOG_REJECTEDrw   r%   ÚWARNrD   rö   rE   ÚCRITICALrG   rI   ÚERRORrJ   r÷   rv   rµ   rù   rÃ   rú   rÁ   r¶   r·   r¹   r¸   r[   r]   ÚEXCEPTION_STATESÚ	frozensetrÔ   r  r#  r.   r0   rA   rM   rR   r>   r    r›   r!   r"   rÈ   r  r  r  rÉ   r#   r$   r  r8   r8   r8   r9   Ú<module>   s¨   þÿÿÿ

j
ý 
|
ÿ
þ
#