
    h                     R   d 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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      ZSy)-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)	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                 :     | |dt        j                         i|S )zReturn an unpickled backend.app)r   _get_current_object)clsargskwargss      P/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/backends/base.pyunpickle_backendr:   ?   s     F+99;FvFF    c                       e Zd Zd ZexZxZZy)	_nulldictc                      y N )selfakws      r9   ignorez_nulldict.ignoreE       r;   N)__name__
__module____qualname__rD   __setitem__update
setdefaultr@   r;   r9   r=   r=   D   s     )/.K.&:r;   r=   c                      | y| j                   S NF)ignore_resultrequests    r9   _is_request_ignore_resultrQ   K   s       r;   c                   L   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(	 d@d!Z)d" Z*d# Z+d$ Z,e,Z-d% Z.d& Z/d' Z0d( Z1d) Z2dAd*Z3d+ Z4d, Z5dAd-Z6dAd.Z7d/ Z8d0 Z9d1 Z:d2 Z;d3 Z<d4 Z=d5 Z>d6 Z?dBd7Z@d8 ZAd9 ZBd>d:ZCdCd;ZDy)DBackendNFT   r      )max_retriesinterval_startinterval_stepinterval_maxc                 f   || _         | j                   j                  }	|xs |	j                  | _        t        j
                  | j                     \  | _        | _        | _        |xs |	j                  }
|
dk(  r
t               nt        |
      | _        | j                  ||      | _        ||	j                  n|| _        | j                   |	j"                  n| j                   | _        t%        | j                         | _        |	j'                  dd      | _        |	j'                  dd      | _        |	j'                  dd      | _        |	j'                  d	t/        d
            | _        |	j'                  dd      | _        t5        i t7                     | _        t;        t<              | _        || _         y )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)!r4   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floatrV   thread_safer0   r   _pending_resultsr"   MESSAGE_BUFFER_MAX_pending_messagesurl)rA   r4   rf   max_cached_resultsrq   ro   expires_typer|   r8   rd   cmaxs              r9   __init__zBackend.__init__o   s`    xx}}$>(>(> -66tG					!:T%:%:%)RZikXD5I++G\B 5;Nd00-1[[-@d))dkk,T[[9 HH%BEJ,0HH5bdi,j)-1XX6dfh-i*88$@%,O88$@%H 1"6I6K L!*+=!>r;   c                     |r| j                   S t        | j                   xs d      }|j                  d      r|dd S |S )z=Return the backend as an URI, sanitizing the password or not. z:///Nr[   )r|   r   endswith)rA   include_passwordr|   s      r9   as_urizBackend.as_uri   s>     88O R0<</s3Bx8S8r;   c                 D    | j                  ||t        j                        S )zMark a task as started.)store_resultr   STARTEDrA   task_idmetas      r9   mark_as_startedzBackend.mark_as_started   s      $??r;   c                     |r t        |      s| j                  ||||       |r!|j                  r| j                  |||       yyy)z#Mark task as successfully executed.rO   N)rQ   r   chordon_chord_part_return)rA   r   resultrP   r   states         r9   mark_as_donezBackend.mark_as_done   sH     !:7!CgvugFw}}%%guf= %7r;   c                    |r| j                  |||||       |r(|j                  r| j                  |||       	 t        |j                        }|D ]  }	t        |	      }
|
j                  |
j                         |
j                  j                  d      |
_        |
j                  j                  d      |
_        |r>|t        j                  v r,|
j                    | j                  |
j                   ||||
       d|
j                  v s| j                  |
||        |r!|j"                  r| j%                  |||       yyyy# t
        t        f$ r t               }Y w xY w)z#Mark task as executed with failure.	tracebackrP   r   group_idNr   )r   r   r   iterchainAttributeError	TypeErrortupler   rJ   optionsrs   idr   r   PROPAGATE_STATESr   errbacks_call_task_errbacks)rA   r   excr   rP   r   call_errbacksr   
chain_data
chain_elemchain_elem_ctxs              r9   mark_as_failurezBackend.mark_as_failure   sa   
 gsE(17  D}}))'5#>%!'--0
 )
 ")!4%%n&<&<=$2$:$:$>$>y$I!'5'='='A'A*'M$ !Uf.E.E%E"**6%%&..U"+^ &  n444--neSI; )> !1!1((#yA "2}[  #I. %"W
%s   E E"!E"c                    g }|j                   D ]  }| j                  j                  |      }|j                  s| j                  |_        	 t	        |j
                  d      rOt        |j
                  j                  t              s+t        |j
                  j                  d      r ||||       n|j                  |        |r|j                  }|j                  xs |}t        || j                        }| j                  j                  j                   s|j"                  j%                  dd      r|j'                  |f||       y |j)                  |f||       y y # t        $ r |j                  |       Y ow xY w)N
__header__rU   r4   is_eagerF)	parent_idroot_id)r   r4   	signature_apphasattrtype
isinstancer   r   r$   appendr   r   r   r   rd   task_always_eagerdelivery_infors   applyapply_async)	rA   rP   r   r   old_signatureerrbackr   r   gs	            r9   r   zBackend._call_task_errbacks   sH   ''Ghh((1G<<#xx.  l; 'w||'>'>H%gll&=&=qAGS)4!((1+ (:  jjGoo0Gm2Axx}}..'2G2G2K2KJX]2^J'7   J'7    ! .
 $$W-.s   A6E!!E?>E?r   c                     t        |      }|r| j                  |||d |       |r!|j                  r| j                  |||       y y y )Nr   )r   r   r   r   )rA   r   reasonrP   r   r   r   s          r9   mark_as_revokedzBackend.mark_as_revoked  sO    v&gsE(,g  ?w}}%%guc: %7r;   c                 .    | j                  |||||      S )zfMark task as being retries.

        Note:
            Stores the current exception (if any).
        r   )r   )rA   r   r   r   rP   r   r   s          r9   mark_as_retryzBackend.mark_as_retry  s)       #u+4g ! G 	Gr;   c                    | j                   }	 |j                  |j                     j                  }t        |j                  j                  d      |j                  j                  dg       t               d|      }	 | j                  ||d        |j                  |j                  |      S # t        $ r | }Y w xY w# t        $ r'}|j                  |j                  |      cY d }~S d }~ww xY w)Nr   
link_error)r   r   r   )r   )r4   _taskstaskbackendKeyErrorr   r   rs   dictr   fail_from_current_stackr   	Exception)rA   callbackr   r4   r   fake_requesteb_excs          r9   chord_error_from_stackzBackend.chord_error_from_stack  s    hh	jj/77G ""&&y1 ((,,\2>!V 
 	 
 	I$$\3= 228;;C2HH%  	G	  	L228;;F2KK	Ls/   #B. >B? .B<;B<?	C/C*$C/*C/c                    t        j                         \  }}}	 ||n|}t        |||f      }| j                  |||j                         ||@	 |j
                  j                          |j
                  j                   |j                  }|@~S # t        $ r Y w xY w# |P	 |j
                  j                          |j
                  j                   n# t        $ r Y nw xY w|j                  }|P~w xY wr?   )
sysexc_infor   r   r   tb_frameclearf_localsRuntimeErrortb_next)rA   r   r   type_real_exctbexception_infos          r9   r   zBackend.fail_from_current_stack2  s    !llnx	!k(sC*E3+;<N  #~/G/GH!.KK%%'KK(( ZZ .  $ 	 .KK%%'KK((#  ZZ . sG   2B 0B	BBC4#0CC4	C C4C  C42C4c                     || j                   n|}|t        v rt        |      S t        |      }t	        |d|j
                        t        |j                  | j                        |j                  dS )z$Prepare exception for serialization.rH   )exc_typeexc_message
exc_module)
rf   EXCEPTION_ABLE_CODECSr(   r   getattrrF   r'   r7   encoderG   )rA   r   rf   exctypes       r9   prepare_exceptionzBackend.prepare_exceptionE  sf    (2(:T__

..+C00s)#G^W=M=MN2388T[[I%002 	2r;   c                    |syt        |t              r| j                  t        v rt	        |      }|S t        |t
              s	 t        |      }|j                  d      }	 |d   }|t        |t              }n7	 t        j                  |   }|j                  d      D ]  }t        ||      } 	 |j                  dd      }t        |t&              rt)        |t              s||n| d| }t+        d	| d
|       	 t        |t,        t.        f      r || }|S  ||      }	 |S # t        $ r}t        d|       |d}~ww xY w# t        $ r}t        d      |d}~ww xY w# t        t         f$ r' t        |t"        j$                  j                        }Y w xY w# t0        $ r}	t1        | d| d      }Y d}	~	|S d}	~	ww xY w)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   BaseExceptionrf   r   r)   r   r   rs   r   
ValueErrorr&   rF   r   modulessplitr   r   celery
exceptionsr   
issubclassr   r   listr   )
rA   r   er   r   r6   nameexc_msgfake_exc_typeerrs
             r9   exception_to_pythonzBackend.exception_to_pythonO  s    ]+"77+C0JC&>3i WW\*
	::H &($CGkk*-$NN3/D!#t,C 0
 ''-," #t$JsM,J(2(:H:,aPXz@ZM3M?.QXPYZ\ \	1'E4=17m 
	 'l 
u  > #0 14u!6 7 =>>>  	: 2 389:	: n- G*8+1+<+<+E+EGGB  	1se1WIQ/0C
	1s`   D' !E :5E$ ?F F '	E0D??E	E!EE!$3FF	G&F==Gc                 d    | j                   dk7  r t        |t              r|j                         S |S )zPrepare value for storage.r/   )rf   r   r   as_tuplerA   r   s     r9   prepare_valuezBackend.prepare_value  s)    ??h&:fj+I??$$r;   c                 0    | j                  |      \  }}}|S r?   )_encode)rA   data_payloads       r9   r   zBackend.encode  s    T*1gr;   c                 0    t        || j                        S )N)rf   )r   rf   )rA   r   s     r9   r   zBackend._encode  s    Tdoo66r;   c                 V    |d   | j                   v r| j                  |d         |d<   |S )Nstatusr   )EXCEPTION_STATESr   )rA   r   s     r9   meta_from_decodedzBackend.meta_from_decoded  s1    >T222!55d8nEDNr;   c                 B    | j                  | j                  |            S r?   )r   decoderA   r   s     r9   decode_resultzBackend.decode_result  s    %%dkk'&:;;r;   c                     ||S |xs t        |      }t        || j                  | j                  | j                        S )N)ri   rj   rq   )strr	   ri   rj   rq   r  s     r9   r  zBackend.decode  sB    ?N)S\W"&"3"3&*&;&; KK) 	)r;   c                     | | j                   j                  j                  }t        |t              r|j                         }|
|r ||      S |S r?   )r4   rd   result_expiresr   r   total_seconds)rA   valuer   s      r9   rn   zBackend.prepare_expires  sI    =HHMM00EeY''')E;r;   c                 j    ||S | j                   j                  j                  }|| j                  S |S r?   )r4   rd   result_persistent
persistent)rA   enabledr  s      r9   prepare_persistentzBackend.prepare_persistent  s4    NXX]]44
","4tD*Dr;   c                     || j                   v r!t        |t              r| j                  |      S | j	                  |      S r?   )r   r   r   r   r   )rA   r   r   s      r9   encode_resultzBackend.encode_result  s;    D)))j.K))&11!!&))r;   c                     || j                   v S r?   )rm   rA   r   s     r9   	is_cachedzBackend.is_cached  s    $++%%r;   c           	      N   || j                   v r-| j                  j                         }|r|j                         }nd }|||| j	                  |      |d}|rt        |dd       r|j                  |d<   |rt        |dd       r|j                  |d<   | j                  j                  j                  dd      r|rt        |dd       t        |dd       t        |d	d       t        |d
d       t        |dd       t        |d      r'|j                  r|j                  j                  d      nd d}	t        |dd       r*|j                  |	d<   |	j                  |j                         |r/dd	h}
|
D ]&  }|	|   }| j!                  |      }t#        |      |	|<   ( |j                  |	       |S )N)r   r   r   children	date_doner   r   r   extendedr   r   r7   r8   hostnameretriesr   routing_key)r   r7   r8   workerr  queuestampsstamped_headers)READY_STATESr4   now	isoformatcurrent_task_childrenr   r   r   rd   find_value_for_keyr   r   rs   r  rJ   r  r   r   )rA   r   r   r   rP   format_dater   r  r   request_metaencode_needed_fieldsfieldr
  encoded_values                 r9   _get_result_metazBackend._get_result_meta  s    D%%%I%//1	I "227;"
 ww6&}}DwwT: ' 1 1D88==++JA#GVT:#GVT:%gx>%gz4@&w	4@w8)) %2266}E/3	  7Hd36=6M6ML!23 ''7,2H+=(!5 ,U 3(,E(:.:=.IU+ "6
 L)r;   c                 .    t        j                  |       y r?   )timesleep)rA   amounts     r9   _sleepzBackend._sleep  s    

6r;   c                    | j                  ||      }d}	 	  | j                  ||||fd|i| |S # t        $ r}| j                  rt| j	                  |      rc|| j
                  k  r<|dz  }t        | j                  || j                  d      dz  }	| j                  |	       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   TrP   rU     z%failed to store result on the backend)r   r   N)r  _store_resultr   rt   exception_safe_to_retryrV   r+   rv   ru   r/  r*   r   )
rA   r   r   r   r   rP   r8   r  r   sleep_amounts
             r9   r   zBackend.store_result  s     ##FE2"""7FE9 >+2>6<> $$)E)Ec)J!1!111 (H >> ==t(EGK(L L1*-.U_fnst ! s   1 	CBC  Cc                 ^    | j                   j                  |d        | j                  |       y r?   )rm   pop_forgetr  s     r9   forgetzBackend.forget#  s     &Wr;   c                     t        d      )Nz"backend does not implement forget.NotImplementedErrorr  s     r9   r7  zBackend._forget'  s    !"FGGr;   c                 *    | j                  |      d   S )zGet the state of a task.r   )get_task_metar  s     r9   	get_statezBackend.get_state*  s    !!'*844r;   c                 B    | j                  |      j                  d      S )z$Get the traceback for a failed task.r   r=  rs   r  s     r9   get_tracebackzBackend.get_traceback0  s    !!'*..{;;r;   c                 B    | j                  |      j                  d      S )zGet the result of a task.r   r@  r  s     r9   
get_resultzBackend.get_result4  s    !!'*..x88r;   c                 J    	 | j                  |      d   S # t        $ r Y yw xY w)z(Get the list of subtasks sent by a task.r  N)r=  r   r  s     r9   get_childrenzBackend.get_children8  s/    	%%g.z:: 		s    	""c                     | j                   j                  j                  r<| j                   j                  j                  st	        j
                  dt               y y y )NzResults are not stored in backend and should not be retrieved when task_always_eager is enabled, unless task_store_eager_result is enabled.)r4   rd   r   task_store_eager_resultwarningswarnRuntimeWarningrA   s    r9   _ensure_not_eagerzBackend._ensure_not_eager?  sA    88==**488==3X3XMM[ 4Y*r;   c                      y)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.
        Fr@   )rA   r   s     r9   r3  zBackend.exception_safe_to_retryG  s     r;   c                 (   | j                          |r	 | j                  |   S d}	 	 | j                  |      }	 |r1|j                  d      t        j                   k(  r|| j                  |<   |S # t        $ r Y Vw xY w# t        $ r}| j
                  rs| j                  |      rb|| j                  k  r<|dz  }t        | j                  || j                  d      dz  }| j                  |       nt        t        d|             n Y d}~nd}~ww xY w)	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   TrU   r1  zfailed to get meta)r   Nr   )rL  rm   r   _get_task_meta_forr   rt   r3  rV   r+   rv   ru   r/  r*   r   rs   r   SUCCESS)rA   r   cacher  r   r   r4  s          r9   r=  zBackend.get_task_metaQ  s     	 {{7++ ..w7& TXXh'6>>9#'DKK 7    $$)E)Ec)J!1!111 (H >> ==t(EGK(L L1*/0DgV !	 s)   A. A= .	A:9A:=	DB DDc                 D    | j                  |d      | j                  |<   y)z;Reload task result, even if it has been previously fetched.FrQ  N)r=  rm   r  s     r9   reload_task_resultzBackend.reload_task_resultx  s     #11'1GGr;   c                 D    | j                  |d      | j                  |<   y)z<Reload group result, even if it has been previously fetched.FrS  N)get_group_metarm   rA   r   s     r9   reload_group_resultzBackend.reload_group_result|  s      $ 3 3HE 3 JHr;   c                     | j                          |r	 | j                  |   S | j                  |      }|r||| j                  |<   |S # t        $ r Y 1w xY wr?   )rL  rm   r   _restore_grouprA   r   rQ  r   s       r9   rV  zBackend.get_group_meta  sf     {{8,, ""8,T%$(DKK!  s   A	 		AAc                 8    | j                  ||      }|r|d   S y)zGet the result for a group.rS  r   N)rV  r[  s       r9   restore_groupzBackend.restore_group  s)    ""85"9>! r;   c                 &    | j                  ||      S )z&Store the result of an executed group.)_save_grouprA   r   r   s      r9   
save_groupzBackend.save_group  s    &11r;   c                 \    | j                   j                  |d        | j                  |      S r?   )rm   r6  _delete_grouprW  s     r9   delete_groupzBackend.delete_group  s%    $'!!(++r;   c                      y)zBackend cleanup.Nr@   rK  s    r9   cleanupzBackend.cleanup      r;   c                      y)z:Cleanup actions to do at the end of a task worker process.Nr@   rK  s    r9   process_cleanupzBackend.process_cleanup  rg  r;   c                     i S r?   r@   )rA   producerr   s      r9   on_task_callzBackend.on_task_call  s    	r;   c                     t        d      )Nz%Backend does not support add_to_chordr:  )rA   chord_idr   s      r9   add_to_chordzBackend.add_to_chord  s    !"IJJr;   c                      y r?   r@   )rA   rP   r   r   r8   s        r9   r   zBackend.on_chord_part_return  rE   r;   c                      y r?   r@   )rA   r   
chord_sizes      r9   set_chord_sizezBackend.set_chord_size  rE   r;   c                 .   |D cg c]  }|j                          c}|d<   	 t        |dd       }|j                  j	                  dt        |dd             }|G| j
                  j                  j                  j                  ||j                        d   j                  }|j                  j	                  dt        |dd            }| j
                  j                  d   j                  |j                  |f||||       y c c}w # t        $ r d }Y w xY w)Nr   r   r  priorityr   zcelery.chord_unlock)	countdownr  ru  )r   r   r   r   rs   r4   amqprouterrouter   tasksr   r   )	rA   header_resultbodyrv  r8   r	body_typer  ru  s	            r9   fallback_chord_unlockzBackend.fallback_chord_unlock  s    2?@QAJJL@x	fd3I   ')Wd*KL= HHMM((..vtyyA'JOOE<<##J	:q0QR,-99t%v	 	: 	
 A  	I	s   DD DDc                      y r?   r@   rK  s    r9   ensure_chords_allowedzBackend.ensure_chords_allowed  rE   r;   c                 ~    | j                           | j                  j                  | } | j                  ||fi | y r?   )r  r4   r   r  rA   header_result_argsr|  r8   r{  s        r9   apply_chordzBackend.apply_chord  s<    ""$,,,.@A"""=$A&Ar;   c                     |xs t        t               dd       }|r)t        |dg       D cg c]  }|j                          c}S y c c}w )NrP   r  )r   r   r   )rA   rP   r}  s      r9   r#  zBackend.current_task_children  sD    IW%5%7DI*1':r*JKQAJJLKK Ks   Ac                 8    |si n|}t         | j                  ||ffS r?   )r:   	__class__rA   r7   r8   s      r9   
__reduce__zBackend.__reduce__  s!    !v 4>>4"@AAr;   )NNNNNNFr?   )TFNN)T)rU   )r@   N)ErF   rG   rH   r   r   UNREADY_STATESr   r   subpolling_intervalsupports_native_joinsupports_autoexpirer  retry_policyr   r   r   rP  r   FAILUREr   r   REVOKEDr   RETRYr   r   r   r   r   r   r   r   r   r  r  rn   r  r  r  r*  r/  r   r8  r7  r>  
get_statusrA  rC  rE  rL  r3  r=  rT  rX  rV  r]  ra  rd  rf  ri  rl  ro  r   rs  r  r  r  r#  r  r@   r;   r9   rS   rS   Q   s   &&L**N..L
  !
   J 	L CG6::9@
 "FNN> #'%)$nn6Bp,\ /1 $4v~~; 59"V\\GI0&2EN7
<)E*
& AE %1f .2 DH5 J<9%NHK"2,IK
.B
L
Br;   rS   c                   N    e Zd Z	 	 ddZ	 	 	 d	dZ	 d
dZddZd Zed        Z	y)SyncBackendMixinNc              #   :  K   | j                          |j                  }|sy t               }|D ]H  }t        |t              r|j
                  |j                  f .|j                  |j
                         J | j                  ||||||      E d {    y 7 w)N)timeoutintervalno_ack
on_messageon_interval)rL  resultssetr   r   r   addget_many)	rA   r   r  r  r  r  r  r  task_idss	            r9   iter_nativezSyncBackendMixin.iter_native  s      ..5F&),ii//VYY'	  ==hv!{ ! 
 	
 	
s   BBBBc	                     | j                          |t        d      | j                  |j                  ||||      }	|	r$|j	                  |	       |j                  ||      S y )Nz,Backend does not support on_message callback)r  r  r  r  )	propagater   )rL  r   wait_forr   _maybe_set_cachemaybe_throw)
rA   r   r  r  r  r  r  r   r  r   s
             r9   wait_for_pendingz!SyncBackendMixin.wait_for_pending  s}     	 !&>@ @ }}IIw#	  
 ##D)%%	H%MM r;   c                     | j                          d}	 | j                  |      }|d   t        j                  v r|S |r |        t	        j
                  |       ||z  }|r||k\  rt        d      ^)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        r   zThe operation timed out.)rL  r=  r   r   r,  r-  r   )rA   r   r  r  r  r  time_elapsedr   s           r9   r  zSyncBackendMixin.wait_for  sx     	 %%g.DH~!4!44JJx H$L<72"#=>> r;   c                     |S r?   r@   )rA   r   r2   s      r9   add_pending_resultz#SyncBackendMixin.add_pending_result      r;   c                     |S r?   r@   r   s     r9   remove_pending_resultz&SyncBackendMixin.remove_pending_result  r  r;   c                      yrM   r@   rK  s    r9   is_asynczSyncBackendMixin.is_async  s    r;   )N      ?TNN)Nr  TNNNT)Nr  TNr  )
rF   rG   rH   r  r  r  r  r  propertyr  r@   r;   r9   r  r    sI    EI15
( ?BCG26N& GK?8  r;   r  c                       e Zd ZdZy)r,   z"Base (synchronous) result backend.NrF   rG   rH   __doc__r@   r;   r9   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j2                  fdZej2                  fdZddddddej2                  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        |   |i | | j                          | j                          | j                  r| j                  | _	        y y )N__func__)
r   key_tr  superr   _add_global_keyprefix_encode_prefixesimplements_incr_apply_chord_incrr  )rA   r7   r8   r  s      r9   r   z!BaseKeyValueStoreBackend.__init__2  sh    4::z*,,DJ$)&)""$#55D  r;   c                    | j                   j                  j                  di       j                  dd      }|rL|d   dvr|dz  }| | j                   | _        | | j                   | _        | | j
                   | _        yy)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[   z:_-.r   )r4   rd   rs   task_keyprefixgroup_keyprefixchord_keyprefix)rA   r  s     r9   r  z.BaseKeyValueStoreBackend._add_global_keyprefix;  s      88==,,-OQSTXXYkmqr#61 C' %5$6t7J7J6K"LD&6%78L8L7M#ND &6%78L8L7M#ND  r;   c                     | j                  | j                        | _        | j                  | j                        | _        | j                  | j                        | _        y r?   )r  r  r  r  rK  s    r9   r  z)BaseKeyValueStoreBackend._encode_prefixesJ  sG    "jj)<)<=#zz$*>*>?#zz$*>*>?r;   c                     t        d      )NzMust implement the get method.r:  rA   keys     r9   rs   zBaseKeyValueStoreBackend.getO      !"BCCr;   c                     t        d      )NzDoes not support get_manyr:  )rA   keyss     r9   mgetzBaseKeyValueStoreBackend.mgetR  s    !"=>>r;   c                 &    | j                  ||      S r?   )r  )rA   r  r
  r   s       r9   _set_with_statez(BaseKeyValueStoreBackend._set_with_stateU  s    xxU##r;   c                     t        d      )NzMust implement the set method.r:  rA   r  r
  s      r9   r  zBaseKeyValueStoreBackend.setX  r  r;   c                     t        d      )Nz Must implement the delete methodr:  r  s     r9   deletezBaseKeyValueStoreBackend.delete[  s    !"DEEr;   c                     t        d      )NzDoes not implement incrr:  r  s     r9   incrzBaseKeyValueStoreBackend.incr^  s    !";<<r;   c                      y r?   r@   r  s      r9   expirezBaseKeyValueStoreBackend.expirea  rE   r;   c                 ^    |st        d| d      | j                  | 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  )rA   r   r  s      r9   get_key_for_taskz)BaseKeyValueStoreBackend.get_key_for_taskd  s5    >wiyQRR  !4!4gsCCr;   c                 ^    |st        d| d      | j                  | j                  ||      S )z$Get the cache key for a group by id. group_id must not be empty. Got r  )r   r  r  rA   r   r  s      r9   get_key_for_groupz*BaseKeyValueStoreBackend.get_key_for_groupj  5    ?zSTT  !5!5xEEr;   c                 ^    |st        d| d      | j                  | j                  ||      S )z?Get the cache key for the chord waiting on group with given id.r  r  )r   r  r  r  s      r9   get_key_for_chordz*BaseKeyValueStoreBackend.get_key_for_chordp  r  r;   c                 f    | j                   } |d      j                  | ||       ||      g      S )Nr   )r  join)rA   prefixr   r  r  s        r9   r  z%BaseKeyValueStoreBackend._get_key_forv  s4    

Ry~~E"IuSz
  	r;   c                     | j                  |      }| j                  | j                  fD ],  }|j                  |      st	        |t        |      d       c S  t	        |      S )zTake bytes: emit string.N)r  r  r  
startswithr   len)rA   r  r  s      r9   _strip_prefixz&BaseKeyValueStoreBackend._strip_prefix}  sZ    jjo))4+?+??F~~f%#CF$566 @ C  r;   c              #   d   K   |D ]'  \  }}|	| j                  |      }|d   |v s"||f ) y w)Nr   )r  )rA   valuesr   kr
  s        r9   _filter_readyz&BaseKeyValueStoreBackend._filter_ready  s?     HAu **51?l2U(N	 s   00	0c                 .   t        |d      rC| j                  |j                         |      D ci c]  \  }}| j                  |      | c}}S | j                  t	        |      |      D ci c]  \  }}t        ||         | c}}S c c}}w c c}}w )Nitems)r   r  r  r  	enumerater   )rA   r  r  r   r  vis          r9   _mget_to_resultsz)BaseKeyValueStoreBackend._mget_to_results  s    67# !..v||~|LAq ""1%q(  !..y/@,OAq T!W%q( s   B.BNr  Tc	           
   #   >  K   |dn|}t        |t              r|n
t        |      }	t               }
| j                  }|	D ]0  }	 ||   }|d   |v st        |      |f |
j	                  |       2 |	j                  |
       d}|	rt        |	      }| j                  | j                  |D cg c]  }| j                  |       c}      ||      }|j                  |       |	j                  |D ch c]  }t        |       c}       |j                         D ]  \  }}| ||       t        |      |f   |r||z  |k\  rt        d| d      |r |        t        j                  |       |dz  }|r||k\  ry |	ry y # t
        $ r Y Qw xY wc c}w c c}w w)Nr  r   r   zOperation timed out (r   rU   )r   r  rm   r   r  r   difference_updater   r  r  r  rJ   r  r   r,  r-  )rA   r  r  r  r  r  r  max_iterationsr   ids
cached_idsrQ  r   cached
iterationsr  r  r}  r  r  r
  s                        r9   r  z!BaseKeyValueStoreBackend.get_many  s     #*3$Xs3hXU
G,w (#|3&w/77NN7+  	j)
9D%%dii:>1@56 261F1Fq1I 1@ 'ABFVALLO!!A">q<?">?ggi
U)u%"3'.. ( :0G;"%:7)1#EFFJJx !OJ*">#   1@ #?sO   ?FFFAF+F-F0FA>FF	FFFFc                 D    | j                  | j                  |             y r?   )r  r  r  s     r9   r7  z BaseKeyValueStoreBackend._forget  s    D))'23r;   c                 T   | j                  ||||      }t        |      |d<   | j                  |      }|d   t        j                  k(  r|S 	 | j                  | j                  |      | j                  |      |       |S # t        $ r}	t        t        |	      ||      |	d }	~	ww xY w)N)r   r   r   rP   r   r   )r   r   )
r*  r   rO  r   rP  r  r  r   r   r  )
rA   r   r   r   r   rP   r8   r   current_metaexs
             r9   r2  z&BaseKeyValueStoreBackend._store_result  s    $$F%/8' % K&w/Y ..w7!V^^3M	S  !6!6w!?TARTYZ  ! 	S#CG5'JPRR	Ss   1B 	B'
B""B'c                     | j                  | j                  |      | j                  d|j                         i      t        j
                         |S )Nr   )r  r  r   r   r   rP  r`  s      r9   r_  z$BaseKeyValueStoreBackend._save_group  sA    T33H=![[(FOO4E)FG	Yr;   c                 D    | j                  | j                  |             y r?   )r  r  rW  s     r9   rc  z&BaseKeyValueStoreBackend._delete_group  s    D**845r;   c                     | j                  | j                  |            }|st        j                  ddS | j	                  |      S )$Get task meta-data for a task by id.N)r   r   )rs   r  r   PENDINGr  r   s      r9   rO  z+BaseKeyValueStoreBackend._get_task_meta_for  s>    xx--g67$nn==!!$''r;   c                     | j                  | j                  |            }|r1| j                  |      }|d   }t        || j                        |d<   |S y)r  r   N)rs   r  r  r!   r4   )rA   r   r   r   s       r9   rZ  z'BaseKeyValueStoreBackend._restore_group  sU    xx..x89 ;;t$D(^F.vtxx@DNK	 r;   c                 z    | j                           | j                  j                  | }|j                  |        y )Nr   )r  r4   r   saver  s        r9   r  z*BaseKeyValueStoreBackend._apply_chord_incr  s6    ""$,,,.@A4(r;   c           	         | j                   sy | j                  }|j                  }|sy | j                  |      }	 t	        j
                  ||       }|	 t        |      | j                  |      }|j                  j                  d      }|t!        |      }||kD  rt        j#                  d	|       y ||k(  rt        |j                  |      }
|j$                  r|j&                  n|j(                  }	 t+               5   ||j,                  j.                  d
      }d d d        	 |
j1                         |j=                          | j=                  |       y | j?                  || j@                         y # t        $ rV}	t        |j                  |      }
t        j                  d||	       | j                  |
t        d|	            cY d }	~	S d }	~	ww xY w# t        $ rW}	t        |j                  |      }
t        j                  d||	       | j                  |
t        d| d            cY d }	~	S d }	~	ww xY w# 1 sw Y    xY w# t        $ r@}	t        j                  d||	       | j                  |
t        d|	             Y d }	~	Ud }	~	ww xY w# t        $ r}		 t3        |j5                               }dj7                  ||	      }n# t8        $ r t;        |	      }Y nw xY wt        j                  d||       | j                  |
t        |             Y d }	~	d }	~	ww xY w# |j=                          | j=                  |       w xY w)Nr  r   zChord %r raised: %rzCannot restore group: zChord callback %r raised: %rzGroupResult z no longer existsrr  z/Chord counter incremented too many times for %rT)r  r  zCallback error: zDependency {0.id} raised {1!r})!r  r4   r   r  r   restorer   r   r   logger	exceptionr   r   r   r  rs   r  warningr  join_nativer  r    rd   result_chord_join_timeoutdelaynext_failed_join_reportformatStopIterationreprr  r  ro   )rA   rP   r   r   r8   r4   gidr  depsr   r   valsizejretculpritr   s                    r9   r   z-BaseKeyValueStoreBackend.on_chord_part_return  s   ##hhmm$$S)	&&sD9D < o% iin }}  .<t9D:NNL D[&w}}#>H$($=$=  499A!&( ( # B B"&(C( NN3' C KKT\\*u  	&w}}#>H2C=..3C7;< 	  *7==cB  !?cJ22cU2CDE (( ($ ! $$%:CE// "%5cW#=>   
J'"4#;#;#=>G=DDF % '!#YF'   !6VD++Hj6HII
J* C s   E8 G 6
J  H=J (I
 8	GAGGG	H:#AH5/H:5H:=IJ 
	J5JL& JL& 	L# +KLK# L"K##5LL& L##L& &#M	)r   r  )&rF   rG   rH   r   r  r  r  r  r  r   r  r  rs   r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r7  r2  r_  rc  rO  rZ  r  r   __classcell__)r  s   @r9   r  r  +  s    E(N,O%OO6O@
D?$DF=DFF! 281D1D # ;A:M:M  *.D d4$11$L4 /30
6(
)
D+r;   r  c                       e Zd ZdZy)r-   z/Result backend base class for key/value stores.Nr  r@   r;   r9   r-   r-   B  s    9r;   r-   c                   H    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y)r.   zDummy result backend.c                      y r?   r@   r  s      r9   r   zDisabledBackend.store_resultK  rE   r;   c                 <    t        t        j                               r?   )r;  E_CHORD_NO_BACKENDstriprK  s    r9   r  z%DisabledBackend.ensure_chords_allowedN  s    !"4":":"<==r;   c                 <    t        t        j                               r?   )r;  E_NO_BACKENDr$  r  s      r9   _is_disabledzDisabledBackend._is_disabledQ  s    !,"4"4"677r;   c                      y)Nzdisabled://r@   r  s      r9   r   zDisabledBackend.as_uriT  s    r;   N)rF   rG   rH   r  rm   r   r  r'  r   r>  r  rC  rA  get_task_meta_forr  r  r@   r;   r9   r.   r.   F  sE    F>8 ;GFIF
FZ-.:::8r;   r.   )Tr  r   r,  rH  collectionsr   datetimer   	functoolsr   weakrefr   billiard.einfor   kombu.serializationr   r	   r
   r   rg   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   rF   r  rz   r0   r&  r#  r:   r   r=   rQ   rS   r  r,   BaseDictBackendr  r-   r.   r@   r;   r9   <module>r>     s*      "   ' ( D D ? ; .  > > * #] ] ] b b . ; 'S S >
D!8*- 	H	 2 5  
 G
/ /!B
B B
BJK K\-'+ - T+w T+n:35E :;k ;r;   