
    >i«                     V   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      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)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                 :     | |dt        j                         i|S )zReturn an unpickled backend.app)r   _get_current_object)clsargskwargss      p/var/www/html/wine-match-dev/backend/winematch-backend/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__rE   __setitem__update
setdefaultrA   r<   r:   r>   r>   D   s     )/.K.&:r<   r>   c                      | y| j                   S NF)ignore_resultrequests    r:   _is_request_ignore_resultrR   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)!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`    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)rB   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rB   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.rP   N)rR   r   chordon_chord_part_return)rB   r   resultrQ   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.	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   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__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   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   )rB   r   reasonrQ   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   )rB   r   r   r   rQ   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   )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    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)rB   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.rI   )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  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   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   ]+"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.r0   )rg   r   r   as_tuplerB   r   s     r:   prepare_valuezBackend.prepare_value  s)    ??h&:fj+I??$$r<   c                 0    | j                  |      \  }}}|S r@   )_encode)rB   data_payloads       r:   r   zBackend.encode  s    T*1gr<   c                 0    t        || j                        S )N)rg   )r	   rg   )rB   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   )rB   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 r@   )r  decoderB   r   s     r:   decode_resultzBackend.decode_result  s    %%dkk'&:;;r<   c                     ||S |xs t        |      }t        || j                  | j                  | j                        S )N)rj   rk   rr   )strr
   rj   rk   rr   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 r@   )r5   re   result_expiresr   r   total_seconds)rB   valuer   s      r:   ro   zBackend.prepare_expires  sI    =HHMM00EeY''')E;r<   c                 j    ||S | j                   j                  j                  }|| j                  S |S r@   )r5   re   result_persistent
persistent)rB   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 r@   )r   r   r   r   r   )rB   r   r   s      r:   encode_resultzBackend.encode_result  s;    D)))j.K))&11!!&))r<   c                     || j                   v S r@   )rn   rB   r   s     r:   	is_cachedzBackend.is_cached  s    $++%%r<   c           	      B   || j                   v r'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   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%//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 r@   )timesleep)rB   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   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  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@   )rn   pop_forgetr  s     r:   forgetzBackend.forget#  s     &Wr<   c                     t        d      )Nz"backend does not implement forget.NotImplementedErrorr  s     r:   r8  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>  rt   r  s     r:   get_tracebackzBackend.get_traceback0  s    !!'*..{;;r<   c                 B    | j                  |      j                  d      S )zGet the result of a task.r   rA  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.)r5   re   r   task_store_eager_resultwarningswarnRuntimeWarningrB   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.
        FrA   )rB   r   s     r:   r4  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   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  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rR  N)r>  rn   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.FrT  N)get_group_metarn   rB   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r@   )rM  rn   r   _restore_grouprB   r   rR  r   s       r:   rW  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.rT  r   N)rW  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rB   r   r   s      r:   
save_groupzBackend.save_group  s    &11r<   c                 \    | j                   j                  |d        | j                  |      S r@   )rn   r7  _delete_grouprX  s     r:   delete_groupzBackend.delete_group  s%    $'!!(++r<   c                      y)zBackend cleanup.NrA   rL  s    r:   cleanupzBackend.cleanup      r<   c                      y)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Jr<   c                      y r@   rA   )rB   rQ   r   r   r9   s        r:   r   zBackend.on_chord_part_return  rF   r<   c                      y r@   rA   )rB   r   
chord_sizes      r:   set_chord_sizezBackend.set_chord_size  rF   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  rv  )r   r   r   r   rt   r5   amqprouterrouter   tasksr   r   )	rB   header_resultbodyrw  r9   r	body_typer  rv  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 r@   rA   rL  s    r:   ensure_chords_allowedzBackend.ensure_chords_allowed  rF   r<   c                 ~    | j                           | j                  j                  | } | j                  ||fi | y r@   )r  r5   r   r  rB   header_result_argsr}  r9   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 )NrQ   r  )r   r   r   )rB   rQ   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 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   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<   rT   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)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      ..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   )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}     	 !&>@ @ }}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.)rM  r>  r   r!  r-  r.  r   )rB   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 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                      yrN   rA   rL  s    r:   is_asynczSyncBackendMixin.is_async  s    r<   )N      ?TNN)Nr  TNNNT)Nr  TNr  )
rG   rH   rI   r  r  r  r  r  propertyr  rA   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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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  )rB   r8   r9   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   )r5   re   rt   task_keyprefixgroup_keyprefixchord_keyprefix)rB   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 r@   )r  r  r  r  rL  s    r:   r  z)BaseKeyValueStoreBackend._encode_prefixesH  sG    "jj)<)<=#zz$*>*>?#zz$*>*>?r<   c                     t        d      )NzMust implement the get method.r;  rB   keys     r:   rt   zBaseKeyValueStoreBackend.getM      !"BCCr<   c                     t        d      )NzDoes not support get_manyr;  )rB   keyss     r:   mgetzBaseKeyValueStoreBackend.mgetP  s    !"=>>r<   c                 &    | j                  ||      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Er<   c                     t        d      )NzDoes not implement incrr;  r  s     r:   incrzBaseKeyValueStoreBackend.incr\  s    !";<<r<   c                      y r@   rA   r  s      r:   expirezBaseKeyValueStoreBackend.expire_  rF   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  )rB   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  rB   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)rB   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)rB   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  )rB   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   )rB   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   rV   )r   r  rn   r   r  r   difference_updater   r  r  r  rK   r  r   r-  r.  )rB   r  r  r  r  r  r  max_iterationsr!  ids
cached_idsrR  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 r@   )r  r  r  s     r:   r8  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   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&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   rQ  ra  s      r:   r`  z$BaseKeyValueStoreBackend._save_group  sA    T33H=![[(FOO4E)FG	Yr<   c                 D    | j                  | j                  |             y r@   )r  r  rX  s     r:   rd  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   )rt   r  r   PENDINGr  r   s      r:   rP  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)rt   r  r  r"   r5   )rB   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  r5   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>                  j=                  |       y | jA                  || jB                         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 }	~	_d }	~	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>                  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 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    ##hhmm$$S)	&&sD9D < o% iin }}  .<t9D:NNL D[&w}}#>H$($=$=  499A(&( ( # B B"&(C( NN3' ""3'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* ""3's   F G$ 6
J   IJ  (I 	G!AGG!G!$	I-AH?9I?IIJ  	J5JL0 JL0  	L-*+KL(K-*L(,K--5L("L0 (L--L0 0-M)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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  rA   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)r/   zDummy result backend.c                      y r@   rA   r  s      r:   r   zDisabledBackend.store_resultI  rF   r<   c                 <    t        t        j                               r@   )r<  E_CHORD_NO_BACKENDstriprL  s    r:   r  z%DisabledBackend.ensure_chords_allowedL  s    !"4":":"<==r<   c                 <    t        t        j                               r@   )r<  E_NO_BACKENDr&  r  s      r:   _is_disabledzDisabledBackend._is_disabledO  s    !,"4"4"677r<   c                      y)Nzdisabled://rA   r  s      r:   r   zDisabledBackend.as_uriR  s    r<   N)rG   rH   rI   r  rn   r   r  r)  r   r?  r  rD  rB  get_task_meta_forr  r  rA   r<   r:   r/   r/   D  sE    F>8 ;GFIF
FZ-.:::8r<   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   r(  r%  r;   r   r>   rR   rT   r  r-   BaseDictBackendr  r.   r/   rA   r<   r:   <module>r?     s*      " (  ' ( 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<   