
    `f«                        d Z ddlZddlZddlZddl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mZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddl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#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? dZ@ eAdh          ZB e7eC          ZDdZE edd          ZFdZGdZHd ZI G d deJ          ZKd  ZL G d! d"          ZM G d# d$          ZN G d% d&eMeN          ZOeOZP G d' d(eM          ZQ G d) d*eQeN          ZR G d+ d,eO          ZSdS )-zResult backend base classes.

- :class:`BaseBackend` defines the interface.

- :class:`KeyValueStoreBackend` is a common base class
    using K/V semantics like _get and _put.
    N)
namedtuple)datetime	timedelta)partial)WeakValueDictionary)ExceptionInfo)dumpsloadsprepare_accept_content)registry)bytes_to_strensure_bytes)maybe_sanitize_url)current_appgroupmaybe_signaturestates)get_current_task)Context)BackendGetMetaErrorBackendStoreError
ChordErrorImproperlyConfiguredNotRegisteredSecurityErrorTaskRevokedErrorTimeoutError)GroupResult
ResultBase	ResultSetallow_join_resultresult_from_tuple)	BufferMap)LRUCachearity_greater)
get_logger)create_exception_clsensure_serializableget_pickleable_exceptionget_pickled_exceptionraise_with_context) get_exponential_backoff_interval)BaseBackendKeyValueStoreBackendDisabledBackendpicklei    pending_results_t)concreteweakzU
No result backend is configured.
Please see the documentation for more information.
z
Starting chords requires a result backend to be configured.

Note that a group chained with a task is also upgraded to be a chord,
as this pattern requires synchronization.

Result backends that supports chords: Redis, Database, Memcached, and more.
c                 8     | |dt          j                    i|S )zReturn an unpickled backend.app)r   _get_current_object)clsargskwargss      F/var/www/html/env/lib/python3.11/site-packages/celery/backends/base.pyunpickle_backendr;   ?   s%    3F+9;;FvFFF    c                        e Zd Zd ZexZxZZdS )	_nulldictc                     d S N )selfakws      r:   ignorez_nulldict.ignoreE       r<   N)__name__
__module____qualname__rE   __setitem__update
setdefaultrA   r<   r:   r>   r>   D   s.           )/.K.&:::r<   r>   c                     | dS | j         S NF)ignore_resultrequests    r:   _is_request_ignore_resultrR   K   s    u  r<   c                      e Zd Zej        Zej        Zej        ZeZdZdZ	dZ
dZdddddZ	 	 d=dZd>d	Zd
 Zddej        fdZddddej        fdZd Zdddej        fdZdddej        fdZd?dZd?dZd?dZd Zd Zd Zd Zd Z d Z!d Z"d?dZ#d?dZ$d Z%d Z&	 	 d@dZ'd  Z(	 dAd!Z)d" Z*d# Z+d$ Z,e,Z-d% Z.d& Z/d' Z0d( Z1d) Z2dBd*Z3d+ Z4d, Z5dBd-Z6dBd.Z7d/ Z8d0 Z9d1 Z:d2 Z;d3 Z<d4 Z=d5 Z>d6 Z?dCd7Z@d8 ZAd9 ZBd?d:ZCdDd<ZDdS )EBackendNFT   r      )max_retriesinterval_startinterval_stepinterval_maxc                 f   || _         | j         j        }	|p|	j        | _        t          j        | j                 \  | _        | _        | _        |p|	j	        }
|
dk    rt                      nt          |
          | _        |                     ||          | _        ||	j        n|| _        | j        |	j        n| j        | _        t%          | j                  | _        |	                    dd          | _        |	                    dd          | _        |	                    dd          | _        |	                    d	t/          d
                    | _        |	                    dd          | _        t5          i t7                                | _        t;          t<                    | _        || _         d S )N)limitresult_backend_always_retryF+result_backend_max_sleep_between_retries_msi'  ,result_backend_base_sleep_between_retries_ms
   result_backend_max_retriesinfresult_backend_thread_safe)!r5   confresult_serializer
serializerserializer_registry	_encoderscontent_typecontent_encodingencoderresult_cache_maxr>   r$   _cacheprepare_expiresexpiresresult_accept_contentacceptaccept_contentr   getalways_retrymax_sleep_between_retries_msbase_sleep_between_retries_msfloatrW   thread_safer1   r   _pending_resultsr#   MESSAGE_BUFFER_MAX_pending_messagesurl)rB   r5   rg   max_cached_resultsrr   rp   expires_typer}   r9   re   cmaxs              r:   __init__zBackend.__init__o   s{    x}$>(> -6tG					!:T%:%)RZZikkkXD5I5I5I++G\BB 5;Nd00-1[-@d))dk,T[99 HH%BEJJ,0HH5bdi,j,j)-1XX6dfh-i-i*88$@%,,OO88$@%HH 1"6I6K6K L L!*+=!>!>r<   c                     |r| j         S t          | j         pd          }|                    d          r
|dd         n|S )z=Return the backend as an URI, sanitizing the password or not. z:///Nr\   )r}   r   endswith)rB   include_passwordr}   s      r:   as_urizBackend.as_uri   sI      	8O R00<<//8s3B3xxS8r<   c                 D    |                      ||t          j                  S )zMark a task as started.)store_resultr   STARTEDrB   task_idmetas      r:   mark_as_startedzBackend.mark_as_started   s      $???r<   c                     |r(t          |          s|                     ||||           |r |j        r|                     |||           dS dS dS )z#Mark task as successfully executed.rP   N)rR   r   chordon_chord_part_return)rB   r   resultrQ   r   states         r:   mark_as_donezBackend.mark_as_done   s~      	G!:7!C!C 	GgvugFFF 	>w} 	>%%guf=====	> 	> 	> 	>r<   c                    |r|                      |||||           |r=|j        r|                     |||           	 t          |j                  }n%# t
          t          f$ r t                      }Y nw xY w|D ]}	t          |	          }
|
	                    |
j
                   |
j
                            d          |
_        |
j
                            d          |
_        |r4|t          j        v r&|
j        |                      |
j        ||||
           d|
j
        v r|                     |
||           |r"|j        r|                     |||           dS dS dS dS )z#Mark task as executed with failure.	tracebackrQ   r   group_idNr   )r   r   r   iterchainAttributeError	TypeErrortupler   rK   optionsrt   idr   r   PROPAGATE_STATESr   errbacks_call_task_errbacks)rB   r   excr   rQ   r   call_errbacksr   
chain_data
chain_elemchain_elem_ctxs              r:   mark_as_failurezBackend.mark_as_failure   s   
  	DgsE(17  D D D .	B} ?))'5#>>>%!'-00

"I. % % %"WW


%( J J
 ")!4!4%%n&<===$2$:$>$>y$I$I!'5'='A'A*'M'M$ !%*f.E%E%E"*6%%&.U"+^ &    n444--neSIII B!1 B((#yAAAAA].	B .	BZB B B Bs   A A65A6c                    g }|j         D ]}| j                            |          }|j        s| j        |_        	 t	          |j        d          rGt          |j        j        t                    s(t          |j        j        d          r ||||           n|
                    |           # t          $ r |
                    |           Y w xY w|r|j        }|j        p|}t          || j                  }| j        j        j        s|j                            dd          r|                    |f||           d S |                    |f||           d S d S )N
__header__rV   r5   is_eagerF)	parent_idroot_id)r   r5   	signature_apphasattrtype
isinstancer   r   r%   appendr   r   r   r   re   task_always_eagerdelivery_infort   applyapply_async)	rB   rQ   r   r   old_signatureerrbackr   r   gs	            r:   r   zBackend._call_task_errbacks   s   ' 	. 	.Gh((11G< (#x.  l;;2 'w|'>HH2 &gl&=qAA2 GGS)4444!((111  . . .
 $$W-----.  	 jGo0Gm222Ax}. '2G2K2KJX]2^2^ J'7       J'7      	 	s   A1B,,CCr   c                     t          |          }|r|                     |||d |           |r |j        r|                     |||           d S d S d S )Nr   )r   r   r   r   )rB   r   reasonrQ   r   r   r   s          r:   mark_as_revokedzBackend.mark_as_revoked  s    v&& 	?gsE(,g  ? ? ? 	;w} 	;%%guc:::::	; 	; 	; 	;r<   c                 6    |                      |||||          S )zfMark task as being retries.

        Note:
            Stores the current exception (if any).
        r   )r   )rB   r   r   r   rQ   r   r   s          r:   mark_as_retryzBackend.mark_as_retry  s/       #u+4g ! G G 	Gr<   c                    | j         }	 |j        |j                 j        }n# t          $ r | }Y nw xY wt          |j                            d          |j                            dg           t                      d|          }	 | 	                    ||d            |
                    |j        |          S # t          $ r&}|
                    |j        |          cY d }~S d }~ww xY w)Nr   
link_error)r   r   r   )r   )r5   _taskstaskbackendKeyErrorr   r   rt   dictr   fail_from_current_stackr   	Exception)rB   callbackr   r5   r   fake_requesteb_excs          r:   chord_error_from_stackzBackend.chord_error_from_stack  s%   h	j/7GG 	 	 	GGG	 "&&y11 (,,\2>>!VV 
  
 	 
  	I$$\3=== 228;C2HHH  	L 	L 	L228;F2KKKKKKKK	Ls*   ! 00B9 9
C)C$C)$C)c                    t          j                    \  }}}	 ||n|}t          |||f          }|                     |||j                   ||@	 |j                                         |j        j         n# t          $ r Y nw xY w|j	        }|@~S # |@	 |j                                         |j        j         n# t          $ r Y nw xY w|j	        }|@~w xY wr@   )
sysexc_infor   r   r   tb_frameclearf_localsRuntimeErrortb_next)rB   r   r   type_real_exctbexception_infos          r:   r   zBackend.fail_from_current_stack2  s'   !lnnx	!k((sC*E3+;<<N  #~/GHHH!.K%%'''K(((#   D Z .  .K%%'''K(((#   D Z . FFFFsA   5B %A77
BBC%B<;C<
C	CC		Cc                     || j         n|}|t          v rt          |          S t          |          }t	          |d|j                  t          |j        | j                  |j	        dS )z$Prepare exception for serialization.NrI   )exc_typeexc_message
exc_module)
rg   EXCEPTION_ABLE_CODECSr)   r   getattrrG   r(   r8   encoderH   )rB   r   rg   exctypes       r:   prepare_exceptionzBackend.prepare_exceptionE  so    (2(:T__

...+C000s))#G^W=MNN238T[II%02 2 	2r<   c                    |sdS t          |t                    r| j        t          v rt	          |          }|S t          |t
                    s6	 t          |          }n%# t          $ r}t          d|           |d}~ww xY w|                    d          }	 |d         }n"# t          $ r}t          d          |d}~ww xY w|t          |t                    }nr	 t          j        |         }|                    d          D ]}t          ||          }n6# t          t           f$ r" t          |t"          j        j                  }Y nw xY w|                    dd          }t          |t&                    rt)          |t                    s ||n| d| }t+          d	| d
|           	 t          |t,          t.          f          r || }n ||          }n,# t0          $ r}	t1          | d| d          }Y d}	~	nd}	~	ww xY w|S )z1Convert serialized exception to Python exception.NzbIf the stored exception isn't an instance of BaseException, it must be a dictionary.
Instead got: r   r   z5Exception information must include the exception type.r   r   z!Expected an exception class, got z with payload ())r   BaseExceptionrg   r   r*   r   r   rt   r   
ValueErrorr'   rG   r   modulessplitr   r   celery
exceptionsr   
issubclassr   r   listr   )
rB   r   er   r   r7   nameexc_msgfake_exc_typeerrs
             r:   exception_to_pythonzBackend.exception_to_pythonO  s    	>4]++ 	>"777+C00JC&& 	>>3ii > > > !6 14!6 !6 7 7 =>>> WW\**
	::HH 	: 	: 	: 2 3 389:	: &($ $CCGk*-$NN3// - -D!#t,,CC-n- G G G*8+1+<+EG GG ''-,," #t$$ 	\JsM,J,J 	\(2(:HH:@Z@ZPX@Z@ZMZMZZQXZZ\ \ \	1'E4=11 #c7mc'll 	1 	1 	1s//W///00CCCCCC	1 
sZ   A 
B)A<<BB# #
C-B==C:D 0EE0-G 
H(HHc                 n    | j         dk    r)t          |t                    r|                                S |S )zPrepare value for storage.r0   )rg   r   r   as_tuplerB   r   s     r:   prepare_valuezBackend.prepare_value  s3    ?h&&:fj+I+I&??$$$r<   c                 8    |                      |          \  }}}|S r@   )_encode)rB   data_payloads       r:   r   zBackend.encode  s    T**1gr<   c                 .    t          || j                  S )N)rg   )r	   rg   )rB   r   s     r:   r   zBackend._encode  s    Tdo6666r<   c                 `    |d         | j         v r|                     |d                   |d<   |S )Nstatusr   )EXCEPTION_STATESr   )rB   r   s     r:   meta_from_decodedzBackend.meta_from_decoded  s4    >T222!55d8nEEDNr<   c                 R    |                      |                     |                    S r@   )r  decoderB   r   s     r:   decode_resultzBackend.decode_result  s"    %%dkk'&:&:;;;r<   c                 p    ||S |pt          |          }t          || j        | j        | j                  S )N)rj   rk   rr   )strr
   rj   rk   rr   r  s     r:   r  zBackend.decode  sF    ?N)S\\W"&"3&*&; K) ) ) 	)r<   c                     || j         j        j        }t          |t                    r|                                }||r ||          S |S r@   )r5   re   result_expiresr   r   total_seconds)rB   valuer   s      r:   ro   zBackend.prepare_expires  sT    =HM0EeY'' 	*''))E4;;r<   c                 B    ||S | j         j        j        }|| j        n|S r@   )r5   re   result_persistent
persistent)rB   enabledr  s      r:   prepare_persistentzBackend.prepare_persistent  s*    NX]4
","4t*Dr<   c                     || j         v r*t          |t                    r|                     |          S |                     |          S r@   )r   r   r   r   r   )rB   r   r   s      r:   encode_resultzBackend.encode_result  sG    D)))j.K.K)))&111!!&)))r<   c                     || j         v S r@   )rn   rB   r   s     r:   	is_cachedzBackend.is_cached  s    $+%%r<   c           	      t   || j         v r*t          j                    }|r|                                }nd }||||                     |          |d}|rt          |dd           r
|j        |d<   |rt          |dd           r
|j        |d<   | j        j	        
                    dd          r|r	t          |dd           t          |dd           t          |d	d           t          |d
d           t          |dd           t          |d          r!|j        r|j                            d          nd d}	t          |dd           r$|j        |	d<   |	                    |j                   |r8dd	h}
|
D ]1}|	|         }|                     |          }t%          |          |	|<   2|                    |	           |S )N)r   r   r   children	date_doner   r   r   extendedr   r   r8   r9   hostnameretriesr   routing_key)r   r8   r9   workerr  queuestampsstamped_headers)READY_STATESr   utcnow	isoformatcurrent_task_childrenr   r   r   r5   re   find_value_for_keyr   r   rt   r   rK   r  r   r   )rB   r   r   r   rQ   format_dater   r  r   request_metaencode_needed_fieldsfieldr  encoded_values                 r:   _get_result_metazBackend._get_result_meta  s    D%%% ))I 2%//11	I "227;;"
 
  	-ww66 	-&}D 	2wwT:: 	2 ' 1D8=++JAA 	* *#GVT::#GVT::%gx>>%gz4@@&w	4@@w884)4W266}EEE/3	  	  7Hd33 86=6ML!23 ''777 J,2H+=(!5 J J ,U 3(,E(:(:.:=.I.IU++L)))r<   c                 .    t          j        |           d S r@   )timesleep)rB   amounts     r:   _sleepzBackend._sleep  s    
6r<   c                    |                      ||          }d}	 	  | j        ||||fd|i| |S # t          $ r}| j        rz|                     |          re|| j        k     r:|dz  }t          | j        || j        d          dz  }	| 	                    |	           n!t          t          d||                     n Y d}~nd}~ww xY w)	zUpdate task state and result.

        if always_retry_backend_operation is activated, in the event of a recoverable exception,
        then retry operation with an exponential backoff until a limit has been reached.
        r   TrQ   rV     z%failed to store result on the backend)r   r   N)r  _store_resultr   ru   exception_safe_to_retryrW   r,   rw   rv   r0  r+   r   )
rB   r   r   r   r   rQ   r9   r  r   sleep_amounts
             r:   r   zBackend.store_result  s6    ##FE22	""7FE9 > >+2>6<> > >   $ )E)Ec)J)J !1111 (H > =t(E (EGK(L L1111*-.U_fnsttt    !	s   0 
CBCCc                 f    | j                             |d            |                     |           d S r@   )rn   pop_forgetr  s     r:   forgetzBackend.forget#  s0    &&&Wr<   c                      t          d          )Nz"backend does not implement forget.NotImplementedErrorr  s     r:   r8  zBackend._forget'  s    !"FGGGr<   c                 8    |                      |          d         S )zGet the state of a task.r   )get_task_metar  s     r:   	get_statezBackend.get_state*  s    !!'**844r<   c                 R    |                      |                              d          S )z$Get the traceback for a failed task.r   r>  rt   r  s     r:   get_tracebackzBackend.get_traceback0  s$    !!'**..{;;;r<   c                 R    |                      |                              d          S )zGet the result of a task.r   rA  r  s     r:   
get_resultzBackend.get_result4  s$    !!'**..x888r<   c                 \    	 |                      |          d         S # t          $ r Y dS w xY w)z(Get the list of subtasks sent by a task.r  N)r>  r   r  s     r:   get_childrenzBackend.get_children8  sB    	%%g..z:: 	 	 	DD	s    
++c                     | j         j        j        r-| j         j        j        st	          j        dt                     d S d S d S )NzResults are not stored in backend and should not be retrieved when task_always_eager is enabled, unless task_store_eager_result is enabled.)r5   re   r   task_store_eager_resultwarningswarnRuntimeWarningrB   s    r:   _ensure_not_eagerzBackend._ensure_not_eager?  sZ    8=* 	48=3X 	M[    	 	 	 	r<   c                     dS )a  Check if an exception is safe to retry.

        Backends have to overload this method with correct predicates dealing with their exceptions.

        By default no exception is safe to retry, it's up to backend implementation
        to define which exceptions are safe.
        FrA   )rB   r   s     r:   r4  zBackend.exception_safe_to_retryG  s	     ur<   c                 2   |                                   |r	 | j        |         S # t          $ r Y nw xY wd}	 	 |                     |          }n# t          $ r}| j        ry|                     |          rd|| j        k     r:|dz  }t          | j	        || j
        d          dz  }|                     |           n t          t          d|                     n Y d}~nd}~ww xY w|r-|                    d          t          j        k    r
|| j        |<   |S )	zGet task meta from backend.

        if always_retry_backend_operation is activated, in the event of a recoverable exception,
        then retry operation with an exponential backoff until a limit has been reached.
        r   TrV   r2  zfailed to get meta)r   Nr   )rM  rn   r   _get_task_meta_forr   ru   r4  rW   r,   rw   rv   r0  r+   r   rt   r   SUCCESS)rB   r   cacher  r   r   r5  s          r:   r>  zBackend.get_task_metaQ  sy    	    	{7++   	..w77   $ )E)Ec)J)J !1111 (H > =t(E (EGK(L L1111*/0DgVVV    !		,  	(TXXh''6>99#'DK s$   % 
22A 
C$BCC$c                 D    |                      |d          | j        |<   dS )z;Reload task result, even if it has been previously fetched.FrR  N)r>  rn   r  s     r:   reload_task_resultzBackend.reload_task_resultx  s'    #11'1GGGr<   c                 D    |                      |d          | j        |<   dS )z<Reload group result, even if it has been previously fetched.FrT  N)get_group_metarn   rB   r   s     r:   reload_group_resultzBackend.reload_group_result|  s'     $ 3 3HE 3 J JHr<   c                     |                                   |r	 | j        |         S # t          $ r Y nw xY w|                     |          }|r|
|| j        |<   |S r@   )rM  rn   r   _restore_grouprB   r   rR  r   s       r:   rW  zBackend.get_group_meta  s        	{8,,    ""8,, 	)T%$(DK!s   % 
22c                 H    |                      ||          }|r|d         S dS )zGet the result for a group.rT  r   N)rW  r\  s       r:   restore_groupzBackend.restore_group  s6    ""85"99 	">!	" 	"r<   c                 .    |                      ||          S )z&Store the result of an executed group.)_save_grouprB   r   r   s      r:   
save_groupzBackend.save_group  s    &111r<   c                 b    | j                             |d            |                     |          S r@   )rn   r7  _delete_grouprX  s     r:   delete_groupzBackend.delete_group  s,    $'''!!(+++r<   c                     dS )zBackend cleanup.NrA   rL  s    r:   cleanupzBackend.cleanup        r<   c                     dS )z:Cleanup actions to do at the end of a task worker process.NrA   rL  s    r:   process_cleanupzBackend.process_cleanup  rh  r<   c                     i S r@   rA   )rB   producerr   s      r:   on_task_callzBackend.on_task_call  s    	r<   c                      t          d          )Nz%Backend does not support add_to_chordr;  )rB   chord_idr   s      r:   add_to_chordzBackend.add_to_chord  s    !"IJJJr<   c                     d S r@   rA   )rB   rQ   r   r   r9   s        r:   r   zBackend.on_chord_part_return  rF   r<   c                     d S r@   rA   )rB   r   
chord_sizes      r:   set_chord_sizezBackend.set_chord_size  rF   r<   c                    d |D             |d<   	 t          |dd           }n# t          $ r d }Y nw xY w|j                            dt          |dd                     }|5| j        j        j                            ||j                  d         j        }|j                            dt          |dd                    }| j        j	        d         
                    |j        |f||||           d S )	Nc                 6    g | ]}|                                 S rA   r   .0rs     r:   
<listcomp>z1Backend.fallback_chord_unlock.<locals>.<listcomp>  s     @@@QAJJLL@@@r<   r   r   r  priorityr   zcelery.chord_unlock)	countdownr  r|  )r   r   r   rt   r5   amqprouterrouter   tasksr   r   )rB   header_resultbodyr}  r9   	body_typer  r|  s           r:   fallback_chord_unlockzBackend.fallback_chord_unlock  s   @@-@@@x	fd33II 	 	 	III	   ')Wd*K*KLL= HM(..vtyAA'JOE<##J	:q0Q0QRR,-99t%v	 	: 	
 	
 	
 	
 	
s   # 22c                     d S r@   rA   rL  s    r:   ensure_chords_allowedzBackend.ensure_chords_allowed  rF   r<   c                 j    |                                    | j        j        | } | j        ||fi | d S r@   )r  r5   r   r  rB   header_result_argsr  r9   r  s        r:   apply_chordzBackend.apply_chord  sI    ""$$$,,.@A""=$AA&AAAAAr<   c                 ~    |pt          t                      dd           }|rd t          |dg           D             S d S )NrQ   c                 6    g | ]}|                                 S rA   rw  rx  s     r:   r{  z1Backend.current_task_children.<locals>.<listcomp>  s     KKKQAJJLLKKKr<   r  )r   r   )rB   rQ   s     r:   r$  zBackend.current_task_children  sT    IW%5%7%7DII 	LKK'':r*J*JKKKK	L 	Lr<   rA   c                 0    |si n|}t           | j        ||ffS r@   )r;   	__class__rB   r8   r9   s      r:   
__reduce__zBackend.__reduce__  s$    !-v 4>4"@AAr<   )NNNNNNFr@   )TFNN)T)rV   )rA   N)ErG   rH   rI   r   r!  UNREADY_STATESr   r   subpolling_intervalsupports_native_joinsupports_autoexpirer  retry_policyr   r   r   rQ  r   FAILUREr   r   REVOKEDr   RETRYr   r   r   r   r   r   r   r   r  r  r  ro   r  r  r  r+  r0  r   r9  r8  r?  
get_statusrB  rD  rF  rM  r4  r>  rU  rY  rW  r^  rb  re  rg  rj  rm  rp  r   rt  r  r  r  r$  r  rA   r<   r:   rT   rT   Q   sW       &L*N.L
  !
   J 	 L CG6:   :9 9 9 9@ @ @
 "FN> > > > #'%)$n6B 6B 6B 6Bp, , ,\ /1 $4v~; ; ; ; 59"V\G G G GI I I I0   &2 2 2 2E E EN    7 7 7  
< < <) ) )   E E E E* * *
& & & AE %1 1 1 1f   .2       D  H H H5 5 5 J< < <9 9 9      % % % %NH H HK K K   " " " "2 2 2, , ,  I I I  K K K    
 
 
 
.  B B B
L L L L
B B B B B Br<   rT   c                   V    e Zd Z	 	 ddZ	 	 	 ddZ	 ddZddZd	 Zed
             Z	dS )SyncBackendMixinN      ?Tc              #   0  K   |                                   |j        }|sd S t                      }|D ]B}t          |t                    r|j        |j        fV  (|                    |j                   C|                     ||||||          E d {V  d S )N)timeoutintervalno_ack
on_messageon_interval)rM  resultssetr   r    r   addget_many)	rB   r   r  r  r  r  r  r  task_idss	            r:   iter_nativezSyncBackendMixin.iter_native  s         . 	F55 	( 	(F&),, (i/////VY''''==hv!{ ! 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r<   c	                     |                                   |t          d          |                     |j        ||||          }	|	r,|                    |	           |                    ||          S d S )Nz,Backend does not support on_message callback)r  r  r  r  )	propagater   )rM  r   wait_forr   _maybe_set_cachemaybe_throw)
rB   r   r  r  r  r  r  r   r  r   s
             r:   wait_for_pendingz!SyncBackendMixin.wait_for_pending  s     	   !&>@ @ @ }}Iw#	  
 
  	N##D)))%%	H%MMM	N 	Nr<   c                     |                                   d}	 |                     |          }|d         t          j        v r|S |r
 |             t	          j        |           ||z  }|r||k    rt          d          h)aL  Wait for task and return its result.

        If the task raises an exception, this exception
        will be re-raised by :func:`wait_for`.

        Raises:
            celery.exceptions.TimeoutError:
                If `timeout` is not :const:`None`, and the operation
                takes longer than `timeout` seconds.
        g        rV   r   zThe operation timed out.)rM  r>  r   r!  r-  r.  r   )rB   r   r  r  r  r  time_elapsedr   s           r:   r  zSyncBackendMixin.wait_for  s     	   
	?%%g..DH~!444 Jx   H$L ?<722"#=>>>
	?r<   Fc                     |S r@   rA   )rB   r   r3   s      r:   add_pending_resultz#SyncBackendMixin.add_pending_result      r<   c                     |S r@   rA   r   s     r:   remove_pending_resultz&SyncBackendMixin.remove_pending_result  r  r<   c                     dS rN   rA   rL  s    r:   is_asynczSyncBackendMixin.is_async  s    ur<   )Nr  TNN)Nr  TNNNT)Nr  TNr  )
rG   rH   rI   r  r  r  r  r  propertyr  rA   r<   r:   r  r    s        EI15
 
 
 
( ?BCG26N N N N& GK? ? ? ?8        X  r<   r  c                       e Zd ZdZdS )r-   z"Base (synchronous) result backend.NrG   rH   rI   __doc__rA   r<   r:   r-   r-   $  s        ,,,,r<   r-   c                   
    e Zd ZeZdZdZdZdZ fdZ	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd#dZd#dZd#dZd#dZd Zej        fdZej        fdZddddddej        fdZd Z	 d$dZd Zd Z d Z!d  Z"d! Z#d" Z$ xZ%S )%BaseKeyValueStoreBackendzcelery-task-meta-zcelery-taskset-meta-zchord-unlock-Fc                     t          | j        d          r| j        j        | _         t                      j        |i | |                                  |                                  | j        r| j        | _	        d S d S )N__func__)
r   key_tr  superr   _add_global_keyprefix_encode_prefixesimplements_incr_apply_chord_incrr  )rB   r8   r9   r  s      r:   r   z!BaseKeyValueStoreBackend.__init__2  s    4:z** 	-,DJ$)&)))""$$$ 	6#5D	6 	6r<   c                     | j         j                            di                               dd          }|r5| d| j         | _        | d| j         | _        | d| j         | _        dS dS )a/  
        This method prepends the global keyprefix to the existing keyprefixes.

        This method checks if a global keyprefix is configured in `result_backend_transport_options` using the
        `global_keyprefix` key. If so, then it is prepended to the task, group and chord key prefixes.
         result_backend_transport_optionsglobal_keyprefixNr   )r5   re   rt   task_keyprefixgroup_keyprefixchord_keyprefix)rB   r  s     r:   r  z.BaseKeyValueStoreBackend._add_global_keyprefix;  s      8=,,-OQSTTXXYkmqrr 	P%5"M"M8K"M"MD&6#O#O9M#O#OD &6#O#O9M#O#OD   	P 	Pr<   c                     |                      | j                  | _        |                      | j                  | _        |                      | j                  | _        d S r@   )r  r  r  r  rL  s    r:   r  z)BaseKeyValueStoreBackend._encode_prefixesH  sM    "jj)<==#zz$*>??#zz$*>??r<   c                      t          d          )NzMust implement the get method.r;  rB   keys     r:   rt   zBaseKeyValueStoreBackend.getM      !"BCCCr<   c                      t          d          )NzDoes not support get_manyr;  )rB   keyss     r:   mgetzBaseKeyValueStoreBackend.mgetP  s    !"=>>>r<   c                 .    |                      ||          S r@   )r  )rB   r  r  r   s       r:   _set_with_statez(BaseKeyValueStoreBackend._set_with_stateS  s    xxU###r<   c                      t          d          )NzMust implement the set method.r;  rB   r  r  s      r:   r  zBaseKeyValueStoreBackend.setV  r  r<   c                      t          d          )Nz Must implement the delete methodr;  r  s     r:   deletezBaseKeyValueStoreBackend.deleteY  s    !"DEEEr<   c                      t          d          )NzDoes not implement incrr;  r  s     r:   incrzBaseKeyValueStoreBackend.incr\  s    !";<<<r<   c                     d S r@   rA   r  s      r:   expirezBaseKeyValueStoreBackend.expire_  rF   r<   r   c                 d    |st          d| d          |                     | j        ||          S )z#Get the cache key for a task by id.ztask_id must not be empty. Got 	 instead.)r   _get_key_forr  )rB   r   r  s      r:   get_key_for_taskz)BaseKeyValueStoreBackend.get_key_for_taskb  s@     	SQwQQQRRR  !4gsCCCr<   c                 d    |st          d| d          |                     | j        ||          S )z$Get the cache key for a group by id. group_id must not be empty. Got r  )r   r  r  rB   r   r  s      r:   get_key_for_groupz*BaseKeyValueStoreBackend.get_key_for_grouph  @     	USSSSTTT  !5xEEEr<   c                 d    |st          d| d          |                     | j        ||          S )z?Get the cache key for the chord waiting on group with given id.r  r  )r   r  r  r  s      r:   get_key_for_chordz*BaseKeyValueStoreBackend.get_key_for_chordn  r  r<   c                 v    | j         } |d                              | ||           ||          g          S )Nr   )r  join)rB   prefixr   r  r  s        r:   r  z%BaseKeyValueStoreBackend._get_key_fort  sC    
uRyy~~EE"IIuuSzz
   	r<   c                     |                      |          }| j        | j        fD ]=}|                    |          r&t	          |t          |          d                   c S >t	          |          S )zTake bytes: emit string.N)r  r  r  
startswithr   len)rB   r  r  s      r:   _strip_prefixz&BaseKeyValueStoreBackend._strip_prefix{  su    jjoo)4+?? 	7 	7F~~f%% 7#CF$5666667C   r<   c              #   h   K   |D ],\  }}|%|                      |          }|d         |v r||fV  -d S )Nr   )r  )rB   valuesr!  kr  s        r:   _filter_readyz&BaseKeyValueStoreBackend._filter_ready  sY       	# 	#HAu **511?l22U(NNN		# 	#r<   c                      t          |d          r4 fd                     |                                |          D             S fd                     t          |          |          D             S )Nitemsc                 B    i | ]\  }}                     |          |S rA   )r  )ry  r  vrB   s      r:   
<dictcomp>z=BaseKeyValueStoreBackend._mget_to_results.<locals>.<dictcomp>  s=       Aq ""1%%q  r<   c                 B    i | ]\  }}t          |                   |S rA   r   )ry  ir  r  s      r:   r  z=BaseKeyValueStoreBackend._mget_to_results.<locals>.<dictcomp>  s;       Aq T!W%%q  r<   )r   r  r  	enumerate)rB   r  r  r!  s   ` ` r:   _mget_to_resultsz)BaseKeyValueStoreBackend._mget_to_results  s    67## 	    ..v||~~|LL       ..y/@/@,OO   r<   Nr  Tc	              #   l   K   |dn|}t          |t                    r|nt          |          }	t                      }
 j        }|	D ]M}	 ||         }|d         |v r(t          |          |fV  |
                    |           ># t
          $ r Y Jw xY w|	                    |
           d}|	rt          |	          }                      	                     fd|D                       ||          }|
                    |           |	                    d |D                        |                                D ]%\  }}| ||           t          |          |fV  &|r||z  |k    rt          d| d          |r
 |             t          j        |           |dz  }|r||k    rd S |	d S d S )	Nr  r   r   c                 :    g | ]}                     |          S rA   )r  )ry  r  rB   s     r:   r{  z5BaseKeyValueStoreBackend.get_many.<locals>.<listcomp>  s=     1@ 1@ 1@56 261F1Fq1I1I 1@ 1@ 1@r<   c                 ,    h | ]}t          |          S rA   r  )ry  r  s     r:   	<setcomp>z4BaseKeyValueStoreBackend.get_many.<locals>.<setcomp>  s    ">">">q<??">">">r<   zOperation timed out (r   rV   )r   r  rn   r   r  r   difference_updater   r   r  rK   r  r   r-  r.  )rB   r  r  r  r  r  r  max_iterationsr!  ids
cached_idsrR  r   cached
iterationsr  rz  r  r  s   `                  r:   r  z!BaseKeyValueStoreBackend.get_many  s]      #*33$Xs33FhhXUU
 	, 	,G,w (#|33&w//7777NN7+++     	j)))
 	99D%%dii 1@ 1@ 1@ 1@:>1@ 1@ 1@ 'A 'ABFV VALLOOO!!">">A">">">???ggii / /
U)Ju%%%"3''..... G:0G;;"#E7#E#E#EFFF Jx   !OJ *">">#  	 	 	 	 	s   
B
BBc                 V    |                      |                     |                     d S r@   )r  r  r  s     r:   r8  z BaseKeyValueStoreBackend._forget  s(    D))'2233333r<   c                    |                      ||||          }t          |          |d<   |                     |          }|d         t          j        k    r|S 	 |                     |                     |          |                     |          |           n2# t          $ r%}	t          t          |	          ||          |	d }	~	ww xY w|S )N)r   r   r   rQ   r   r   )r   r   )
r+  r   rP  r   rQ  r  r  r   r   r  )
rB   r   r   r   r   rQ   r9   r   current_metaexs
             r:   r3  z&BaseKeyValueStoreBackend._store_result  s    $$F%/8' % K K&w//Y ..w77!V^33M	S  !6!6w!?!?TARARTYZZZZ  	S 	S 	S#CGG5'JJJPRR	S s   =B 
C" CCc                     |                      |                     |          |                     d|                                i          t          j                   |S )Nr   )r  r  r   r   r   rQ  ra  s      r:   r`  z$BaseKeyValueStoreBackend._save_group  sT    T33H==![[(FOO4E4E)FGG	Y 	Y 	Yr<   c                 V    |                      |                     |                     d S r@   )r  r  rX  s     r:   rd  z&BaseKeyValueStoreBackend._delete_group  s(    D**84455555r<   c                     |                      |                     |                    }|st          j        ddS |                     |          S )$Get task meta-data for a task by id.N)r   r   )rt   r  r   PENDINGr  r   s      r:   rP  z+BaseKeyValueStoreBackend._get_task_meta_for  sM    xx--g6677 	>$n===!!$'''r<   c                     |                      |                     |                    }|r7|                     |          }|d         }t          || j                  |d<   |S dS )r  r   N)rt   r  r  r"   r5   )rB   r   r   r   s       r:   r[  z'BaseKeyValueStoreBackend._restore_group  si    xx..x8899  	;;t$$D(^F.vtx@@DNK		 	r<   c                 x    |                                    | j        j        | }|                    |            d S )Nr   )r  r5   r   saver  s        r:   r  z*BaseKeyValueStoreBackend._apply_chord_incr  sC    ""$$$,,.@A4(((((r<   c           	      X   | j         sd S | j        }|j        }|sd S |                     |          }	 t	          j        ||           }no# t          $ rb}	t          |j        |          }
t          
                    d||	           |                     |
t          d|	                    cY d }	~	S d }	~	ww xY w|	 t          |          # t          $ rc}	t          |j        |          }
t          
                    d||	           |                     |
t          d| d                    cY d }	~	S d }	~	ww xY w|                     |          }|j                            d          }|t!          |          }||k    rt                              d	|           d S ||k    rt          |j        |          }
|j        r|j        n|j        }	 t+                      5   ||j        j        d
          }d d d            n# 1 swxY w Y   	 |
                    |           n# t          $ rL}	t          
                    d||	           |                     |
t          d|	                     Y d }	~	nd }	~	ww xY w# t          $ r}		 t3          |                                          }d                    ||	          }n# t8          $ r t;          |	          }Y nw xY wt          
                    d||           |                     |
t          |                     Y d }	~	nd }	~	ww xY w|                                 | j                            |           d S # |                                 | j                            |           w xY w|                      || j!                   d S )Nr  r   zChord %r raised: %rzCannot restore group: zChord callback %r raised: %rzGroupResult z no longer existsrs  z/Chord counter incremented too many times for %rT)r  r  zCallback error: zDependency {0.id} raised {1!r})"r  r5   r   r  r   restorer   r   r   logger	exceptionr   r   r   r  rt   r  warningr  join_nativer  r!   re   result_chord_join_timeoutdelaynext_failed_join_reportformatStopIterationreprr  clientr  rp   )rB   rQ   r   r   r9   r5   gidr  depsr   r   valsizejretculpritr   s                    r:   r   z-BaseKeyValueStoreBackend.on_chord_part_return  s   # 	Fhm 	F$$S))	&sD999DD 	 	 	&w}#>>>H2C===..;C;;<<       	 < oo%   *7=cBBB  !?cJJJ22DcDDDEE        iinn }  ..<t99D::NNL         D[[&w}#>>>H$($=L  49A(&(( ( (! # B"&( ( (C( ( ( ( ( ( ( ( ( ( ( ( ( ( ( NN3''''    $$%:CEEE// "#=c#=#=>>         
J 
J 
J'"4#;#;#=#=>>G=DD FF % ' ' '!#YYFFF'   !6VDDD++Hj6H6HIIIIIIII
J* ""3''''' ""3''''KKT\*****s   A	 	
B5AB0*B50B5;C
 

D7AD2,D72D7I> H6I> HI> 	H
I> H% #M %
I;/AI61M 6I;;M >
L)	7K L$KL$KAL$M $L))M 0N)r   r  )&rG   rH   rI   r   r  r  r  r  r  r   r  r  rt   r  r  r  r  r  r  r  r  r  r  r  r   r!  r  r   r  r8  r3  r`  rd  rP  r[  r  r   __classcell__)r  s   @r:   r  r  +  s?       E(N,O%OO6 6 6 6 6P P P@ @ @
D D D? ? ?$ $ $D D DF F F= = =  D D D DF F F FF F F F   ! ! ! 281D # # # # ;A:M     *.D d4$1$ $ $ $L4 4 4 /3   0  
6 6 6( ( (
 
 
) ) )
D+ D+ D+ D+ D+ D+ D+r<   r  c                       e Zd ZdZdS )r.   z/Result backend base class for key/value stores.Nr  rA   r<   r:   r.   r.   @  s        9999r<   r.   c                   J    e Zd ZdZi Zd Zd Zd Zd ZexZ	xZ
xZZexZxZZdS )r/   zDummy result backend.c                     d S r@   rA   r  s      r:   r   zDisabledBackend.store_resultI  rF   r<   c                 N    t          t                                                    r@   )r<  E_CHORD_NO_BACKENDstriprL  s    r:   r  z%DisabledBackend.ensure_chords_allowedL  s    !"4":":"<"<===r<   c                 N    t          t                                                    r@   )r<  E_NO_BACKENDr3  r  s      r:   _is_disabledzDisabledBackend._is_disabledO  s    !,"4"4"6"6777r<   c                     dS )Nzdisabled://rA   r  s      r:   r   zDisabledBackend.as_uriR  s    }r<   N)rG   rH   rI   r  rn   r   r  r6  r   r?  r  rD  rB  get_task_meta_forr  r  rA   r<   r:   r/   r/   D  s|        F  > > >8 8 8   ;GFIF
FZ-.:::888r<   r/   )Tr  r   r-  rI  collectionsr   r   r   	functoolsr   weakrefr   billiard.einfor   kombu.serializationr	   r
   r   r   rh   kombu.utils.encodingr   r   kombu.utils.urlr   celery.exceptionsr   r   r   r   r   celery._stater   celery.app.taskr   r   r   r   r   r   r   r   r   celery.resultr   r   r    r!   r"   celery.utils.collectionsr#   celery.utils.functionalr$   r%   celery.utils.logr&   celery.utils.serializationr'   r(   r)   r*   r+   celery.utils.timer,   __all__	frozensetr   rG   r  r{   r1   r5  r2  r;   r   r>   rR   rT   r  r-   BaseDictBackendr  r.   r/   rA   r<   r:   <module>rL     sQ    


   " " " " " " ( ( ( ( ( ( ( (       ' ' ' ' ' ' ( ( ( ( ( ( D D D D D D D D D D ? ? ? ? ? ? ; ; ; ; ; ; ; ; . . . . . .     > > > > > > > > > > > > * * * * * * # # # # # #] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] b b b b b b b b b b b b b b . . . . . . ; ; ; ; ; ; ; ; ' ' ' ' ' 'S S S S S S S S S S S S S S > > > > > >
D!	8*-- 	H		 J2 5   
 G G G
/ / / / / / / /! ! !B
B B
B B
B B
B B
B B
B B
B B
BJK K K K K K K K\- - - - -'+ - - - R+ R+ R+ R+ R+w R+ R+ R+j: : : : :35E : : :; ; ; ; ;k ; ; ; ; ;r<   