
    \j+                         d dl mZm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	m
Z
 d dlmZmZ d dlmZ d dlmZ erd dlmZ d d	lmZ d d
lmZ  e       Z G d de      Z G d de      Z G d de      Zy)    )ABCabstractmethodN)sleeptime)Queue	FullError)loggermark_sentry_task_internal)DEFAULT_QUEUE_SIZE)TYPE_CHECKING)Any)Optional)Callablec                       e Zd ZdZeedefd              Zedd       Z	 dde	ddddfd	Z
edefd
       Zedddefd       Zy)WorkerzBase class for all workers.returnc                      y)z(Whether the worker is alive and running.N selfs    ;/root/env/lib/python3.12/site-packages/sentry_sdk/worker.pyis_alivezWorker.is_alive   s     	    Nc                      y)z5Kill the worker. It will not process any more events.Nr   r   s    r   killzWorker.kill        	r   timeoutcallbackz%Optional[Callable[[int, float], Any]]c                      y)z<Flush the worker, blocking until done or timeout is reached.Nr   r   r   r   s      r   flushzWorker.flush$   s     r   c                      y)z#Whether the worker's queue is full.Nr   r   s    r   fullzWorker.full*   r   r   Callable[[], Any]c                      y)z;Schedule a callback. Returns True if queued, False if full.Nr   r   r   s     r   submitzWorker.submit/   r   r   r   NN)__name__
__module____qualname____doc__propertyr   boolr   r   floatr!   r#   r'   r   r   r   r   r      s    %$     
 SW(O	 d   2 t  r   r   c                       e Zd ZefdeddfdZedefd       ZddZ	de
defdZdd	Zdd
Zdde
ddddfdZdefdZde
ddddfdZdddefdZddZy)BackgroundWorker
queue_sizer   Nc                 r    t        |      | _        t        j                         | _        d | _        d | _        y r)   )r   _queue	threadingLock_lock_thread_thread_for_pidr   r3   s     r   __init__zBackgroundWorker.__init__6   s+    $Z0^^%
5904r   c                     | j                   t        j                         k7  ry| j                  sy| j                  j	                         S NF)r:   osgetpidr9   r   r   s    r   r   zBackgroundWorker.is_alive<   s6    299;.||||$$&&r   c                 >    | j                   s| j                          y y r)   r   startr   s    r   _ensure_threadzBackgroundWorker._ensure_threadD       }}JJL r   r   c                    t               |z   }| j                  }|j                  j                          	 |j                  rW|t               z
  }|dk  r	 |j                  j                          y|j                  j                  |       |j                  rW	 |j                  j                          y# |j                  j                          w xY w)Nr   Fr   T)r   r5   all_tasks_doneacquireunfinished_tasksreleasewait)r   r   deadlinequeuedelays        r   _timed_queue_joinz"BackgroundWorker._timed_queue_joinH   s    6G#$$&		+(( 46)A: 
   ((*	 $$))%)8	 ((   ((*E  ((*s   B4 /(B4 4Cc                 `   | j                   5  | j                  skt        j                  | j                  d      | _        d| j
                  _        	 | j
                  j                          t        j                         | _
        d d d        y # t        $ r
 d | _        Y w xY w# 1 sw Y   y xY w)Nzsentry-sdk.BackgroundWorker)targetnameT)r8   r   r6   Thread_targetr9   daemonrC   r?   r@   r:   RuntimeErrorr   s    r   rC   zBackgroundWorker.startY   s    ZZ 	(==(//<<.K  '+#(LL&&(+-99;D(	( 	( $ ( $(DL	(	( 	(s*   AB$3BB!B$ B!!B$$B-c                 ,   t        j                  d       | j                  5  | j                  r.	 | j                  j                  t               d| _        d| _        ddd       y# t        $ r t        j                  d       Y 7w xY w# 1 sw Y   yxY w)z
        Kill worker thread. Returns immediately. Not useful for
        waiting on shutdown for events, use `flush` for that.
        z"background worker got kill requestz)background worker queue full, kill failedN)	r	   debugr8   r9   r5   
put_nowait_TERMINATORr   r:   r   s    r   r   zBackgroundWorker.killi   s    
 	9:ZZ 	,||NKK**;7  $'+$	, 	, ! NLL!LMN		, 	,s.   B
A&B
&BB
BB

Br   Optional[Any]c                     t        j                  d       | j                  5  | j                  r|dkD  r| j	                  ||       d d d        t        j                  d       y # 1 sw Y   xY w)Nz#background worker got flush request        zbackground worker flushed)r	   rY   r8   r   _wait_flushr    s      r   r!   zBackgroundWorker.flushy   sW    :;ZZ 	4}}3  (3	4 	01	4 	4s   $A$$A-c                 6    | j                   j                         S r)   r5   r#   r   s    r   r#   zBackgroundWorker.full   s    {{!!r   c                 L   t        d|      }| j                  |      s| j                  j                         dz   }t	        j
                  d|       |	 |||       | j                  ||z
        s4| j                  j                         dz   }t	        j                  d|       y y y )N皙?   %d event(s) pending on flush"flush timed out, dropped %s events)minrP   r5   qsizer	   rY   error)r   r   r   initial_timeoutpendings        r   r_   zBackgroundWorker._wait_flush   s    c7+%%o6kk'')A-GLL7A#'*))'O*CD++++-1A7K E 7r   r$   c                 z    | j                          	 | j                  j                  |       y# t        $ r Y yw xY w)NTF)rD   r5   rZ   r   r&   s     r   r'   zBackgroundWorker.submit   s:    	KK""8, 		s   . 	::c                 h   	 | j                   j                         }	 |t        u r	 | j                   j                          y 	  |        | j                   j                          t        d       m# t        $ r t        j                  dd       Y Hw xY w# | j                   j                          w xY w)NTFailed processing jobexc_infor   )r5   getr[   	task_done	Exceptionr	   ri   r   r&   s     r   rU   zBackgroundWorker._target   s    {{(H({* %%'IJ %%'!H  ! ILL!84HI %%'s)   B A/ / BB BB B1r(   r)   )r*   r+   r,   r   intr<   r.   r/   r   rD   r0   rP   rC   r   r!   r#   r_   r'   rU   r   r   r   r2   r2   5   s    ); 53 5 5 '$ ' '+ +4 +"( , 2U 2o 2 2"d "
L5 
LO 
L 
L2 t r   r2   c                       e Zd ZefdeddfdZedefd       ZddZ	ddZ
defdZdd	Z	 dd
eddddfdZ	 dd
eddddfdZdddefdZddZddZ	 d	 	 	 	 	 ddZy)AsyncWorkerr3   r   Nc                 h    d | _         || _        d | _        d | _        d | _        t               | _        y r)   )r5   _queue_size_task_task_for_pid_loopset_active_tasksr;   s     r   r<   zAsyncWorker.__init__   s1    6:%59
.2<@
8;r   c                     | j                   t        j                         k7  ry| j                  r| j                  sy| j                  j                         xr | j                  j                          S r>   )rz   r?   r@   ry   r{   
is_runningdoner   s    r   r   zAsyncWorker.is_alive   sO    ,zzzz$$&@tzz/@+@@r   c                    | j                   rv| j                   j                          t        | j                        }|D ]  }|j                           | j                  j	                          d | _        d | _         d | _        y y r)   )ry   cancelr|   r}   clearr{   rz   )r   tasks_to_canceltasks      r   r   zAsyncWorker.kill   sp    ::JJ "$"4"45O' $$&DJDJ!%D r   c                    | j                   s	 t        j                         | _        t        j                  | j
                        | _        t               5  | j                  j                  | j                               | _
        d d d        t        j                         | _        y y # 1 sw Y   $xY w# t        $ r- t        j                   d       d | _        d | _
        d | _        Y y w xY w)N)maxsizez/No event loop running, async worker not started)r   asyncioget_running_loopr{   r   rx   r5   r
   create_taskrU   ry   r?   r@   rz   rW   r	   warningr   s    r   rC   zAsyncWorker.start   s    }}*$557
%mmD4D4DE.0 H!%!7!7!GDJH%'YY[" 
H H   *PQ!
!
%)"*s*   AB4 /B(!B4 (B1-B4 43C*)C*c                 P    | j                   y| j                   j                         S )NTra   r   s    r   r#   zAsyncWorker.full   s"    ;;{{!!r   c                 >    | j                   s| j                          y y r)   rB   r   s    r   _ensure_taskzAsyncWorker._ensure_task   rE   r   r   r   r\   c                   K   | j                   r&| j                   j                         r| j                  y t        d|      }	 t	        j
                  | j                  j                         |       d {    y 7 # t        j                  $ r | j                  j                         t        | j                        z   }t        j                  d|       |	 |||       	 ||z
  }t	        j
                  | j                  j                         |       d {  7   Y y # t        j                  $ rJ | j                  j                         t        | j                        z   }t        j                  d|       Y Y y w xY ww xY ww)Nrc   rG   re   rf   )r{   r   r5   rg   r   wait_forjoinTimeoutErrorrh   lenr}   r	   rY   ri   )r   r   r   rj   rk   remaining_timeouts         r   r_   zAsyncWorker._wait_flush   s3     zz!6!6!8DKK<Oc7+	L""4;;#3#3#5OOO## 	Lkk'')C0B0B,CCGLL7A#'*L$+o$=!&&t{{'7'7'9CTUUU'' L++++-D4F4F0GGA7KL	Lsh   A F2A= 5A;6A= :F;A= =A$F"7D!DD!F!AE>:F;F=E>>FFzOptional[asyncio.Task[None]]c                    | j                   rj|dkD  re| j                  rY| j                  j                         r?t               5  | j                  j	                  | j                  ||            cd d d        S y # 1 sw Y   y xY w)Nr^   )r   r{   r   r
   r   r_   r    s      r   r!   zAsyncWorker.flush   sj     ==Ws]tzzdjj>S>S>U*, Szz--d.>.>w.QRS SSs   +A88Br$   c                     | j                          | j                  y	 | j                  j                  |       y# t        j                  $ r Y yw xY w)NFT)r   r5   rZ   r   	QueueFullr&   s     r   r'   zAsyncWorker.submit   sM    ;;	KK""8,   		s   ; AAc                 *   K    j                   y 	 	  j                   j                          d {   }|t        u r j                   j                          y t	               5  t        j                   j                  |            }d d d         j                  j                          j                   |j                   fd       t        j                  d       d {    7 # 1 sw Y   exY w7 # t
        j                  $ r Y y w xY ww)Nc                 (    j                  |       S r)   )_on_task_complete)t	queue_refr   s    r   <lambda>z%AsyncWorker._target.<locals>.<lambda>  s    1G1G91U r   r   )r5   rq   r[   rr   r
   r   r   _process_callbackr}   addadd_done_callbackr   CancelledError)r   r   r   r   s   `  @r   rU   zAsyncWorker._target
  s     ;;	!%!22{*KK))+.0 Q"..t/E/Eh/OPDQ ""&&t, !KK	&&'UVmmA&&&! 2
Q Q '%% 		s]   DC: C*&C: D
C: #%C,AC: $C8%C: ,C51C: :DDDDc                 .   K    |        d {    y 7 wr)   r   r&   s     r   r   zAsyncWorker._process_callback"  s     js   c                 X   	 |j                          ||j                          | j                  j                  |       y # t        j                  $ r Y Ct        $ r t	        j
                  dd       Y dw xY w# ||j                          | j                  j                  |       w xY w)Nrn   Tro   )	resultr   r   rs   r	   ri   rr   r}   discard)r   r   rN   s      r   r   zAsyncWorker._on_task_complete&  s    
	-KKM  !&&t, %% 	 	ALL04@	A  !&&t,s/   A   A7A: A74A: 6A77A: :/B)r(   r)   )r   r$   r   N)r   zasyncio.Task[None]rN   zOptional[asyncio.Queue[Any]]r   N)r*   r+   r,   r   rt   r<   r.   r/   r   r   rC   r#   r   r0   r_   r!   r'   rU   r   r   r   r   r   rv   rv      s    ); >3 > > A$ A A&* "d "

 ;?LL(7L	L2 ;?(7	'2 t 0 15-"- .- 
	-r   rv   )abcr   r   r   r?   r6   r   r   sentry_sdk._queuer   r   sentry_sdk.utilsr	   r
   sentry_sdk.constsr   typingr   r   r   r   objectr[   r   r2   rv   r   r   r   <module>r      s^    #  	   . > 0   hS >nv nbQ-& Q-r   