
    gΫ                     Z   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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/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ dZA eBdh      ZC e8eD      ZEdZF edd      ZGdZHdZId ZJ G d deK      ZLd  ZM G d! d"      ZN G d# d$      ZO G d% d&eNeO      ZPePZQ G d' d(eN      ZR G d) d*eReO      ZS G d+ d,eP      ZTy)-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timezone)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      U/var/www/html/hubwallet-dev/venv/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      r;   ignorez_nulldict.ignoreE       r=   N)__name__
__module____qualname__rF   __setitem__update
setdefaultrB   r=   r;   r?   r?   D   s     )/.K.&:r=   r?   c                      | y| j                   S NF)ignore_resultrequests    r;   _is_request_ignore_resultrS   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)!r6   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floatrX   thread_safer2   r   _pending_resultsr$   MESSAGE_BUFFER_MAX_pending_messagesurl)rC   r6   rh   max_cached_resultsrs   rq   expires_typer~   r:   rf   cmaxs              r;   __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)rC   include_passwordr~   s      r;   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rC   task_idmetas      r;   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.rQ   N)rS   r   chordon_chord_part_return)rC   r   resultrR   r   states         r;   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.	tracebackrR   r   group_idNr   )r   r   r   iterchainAttributeError	TypeErrortupler   rL   optionsru   idr   r   PROPAGATE_STATESr   errbacks_call_task_errbacks)rC   r   excr   rR   r   call_errbacksr   
chain_data
chain_elemchain_elem_ctxs              r;   mark_as_failurezBackend.mark_as_failure   sh   
 gsE(17  D}}))'5#>%!'--0
 ) J
 ")!4%%n&<&<=$2$:$:$>$>y$I!'5'='='A'A*'M$ !Uf.E.E%E"**6%%&..U"+^ &  n444--neSI;J> !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__rW   r6   is_eagerF)	parent_idroot_id)r   r6   	signature_apphasattrtype
isinstancer   r   r&   appendr   r   r   r   rf   task_always_eagerdelivery_inforu   applyapply_async)	rC   rR   r   r   old_signatureerrbackr   r   gs	            r;   r   zBackend._call_task_errbacks   sM   '' 	.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   )rC   r   reasonrR   r   r   r   s          r;   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   )rC   r   r   r   rR   r   r   s          r;   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   )r6   _taskstaskbackendKeyErrorr   r   ru   dictr   fail_from_current_stackr   	Exception)rC   callbackr   r6   r   fake_requesteb_excs          r;   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rA   )
sysexc_infor	   r   r   tb_frameclearf_localsRuntimeErrortb_next)rC   r   r   type_real_exctbexception_infos          r;   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.rJ   )exc_typeexc_message
exc_module)
rh   EXCEPTION_ABLE_CODECSr*   r   getattrrH   r)   r9   encoderI   )rC   r   rh   exctypes       r;   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   BaseExceptionrh   r   r+   r   r   ru   r   
ValueErrorr(   rH   r   modulessplitr   r   celery
exceptionsr   
issubclassr   r   listr   )
rC   r   er   r   r8   nameexc_msgfake_exc_typeerrs
             r;   exception_to_pythonzBackend.exception_to_pythonO  s   ]+"77+C0JC&>3i WW\*
	::H &($CGkk*-$NN3/ -D!#t,C-
 ''-," #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.r1   )rh   r   r    as_tuplerC   r   s     r;   prepare_valuezBackend.prepare_value  s)    ??h&:fj+I??$$r=   c                 0    | j                  |      \  }}}|S rA   )_encode)rC   data_payloads       r;   r   zBackend.encode  s    T*1gr=   c                 0    t        || j                        S )N)rh   )r
   rh   )rC   r   s     r;   r   zBackend._encode  s    Tdoo66r=   c                 V    |d   | j                   v r| j                  |d         |d<   |S )Nstatusr   )EXCEPTION_STATESr   )rC   r   s     r;   meta_from_decodedzBackend.meta_from_decoded  s1    >T222!55d8nEDNr=   c                 B    | j                  | j                  |            S rA   )r  decoderC   r   s     r;   decode_resultzBackend.decode_result  s    %%dkk'&:;;r=   c                     ||S |xs t        |      }t        || j                  | j                  | j                        S )N)rk   rl   rs   )strr   rk   rl   rs   r  s     r;   r  zBackend.decode  sB    ?N)S\W"&"3"3&*&;&; KK) 	)r=   c                     | | j                   j                  j                  }t        |t              r|j                         }|
|r ||      S |S rA   )r6   rf   result_expiresr   r   total_seconds)rC   valuer   s      r;   rp   zBackend.prepare_expires  sI    =HHMM00EeY''')E;r=   c                 j    ||S | j                   j                  j                  }|| j                  S |S rA   )r6   rf   result_persistent
persistent)rC   enabledr  s      r;   prepare_persistentzBackend.prepare_persistent  s4    NXX]]44
","4tD*Dr=   c                     || j                   v r!t        |t              r| j                  |      S | j	                  |      S rA   )r  r   r   r   r   )rC   r   r   s      r;   encode_resultzBackend.encode_result  s;    D)))j.K))&11!!&))r=   c                     || j                   v S rA   )ro   rC   r   s     r;   	is_cachedzBackend.is_cached  s    $++%%r=   c           	      `   || j                   v r6t        j                  t        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   r9   r:   hostnameretriesr   routing_key)r   r9   r:   workerr  queuestampsstamped_headers)READY_STATESr   nowr   utc	isoformatcurrent_task_childrenr   r   r   r6   rf   find_value_for_keyr   r   ru   r!  rL   r   r   r   )rC   r   r   r   rR   format_dater   r  r   request_metaencode_needed_fieldsfieldr  encoded_values                 r;   _get_result_metazBackend._get_result_meta  s    D%%% X\\2I%//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 J ,U 3(,E(:.:=.IU+J
 L)r=   c                 .    t        j                  |       y rA   )timesleep)rC   amounts     r;   _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   TrR   rW     z%failed to store result on the backend)r   r   N)r  _store_resultr   rv   exception_safe_to_retryrX   r-   rx   rw   r2  r,   r   )
rC   r   r   r   r   rR   r:   r  r   sleep_amounts
             r;   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 rA   )ro   pop_forgetr  s     r;   forgetzBackend.forget#  s     &Wr=   c                     t        d      )Nz"backend does not implement forget.NotImplementedErrorr  s     r;   r:  zBackend._forget'  s    !"FGGr=   c                 *    | j                  |      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                 B    | j                  |      j                  d      S )z$Get the traceback for a failed task.r   r@  ru   r  s     r;   get_tracebackzBackend.get_traceback0  s    !!'*..{;;r=   c                 B    | j                  |      j                  d      S )zGet the result of a task.r   rC  r  s     r;   
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     r;   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.)r6   rf   r   task_store_eager_resultwarningswarnRuntimeWarningrC   s    r;   _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.
        FrB   )rC   r   s     r;   r6  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   TrW   r4  zfailed to get meta)r   Nr   )rO  ro   r   _get_task_meta_forr   rv   r6  rX   r-   rx   rw   r2  r,   r   ru   r   SUCCESS)rC   r   cacher  r   r   r7  s          r;   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rT  N)r@  ro   r  s     r;   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.FrV  N)get_group_metaro   rC   r   s     r;   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rA   )rO  ro   r   _restore_grouprC   r   rT  r   s       r;   rY  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.rV  r   N)rY  r^  s       r;   restore_groupzBackend.restore_group  s)    ""85"9>! r=   c                 &    | j                  ||      S )z&Store the result of an executed group.)_save_grouprC   r   r   s      r;   
save_groupzBackend.save_group  s    &11r=   c                 \    | j                   j                  |d        | j                  |      S rA   )ro   r9  _delete_grouprZ  s     r;   delete_groupzBackend.delete_group  s%    $'!!(++r=   c                      y)zBackend cleanup.NrB   rN  s    r;   cleanupzBackend.cleanup      r=   c                      y)z:Cleanup actions to do at the end of a task worker process.NrB   rN  s    r;   process_cleanupzBackend.process_cleanup  rj  r=   c                     i S rA   rB   )rC   producerr   s      r;   on_task_callzBackend.on_task_call  s    	r=   c                     t        d      )Nz%Backend does not support add_to_chordr=  )rC   chord_idr   s      r;   add_to_chordzBackend.add_to_chord  s    !"IJJr=   c                      y rA   rB   )rC   rR   r   r   r:   s        r;   r   zBackend.on_chord_part_return  rG   r=   c                      y rA   rB   )rC   r   
chord_sizes      r;   set_chord_sizezBackend.set_chord_size  rG   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  rx  )r   r   r   r   ru   r6   amqprouterrouter   tasksr   r   )	rC   header_resultbodyry  r:   r	body_typer  rx  s	            r;   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 rA   rB   rN  s    r;   ensure_chords_allowedzBackend.ensure_chords_allowed  rG   r=   c                 ~    | j                           | j                  j                  | } | j                  ||fi | y rA   )r  r6   r   r  rC   header_result_argsr  r:   r~  s        r;   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 )NrR   r  )r   r   r   )rC   rR   r  s      r;   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 rA   )r<   	__class__rC   r9   r:   s      r;   
__reduce__zBackend.__reduce__  s!    !v 4>>4"@AAr=   )NNNNNNFrA   )TFNN)T)rW   )rB   N)ErH   rI   rJ   r   r"  UNREADY_STATESr  r   subpolling_intervalsupports_native_joinsupports_autoexpirer  retry_policyr   r   r   rS  r   FAILUREr   r   REVOKEDr   RETRYr   r   r   r   r   r   r   r   r  r  r  rp   r  r  r  r-  r2  r   r;  r:  rA  
get_statusrD  rF  rH  rO  r6  r@  rW  r[  rY  r`  rd  rg  ri  rl  ro  rr  r   rv  r  r  r  r&  r  rB   r=   r;   rU   rU   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=   rU   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)rO  resultssetr   r!   r   addget_many)	rC   r   r  r  r  r  r  r  task_idss	            r;   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   )rO  r   wait_forr   _maybe_set_cachemaybe_throw)
rC   r   r  r  r  r  r  r   r  r   s
             r;   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.)rO  r@  r   r"  r/  r0  r   )rC   r   r  r  r  r  time_elapsedr   s           r;   r  zSyncBackendMixin.wait_for  sx     	 %%g.DH~!4!44JJx H$L<72"#=>> r=   c                     |S rA   rB   )rC   r   r4   s      r;   add_pending_resultz#SyncBackendMixin.add_pending_result      r=   c                     |S rA   rB   r   s     r;   remove_pending_resultz&SyncBackendMixin.remove_pending_result  r  r=   c                      yrO   rB   rN  s    r;   is_asynczSyncBackendMixin.is_async  s    r=   )N      ?TNN)Nr  TNNNT)Nr  TNr  )
rH   rI   rJ   r  r  r  r  r  propertyr  rB   r=   r;   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rH   rI   rJ   __doc__rB   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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  )rC   r9   r:   r  s      r;   r   z!BaseKeyValueStoreBackend.__init__2  sh    4::z*,,DJ$)&)""$#55D  r=   c                     | j                   j                  j                  di       j                  dd      }|rC| d| j                   | _        | d| j                   | _        | d| 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   )r6   rf   ru   task_keyprefixgroup_keyprefixchord_keyprefix)rC   r  s     r;   r  z.BaseKeyValueStoreBackend._add_global_keyprefix;  s      88==,,-OQSTXXYkmqr%5$6a8K8K7L"MD&6%7q9M9M8N#OD &6%7q9M9M8N#OD  r=   c                     | j                  | j                        | _        | j                  | j                        | _        | j                  | j                        | _        y rA   )r  r  r  r  rN  s    r;   r  z)BaseKeyValueStoreBackend._encode_prefixesH  sG    "jj)<)<=#zz$*>*>?#zz$*>*>?r=   c                     t        d      )NzMust implement the get method.r=  rC   keys     r;   ru   zBaseKeyValueStoreBackend.getM      !"BCCr=   c                     t        d      )NzDoes not support get_manyr=  )rC   keyss     r;   mgetzBaseKeyValueStoreBackend.mgetP  s    !"=>>r=   c                 &    | j                  ||      S rA   )r  )rC   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=  rC   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Er=   c                     t        d      )NzDoes not implement incrr=  r  s     r;   incrzBaseKeyValueStoreBackend.incr\  s    !";<<r=   c                      y rA   rB   r  s      r;   expirezBaseKeyValueStoreBackend.expire_  rG   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  )rC   r   r  s      r;   get_key_for_taskz)BaseKeyValueStoreBackend.get_key_for_taskb  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  rC   r   r  s      r;   get_key_for_groupz*BaseKeyValueStoreBackend.get_key_for_grouph  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      r;   get_key_for_chordz*BaseKeyValueStoreBackend.get_key_for_chordn  r  r=   c                 f    | j                   } |d      j                  | ||       ||      g      S )Nr   )r  join)rC   prefixr   r  r  s        r;   r  z%BaseKeyValueStoreBackend._get_key_fort  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)rC   r  r  s      r;   _strip_prefixz&BaseKeyValueStoreBackend._strip_prefix{  s^    jjo))4+?+?? 	7F~~f%#CF$566	7 C  r=   c              #   d   K   |D ]'  \  }}|	| j                  |      }|d   |v s"||f ) y w)Nr   )r  )rC   valuesr"  kr  s        r;   _filter_readyz&BaseKeyValueStoreBackend._filter_ready  sD      	#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   )rC   r  r  r"  r  vis          r;   _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   rW   )r   r  ro   r   r  r   difference_updater   r  r  r  rL   r  r   r/  r0  )rC   r  r  r  r  r  r  max_iterationsr"  ids
cached_idsrT  r   cached
iterationsr  r  r  r  r  r  s                        r;   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 rA   )r  r  r  s     r;   r:  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   rR   r   r   )r   r   )
r-  r   rR  r   rS  r  r  r   r   r  )
rC   r   r   r   r   rR   r:   r   current_metaexs
             r;   r5  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   rS  rc  s      r;   rb  z$BaseKeyValueStoreBackend._save_group  sA    T33H=![[(FOO4E)FG	Yr=   c                 D    | j                  | j                  |             y rA   )r  r  rZ  s     r;   rf  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   )ru   r  r   PENDINGr  r   s      r;   rR  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)ru   r  r  r#   r6   )rC   r   r   r   s       r;   r]  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  r6   r   saver  s        r;   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 existsru  z/Chord counter incremented too many times for %rT)r  r  zCallback error: zDependency {0.id} raised {1!r})!r  r6   r   r  r   restorer   r   r   logger	exceptionr   r   r   r  ru   r  warningr  join_nativer  r"   rf   result_chord_join_timeoutdelaynext_failed_join_reportformatStopIterationreprr  r  rq   )rC   rR   r   r   r:   r6   gidr  depsr   r   valsizejretculpritr   s                    r;   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  )&rH   rI   rJ   r   r  r  r  r  r  r   r  r  ru   r  r  r  r  r  r  r  r  r  r  r  r   r"  r  r  r  r:  r5  rb  rf  rR  r]  r  r   __classcell__)r  s   @r;   r  r  +  s    E(N,O%OO6P@
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  rB   r=   r;   r/   r/   @  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)r0   zDummy result backend.c                      y rA   rB   r  s      r;   r   zDisabledBackend.store_resultI  rG   r=   c                 <    t        t        j                               rA   )r>  E_CHORD_NO_BACKENDstriprN  s    r;   r  z%DisabledBackend.ensure_chords_allowedL  s    !"4":":"<==r=   c                 <    t        t        j                               rA   )r>  E_NO_BACKENDr'  r  s      r;   _is_disabledzDisabledBackend._is_disabledO  s    !,"4"4"677r=   c                      y)Nzdisabled://rB   r  s      r;   r   zDisabledBackend.as_uriR  s    r=   N)rH   rI   rJ   r  ro   r   r  r*  r   rA  r  rF  rD  get_task_meta_forr  r  rB   r=   r;   r0   r0   D  sE    F>8 ;GFIF
FZ-.:::8r=   r0   )Ur  r   r/  rK  collectionsr   r   r   r   	functoolsr   weakrefr   billiard.einfor	   kombu.serializationr
   r   r   r   ri   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   rH   r  r|   r2   r)  r&  r<   r   r?   rS   rU   r  r.   BaseDictBackendr  r/   r0   rB   r=   r;   <module>r@     s-      " 2 2  ' ( D D ? ; .  > > * #] ] ] b b . ; 'S S >
D!8*- 	H	 2 5  
 G
/ /!B
B B
BJK K\-'+ - R+w R+j:35E :;k ;r=   