Yohohohohohooho | Sanrei Aya
Sanrei Aya


Server : LiteSpeed
System : Linux barito.iixcp.rumahweb.net 5.14.0-611.49.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 21 16:39:08 EDT 2026 x86_64
User : elvh3918 ( 1528)
PHP Version : 8.2.31
Disable Function : mail
Directory :  /usr/local/lib/python3.9/site-packages/celery/backends/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/local/lib/python3.9/site-packages/celery/backends/__pycache__/base.cpython-39.pyc
a

��Sh��@sdZddlZddlZddlZddlmZddlmZddlm	Z	ddl
mZddlm
Z
ddlmZmZmZdd	lmZdd
lmZmZddlmZddlZddlmZmZmZmZdd
lm Z ddl!m"Z"ddlm#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*ddl+m,Z,m-Z-m.Z.m/Z/m0Z0ddl1m2Z2ddl3m4Z4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;m<Z<m=Z=ddl>m?Z?dZ@eAdh�ZBe7eC�ZDdZEedd�ZFdZGdZHdd�ZIGdd �d eJ�ZKd!d"�ZLGd#d$�d$�ZMGd%d&�d&�ZNGd'd(�d(eMeN�ZOeOZPGd)d*�d*eM�ZQGd+d,�d,eQeN�ZRGd-d.�d.eO�ZSdS)/z�Result 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)Zconcrete�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.
cCs||dt��i|��S)zReturn an unpickled backend.�app)rZ_get_current_object)�cls�args�kwargs�r5�>/usr/local/lib/python3.9/site-packages/celery/backends/base.py�unpickle_backend?sr7c@s eZdZdd�ZeZZZdS)�	_nulldictcOsdS�Nr5)�self�a�kwr5r5r6�ignoreEsz_nulldict.ignoreN)�__name__�
__module__�__qualname__r=�__setitem__�update�
setdefaultr5r5r5r6r8Dsr8cCs|durdS|jS�NF)Z
ignore_result��requestr5r5r6�_is_request_ignore_resultKsrGc@s*eZdZejZejZejZeZdZdZ	dZ
dZddddd�Zdpdd	�Z
dqd
d�Zdd
�Zddejfdd�Zddddejfdd�Zdd�Zdddejfdd�Zdddejfdd�Zdrdd�Zdsdd�Zdtdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Z d)d*�Z!d+d,�Z"dud-d.�Z#dvd/d0�Z$d1d2�Z%d3d4�Z&dwd5d6�Z'd7d8�Z(dxd9d:�Z)d;d<�Z*d=d>�Z+d?d@�Z,e,Z-dAdB�Z.dCdD�Z/dEdF�Z0dGdH�Z1dIdJ�Z2dydKdL�Z3dMdN�Z4dOdP�Z5dzdQdR�Z6d{dSdT�Z7dUdV�Z8dWdX�Z9dYdZ�Z:d[d\�Z;d]d^�Z<d_d`�Z=dadb�Z>dcdd�Z?d|dedf�Z@dgdh�ZAdidj�ZBd}dkdl�ZCd~dndo�ZDdS)�BackendNFT�r�)�max_retriesZinterval_startZ
interval_stepZinterval_maxcKs||_|jj}	|p|	j|_tj|j\|_|_|_|p:|	j	}
|
dkrJt
�nt|
d�|_|�
||�|_|durr|	jn||_|jdur�|	jn|j|_t|j�|_|	�dd�|_|	�dd�|_|	�dd�|_|	�d	td
��|_|	�dd�|_tit��|_tt�|_||_ dS)N���)�limitZresult_backend_always_retryFZ+result_backend_max_sleep_between_retries_msi'Z,result_backend_base_sleep_between_retries_ms�
Zresult_backend_max_retries�infZresult_backend_thread_safe)!r1�confZresult_serializer�
serializer�serializer_registryZ	_encoders�content_type�content_encoding�encoderZresult_cache_maxr8r"�_cache�prepare_expires�expiresZresult_accept_content�acceptZaccept_contentr	�get�always_retry�max_sleep_between_retries_ms�base_sleep_between_retries_ms�floatrKZthread_safer/rZ_pending_resultsr!�MESSAGE_BUFFER_MAXZ_pending_messages�url)r:r1rQZmax_cached_resultsrYrXZexpires_typer`r4rPZcmaxr5r5r6�__init__os*
�

zBackend.__init__cCs2|r
|jSt|jpd�}|�d�r.|dd�S|S)z=Return the backend as an URI, sanitizing the password or not.�z:///NrL)r`r
�endswith)r:Zinclude_passwordr`r5r5r6�as_uri�szBackend.as_uricKs|�||tj�S)zMark a task as started.)�store_resultrZSTARTED�r:�task_id�metar5r5r6�mark_as_started�szBackend.mark_as_startedcCs:|rt|�s|j||||d�|r6|jr6|�|||�dS)z#Mark task as successfully executed.rEN)rGre�chord�on_chord_part_return)r:rg�resultrFre�stater5r5r6�mark_as_done�s
zBackend.mark_as_donec	Cs�|r|j|||||d�|r�|jr0|�|||�zt|j�}WnttfyZt�}Yn0|D]z}	t|	�}
|
�	|
j
�|
j
�d�|
_|
j
�d�|
_
|r�|tjvr�|
jdur�|j|
j||||
d�d|
j
vr`|�|
||�q`|r�|jr�|�|||�dS)z#Mark task as executed with failure.��	tracebackrFrg�group_idNrj)rerjrk�iter�chain�AttributeError�	TypeError�tuplerrB�optionsrZ�idrrZPROPAGATE_STATESrg�errbacks�_call_task_errbacks)r:rg�excrprFreZ
call_errbacksrmZ
chain_dataZ
chain_elemZchain_elem_ctxr5r5r6�mark_as_failure�s<
�
����

zBackend.mark_as_failurec		Cs�g}|jD]�}|j�|�}|js(|j|_zDt|jd�r`t|jjt�s`t	|jjd�r`||||�n
|�
|�Wq
ty�|�
|�Yq
0q
|r�|j}|j
p�|}t||jd�}|jjjs�|j�dd�r�|j|f||d�n|j|f||d�dS)N�
__header__rJ�r1Zis_eagerF)�	parent_id�root_id)ryr1�	signatureZ_app�hasattr�type�
isinstancer}rr#�appendrrxr�rrP�task_always_eager�
delivery_inforZ�apply�apply_async)	r:rFr{rpZ
old_signatureZerrbackrgr��gr5r5r6rz�s6

�
��

��zBackend._call_task_errbacksrbcCs<t|�}|r |j|||d|d�|r8|jr8|�|||�dS)Nro)rrerjrk)r:rg�reasonrFrermr{r5r5r6�mark_as_revokeds
�
zBackend.mark_as_revokedcCs|j|||||d�S)zfMark task as being retries.

        Note:
            Stores the current exception (if any).
        ro)re)r:rgr{rprFrermr5r5r6�
mark_as_retrys
�zBackend.mark_as_retryc
Cs�|j}z|j|jj}Wnty.|}Yn0t|j�d�|j�dg�t�d�|��}z|�	||d�Wn4t
y�}z|j|j|d�WYd}~Sd}~00|j|j|d�SdS)NrgZ
link_error)rxryr�)r{)
r1Z_tasks�task�backend�KeyErrorrrwrZ�dictrz�	Exception�fail_from_current_stackrx)r:�callbackr{r1r�Zfake_requestZeb_excr5r5r6�chord_error_from_stacks"

��&zBackend.chord_error_from_stackcCst��\}}}z�|dur|n|}t|||f�}|�|||j�|W|dur|z|j��|jjWntyrYn0|j	}qB~S|dur�z|j��|jjWnty�Yn0|j	}q�~n>|dur�z|j��|jjWnty�Yn0|j	}q�~0dSr9)
�sys�exc_inforr|rp�tb_frame�clear�f_locals�RuntimeError�tb_next)r:rgr{�type_Zreal_exc�tbZexception_infor5r5r6r�2s>
�
�
zBackend.fail_from_current_stackcCsL|dur|jn|}|tvr"t|�St|�}t|d|j�t|j|j�|j	d�S)z$Prepare exception for serialization.Nr@)�exc_type�exc_message�
exc_module)
rQ�EXCEPTION_ABLE_CODECSr'r��getattrr>r&r3�encoder?)r:r{rQ�exctyper5r5r6�prepare_exceptionEs�zBackend.prepare_exceptionc

Cs�|sdSt|t�r(|jtvr$t|�}|St|t�stzt|�}Wn4tyr}ztd|���|�WYd}~n
d}~00|�d�}z|d}Wn.ty�}zt	d�|�WYd}~n
d}~00|dur�t
|t�}nPz(tj
|}|�d�D]}t||�}q�Wn&ttf�yt
|tjj�}Yn0|�dd�}t|t��rBt|t��sr|du�rP|n|�d|��}td	|�d
|����z&t|ttf��r�||�}n||�}Wn:t�y�}	z t|�d|�d��}WYd}	~	n
d}	~	00|S)
z1Convert serialized exception to Python exception.NzbIf the stored exception isn't an instance of BaseException, it must be a dictionary.
Instead got: r�r�z5Exception information must include the exception type�.r�rbz!Expected an exception class, got z with payload �(�))r��
BaseExceptionrQr�r(r�rurZr��
ValueErrorr%r>r��modules�splitr�rt�celery�
exceptionsr��
issubclassrrv�listr�)
r:r{�er�r�r2�nameZexc_msgZ
fake_exc_type�errr5r5r6�exception_to_pythonOs^


��
��
�
�
*zBackend.exception_to_pythoncCs |jdkrt|t�r|��S|S)zPrepare value for storage.r.)rQr�r�as_tuple�r:rlr5r5r6�
prepare_value�szBackend.prepare_valuecCs|�|�\}}}|Sr9)�_encode)r:�data�_�payloadr5r5r6r��szBackend.encodecCst||jd�S)N)rQ)rrQ)r:r�r5r5r6r��szBackend._encodecCs$|d|jvr |�|d�|d<|S)N�statusrl)�EXCEPTION_STATESr�)r:rhr5r5r6�meta_from_decoded�szBackend.meta_from_decodedcCs|�|�|��Sr9)r��decode�r:r�r5r5r6�
decode_result�szBackend.decode_resultcCs.|dur|S|pt|�}t||j|j|jd�S)N)rSrTrY)�strrrSrTrYr�r5r5r6r��s�zBackend.decodecCs<|dur|jjj}t|t�r$|��}|dur8|r8||�S|Sr9)r1rPZresult_expiresr�r�
total_seconds)r:�valuer�r5r5r6rW�s

zBackend.prepare_expirescCs(|dur|S|jjj}|dur$|jS|Sr9)r1rPZresult_persistent�
persistent)r:�enabledr�r5r5r6�prepare_persistent�s
zBackend.prepare_persistentcCs(||jvrt|t�r|�|�S|�|�Sr9)r�r�r�r�r�)r:rlrmr5r5r6�
encode_result�s
zBackend.encode_resultcCs
||jvSr9)rV�r:rgr5r5r6�	is_cached�szBackend.is_cachedcCsH||jvr"|j��}|r&|��}nd}||||�|�|d�}|rVt|dd�rV|j|d<|rpt|dd�rp|j|d<|jj�	dd��rD|�rDt|dd�t|dd�t|d	d�t|d
d�t|dd�t
|d�r�|jr�|j�d
�ndd�}	t|dd��r|j
|	d<|	�|j�|�r:dd	h}
|
D]$}|	|}|�|�}
t|
�|	|<�q|�|	�|S)N)r�rlrp�children�	date_donerrqr�extendedrlr�r3r4�hostname�retriesr�Zrouting_key)r�r3r4Zworkerr��queue�stamps�stamped_headers)�READY_STATESr1�now�	isoformat�current_task_childrenr�rrrPZfind_value_for_keyr�r�rZr�rBr�r�r)r:rlrmrprFZformat_dater�r�rhZrequest_metaZencode_needed_fields�fieldr�Z
encoded_valuer5r5r6�_get_result_meta�sN


�






���



zBackend._get_result_metacCst�|�dSr9)�time�sleep)r:�amountr5r5r6�_sleep�szBackend._sleepc

Ks�|�||�}d}z"|j||||fd|i|��|WSty�}zf|jr�|�|�r�||jkr�|d7}t|j||jd�d}	|�	|	�q�t
td||d��n�WYd}~qd}~00qdS)	z�Update 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.
        rrFrJT��z%failed to store result on the backend)rgrmN)r��
_store_resultr�r[�exception_safe_to_retryrKr*r]r\r�r)r)
r:rgrlrmrprFr4r�r{�sleep_amountr5r5r6res0��
���zBackend.store_resultcCs|j�|d�|�|�dSr9)rV�pop�_forgetr�r5r5r6�forget#szBackend.forgetcCstd��dS)Nz"backend does not implement forget.��NotImplementedErrorr�r5r5r6r�'szBackend._forgetcCs|�|�dS)zGet the state of a task.r�)�
get_task_metar�r5r5r6�	get_state*szBackend.get_statecCs|�|��d�S)z$Get the traceback for a failed task.rp�r�rZr�r5r5r6�
get_traceback0szBackend.get_tracebackcCs|�|��d�S)zGet the result of a task.rlr�r�r5r5r6�
get_result4szBackend.get_resultcCs(z|�|�dWSty"Yn0dS)z(Get the list of subtasks sent by a task.r�N)r�r�r�r5r5r6�get_children8szBackend.get_childrencCs$|jjjr |jjjs t�dt�dS)Nz�Results are not stored in backend and should not be retrieved when task_always_eager is enabled, unless task_store_eager_result is enabled.)r1rPr�Ztask_store_eager_result�warnings�warn�RuntimeWarning�r:r5r5r6�_ensure_not_eager?s
�zBackend._ensure_not_eagercCsdS)aCheck 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.
        Fr5)r:r{r5r5r6r�GszBackend.exception_safe_to_retryc
Cs�|��|r,z|j|WSty*Yn0d}z|�|�}Wq�Wq0ty�}zd|jr�|�|�r�||jkr�|d7}t|j	||j
d�d}|�|�q�tt
d|d��n�WYd}~q0d}~00q0|r�|�d�tjkr�||j|<|S)	z�Get 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.
        rrJTr�zfailed to get meta)rgNr�)r�rVr��_get_task_meta_forr�r[r�rKr*r]r\r�r)rrZr�SUCCESS)r:rg�cacher�rhr{r�r5r5r6r�Qs8

��
�
zBackend.get_task_metacCs|j|dd�|j|<dS)z;Reload task result, even if it has been previously fetched.F�r�N)r�rVr�r5r5r6�reload_task_resultxszBackend.reload_task_resultcCs|j|dd�|j|<dS)z<Reload group result, even if it has been previously fetched.Fr�N)�get_group_metarV�r:rqr5r5r6�reload_group_result|szBackend.reload_group_resultcCsP|��|r,z|j|WSty*Yn0|�|�}|rL|durL||j|<|Sr9)r�rVr��_restore_group�r:rqr�rhr5r5r6r��s

zBackend.get_group_metacCs|j||d�}|r|dSdS)zGet the result for a group.r�rlN)r�r�r5r5r6�
restore_group�szBackend.restore_groupcCs|�||�S)z&Store the result of an executed group.)�_save_group�r:rqrlr5r5r6�
save_group�szBackend.save_groupcCs|j�|d�|�|�Sr9)rVr��
_delete_groupr�r5r5r6�delete_group�szBackend.delete_groupcCsdS)zBackend cleanup.Nr5r�r5r5r6�cleanup�szBackend.cleanupcCsdS)z:Cleanup actions to do at the end of a task worker process.Nr5r�r5r5r6�process_cleanup�szBackend.process_cleanupcCsiSr9r5)r:Zproducerrgr5r5r6�on_task_call�szBackend.on_task_callcCstd��dS)Nz%Backend does not support add_to_chordr�)r:Zchord_idrlr5r5r6�add_to_chord�szBackend.add_to_chordcKsdSr9r5)r:rFrmrlr4r5r5r6rk�szBackend.on_chord_part_returncCsdSr9r5)r:rq�
chord_sizer5r5r6�set_chord_size�szBackend.set_chord_sizecKs�dd�|D�|d<zt|dd�}Wnty8d}Yn0|j�dt|dd��}|durr|jjj�||j�dj}|j�dt|dd��}|jj	dj
|j|f||||d	�dS)
NcSsg|]}|���qSr5�r���.0�rr5r5r6�
<listcomp>��z1Backend.fallback_chord_unlock.<locals>.<listcomp>rlr�r��priorityrzcelery.chord_unlock)�	countdownr�r)r�rrwrZr1ZamqpZrouterZrouter��tasksr�rx)r:�
header_result�bodyrr4Z	body_typer�rr5r5r6�fallback_chord_unlock�s

�zBackend.fallback_chord_unlockcCsdSr9r5r�r5r5r6�ensure_chords_allowed�szBackend.ensure_chords_allowedcKs,|��|jj|�}|j||fi|��dSr9)rr1rr�r:Zheader_result_argsrr4rr5r5r6�apply_chord�szBackend.apply_chordcCs0|ptt�dd�}|r,dd�t|dg�D�SdS)NrFcSsg|]}|���qSr5rr	r5r5r6r�r
z1Backend.current_task_children.<locals>.<listcomp>r�)r�r)r:rFr5r5r6r��szBackend.current_task_childrenr5cCs|sin|}t|j||ffSr9)r7�	__class__�r:r3r4r5r5r6�
__reduce__�szBackend.__reduce__)NNNNNN)F)N)N)N)N)N)TF)NN)T)T)T)rJ)N)r5N)Er>r?r@rr�ZUNREADY_STATESr�rZsubpolling_interval�supports_native_joinZsupports_autoexpirer�Zretry_policyrardrir�rn�FAILUREr|rzZREVOKEDr��RETRYr�r�r�r�r�r�r�r�r�r�r�rWr�r�r�r�r�rer�r�r��
get_statusr�r�r�r�r�r�r�r�r�r�r�rrrrrrkrrrrr�rr5r5r5r6rHQs���

	�
	�
8.�
	�





G	
	
�
3�
"

'



rHc@sHeZdZddd�Zddd�Zddd	�Zddd�Zd
d�Zedd��Z	dS)�SyncBackendMixinN��?Tc	csl|��|j}|sdSt�}|D]*}t|t�r>|j|jfVq |�|j�q |j||||||d�EdHdS)N)�timeout�interval�no_ack�
on_message�on_interval)r��results�setr�rrx�add�get_many)	r:rlr r!r"r#r$r%�task_idsr5r5r6�iter_native�s
�zSyncBackendMixin.iter_nativec	
CsN|��|durtd��|j|j||||d�}	|	rJ|�|	�|j||d�SdS)Nz,Backend does not support on_message callback)r r!r$r")�	propagater�)r�r�wait_forrxZ_maybe_set_cacheZmaybe_throw)
r:rlr r!r"r#r$r�r+rhr5r5r6�wait_for_pending�s��
z!SyncBackendMixin.wait_for_pendingcCs^|��d}|�|�}|dtjvr(|S|r2|�t�|�||7}|r||krtd��qdS)aLWait 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.
        gr�zThe operation timed out.N)r�r�rr�r�r�r)r:rgr r!r"r$Ztime_elapsedrhr5r5r6r,�s

zSyncBackendMixin.wait_forFcCs|Sr9r5)r:rlr0r5r5r6�add_pending_resultsz#SyncBackendMixin.add_pending_resultcCs|Sr9r5r�r5r5r6�remove_pending_resultsz&SyncBackendMixin.remove_pending_resultcCsdSrDr5r�r5r5r6�is_asyncszSyncBackendMixin.is_async)NrTNN)NrTNNNT)NrTN)F)
r>r?r@r*r-r,r.r/�propertyr0r5r5r5r6r�s�
�
�

rc@seZdZdZdS)r+z"Base (synchronous) result backend.N�r>r?r@�__doc__r5r5r5r6r+$sr+cs eZdZeZdZdZdZdZ�fdd�Z	dd�Z
d	d
�Zdd�Zd
d�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd=dd�Zd>dd�Zd?dd�Zd@d d!�Zd"d#�Zejfd$d%�Zejfd&d'�Zd(d)d*d(d(d(ejfd+d,�Zd-d.�ZdAd/d0�Zd1d2�Zd3d4�Z d5d6�Z!d7d8�Z"d9d:�Z#d;d<�Z$�Z%S)B�BaseKeyValueStoreBackendzcelery-task-meta-zcelery-taskset-meta-z
chord-unlock-FcsJt|jd�r|jj|_t�j|i|��|��|��|jrF|j|_	dS)N�__func__)
r��key_tr5�superra�_add_global_keyprefix�_encode_prefixes�implements_incr�_apply_chord_incrrr�rr5r6ra2s
z!BaseKeyValueStoreBackend.__init__cCsd|jj�di��dd�}|r`|ddvr0|d7}|�|j��|_|�|j��|_|�|j��|_dS)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.
        Z result_backend_transport_options�global_keyprefixNrLz:_-.r�)r1rPrZ�task_keyprefix�group_keyprefix�chord_keyprefix)r:r=r5r5r6r8;sz.BaseKeyValueStoreBackend._add_global_keyprefixcCs.|�|j�|_|�|j�|_|�|j�|_dSr9)r6r>r?r@r�r5r5r6r9Jsz)BaseKeyValueStoreBackend._encode_prefixescCstd��dS)NzMust implement the get method.r��r:�keyr5r5r6rZOszBaseKeyValueStoreBackend.getcCstd��dS)NzDoes not support get_manyr�)r:�keysr5r5r6�mgetRszBaseKeyValueStoreBackend.mgetcCs|�||�Sr9)r&)r:rBr�rmr5r5r6�_set_with_stateUsz(BaseKeyValueStoreBackend._set_with_statecCstd��dS)NzMust implement the set method.r��r:rBr�r5r5r6r&XszBaseKeyValueStoreBackend.setcCstd��dS)Nz Must implement the delete methodr�rAr5r5r6�delete[szBaseKeyValueStoreBackend.deletecCstd��dS)NzDoes not implement incrr�rAr5r5r6�incr^szBaseKeyValueStoreBackend.incrcCsdSr9r5rFr5r5r6�expireaszBaseKeyValueStoreBackend.expirerbcCs$|std|�d���|�|j||�S)z#Get the cache key for a task by id.ztask_id must not be empty. Got �	 instead.)r��_get_key_forr>)r:rgrBr5r5r6�get_key_for_taskdsz)BaseKeyValueStoreBackend.get_key_for_taskcCs$|std|�d���|�|j||�S)z$Get the cache key for a group by id.� group_id must not be empty. Got rJ)r�rKr?�r:rqrBr5r5r6�get_key_for_groupjsz*BaseKeyValueStoreBackend.get_key_for_groupcCs$|std|�d���|�|j||�S)z?Get the cache key for the chord waiting on group with given id.rMrJ)r�rKr@rNr5r5r6�get_key_for_chordpsz*BaseKeyValueStoreBackend.get_key_for_chordcCs"|j}|d��|||�||�g�S)Nrb)r6�join)r:�prefixrxrBr6r5r5r6rKvs�z%BaseKeyValueStoreBackend._get_key_forcCsF|�|�}|j|jfD]&}|�|�rt|t|�d��Sqt|�S)zTake bytes: emit string.N)r6r>r?�
startswithr�len)r:rBrRr5r5r6�
_strip_prefix}s


z&BaseKeyValueStoreBackend._strip_prefixccs:|D]0\}}|dur|�|�}|d|vr||fVqdS)Nr�)r�)r:�valuesr��kr�r5r5r6�
_filter_ready�s

z&BaseKeyValueStoreBackend._filter_readycsJt|d�r(�fdd���|��|�D�S�fdd���t|�|�D�SdS)N�itemscsi|]\}}��|�|�qSr5)rU)r
rW�vr�r5r6�
<dictcomp>�s�z=BaseKeyValueStoreBackend._mget_to_results.<locals>.<dictcomp>csi|]\}}t�|�|�qSr5�r)r
�irZ)rCr5r6r[�s�)r�rXrY�	enumerate)r:rVrCr�r5)rCr:r6�_mget_to_results�s

�
�z)BaseKeyValueStoreBackend._mget_to_resultsNrTc		#sd|durdn|}t|t�r|nt|�}	t�}
�j}|	D]H}z||}
WntyXYq60|
d|vr6t|�|
fV|
�|�q6|	�|
�d}|	�r`t|	�}����	�fdd�|D��||�}|�
|�|	�dd�|D��|��D]&\}}|dur�||�t|�|fVq�|�r0|||k�r0td|�d	���|�r<|�t
�|�|d
7}|r�||kr��q`q�dS)Nrr�rcsg|]}��|��qSr5)rL)r
rWr�r5r6r�s�z5BaseKeyValueStoreBackend.get_many.<locals>.<listcomp>cSsh|]}t|��qSr5r\)r
rZr5r5r6�	<setcomp>�r
z4BaseKeyValueStoreBackend.get_many.<locals>.<setcomp>zOperation timed out (r�rJ)r�r&rVr�rr'�difference_updater�r_rDrBrYrr�r�)r:r)r r!r"r#r$Zmax_iterationsr��idsZ
cached_idsr�rg�cachedZ
iterationsrCrrBr�r5r�r6r(�sF
��

z!BaseKeyValueStoreBackend.get_manycCs|�|�|��dSr9)rGrLr�r5r5r6r��sz BaseKeyValueStoreBackend._forgetc

Ks�|j||||d�}t|�|d<|�|�}|dtjkr:|Sz|�|�|�|�|�|�Wn8ty�}	z tt	|	�||d�|	�WYd}	~	n
d}	~	00|S)N)rlrmrprFrgr�)rmrg)
r�rr�rr�rErLr�rr�)
r:rgrlrmrprFr4rhZcurrent_meta�exr5r5r6r��s�
*z&BaseKeyValueStoreBackend._store_resultcCs(|�|�|�|�d|��i�tj�|S)Nrl)rErOr�r�rr�r�r5r5r6r��s�z$BaseKeyValueStoreBackend._save_groupcCs|�|�|��dSr9)rGrOr�r5r5r6r�sz&BaseKeyValueStoreBackend._delete_groupcCs*|�|�|��}|s tjdd�S|�|�S)�$Get task meta-data for a task by id.N)r�rl)rZrLr�PENDINGr�rfr5r5r6r��sz+BaseKeyValueStoreBackend._get_task_meta_forcCs>|�|�|��}|r:|�|�}|d}t||j�|d<|SdS)rerlN)rZrOr�r r1)r:rqrhrlr5r5r6r��s
z'BaseKeyValueStoreBackend._restore_groupcKs$|��|jj|�}|j|d�dS)N�r�)rr1r�saverr5r5r6r;�sz*BaseKeyValueStoreBackend._apply_chord_incrcKs�|js
dS|j}|j}|sdS|�|�}ztj||d�}WnVty�}	z>t|j|d�}
t	�
d||	�|�|
td|	����WYd}	~	Sd}	~	00|du�rzt
|��WnZt
�y}	z@t|j|d�}
t	�
d||	�|�|
td|�d���WYd}	~	Sd}	~	00|�|�}|j�d�}|du�r,t|�}||k�rFt	�d	|��n�||k�r�t|j|d�}
|j�rl|jn|j}
�z,z<t�� |
|jjd
d�}Wd�n1�s�0YWn~t�y0}	zdzt|���}d�||	�}Wnt�y�t|	�}Yn0t	�
d||�|�|
t|��WYd}	~	ndd}	~	00z|
�|�WnJt�y�}	z0t	�
d||	�|�|
td
|	����WYd}	~	n
d}	~	00W|��|�|�n|��|�|�0n|�||j �dS)Nrgr~zChord %r raised: %rzCannot restore group: zChord callback %r raised: %rzGroupResult z no longer existsrz/Chord counter incremented too many times for %rT)r r+zDependency {0.id} raised {1!r}zCallback error: )!r:r1rrPr�restorer�rrj�logger�	exceptionr�rr�rHrZrT�warningrZjoin_nativerQrrPZresult_chord_join_timeout�nextZ_failed_join_report�format�
StopIteration�repr�delayrGrIrX)r:rFrmrlr4r1�gidrB�depsr{r��val�size�j�retZculpritr�r5r5r6rk�s�
�
�


�
�*�&��z-BaseKeyValueStoreBackend.on_chord_part_return)rb)rb)rb)rb)NN)&r>r?r@rr6r>r?r@r:rar8r9rZrDrEr&rGrHrIrLrOrPrKrUrr�rXr_r(r�r�r�rr�r�r;rk�
__classcell__r5r5r<r6r4+sF	



�
&�
r4c@seZdZdZdS)r,z/Result backend base class for key/value stores.Nr2r5r5r5r6r,Bsr,c@sPeZdZdZiZdd�Zdd�Zdd�Zdd	�ZeZ	Z
ZZeZ
ZZd
S)r-zDummy result backend.cOsdSr9r5rr5r5r6reKszDisabledBackend.store_resultcCstt����dSr9)r��E_CHORD_NO_BACKEND�stripr�r5r5r6rNsz%DisabledBackend.ensure_chords_allowedcOstt����dSr9)r��E_NO_BACKENDrzrr5r5r6�_is_disabledQszDisabledBackend._is_disabledcOsdS)Nzdisabled://r5rr5r5r6rdTszDisabledBackend.as_uriN)r>r?r@r3rVrerr|rdr�rr�r�Zget_task_meta_forr,r(r5r5r5r6r-Fsr-)Tr3r�r�r��collectionsr�datetimer�	functoolsr�weakrefrZbilliard.einforZkombu.serializationrrr	r
rRZkombu.utils.encodingrrZkombu.utils.urlr
Zcelery.exceptionsr�rrrrZ
celery._staterZcelery.app.taskrrrrrrrrrZ
celery.resultrrrrr Zcelery.utils.collectionsr!Zcelery.utils.functionalr"r#Zcelery.utils.logr$Zcelery.utils.serializationr%r&r'r(r)Zcelery.utils.timer*�__all__�	frozensetr�r>rjr_r/r{ryr7r�r8rGrHrr+ZBaseDictBackendr4r,r-r5r5r5r6�<module>s^(



N

Yohohohohohooho | Sanrei Aya