o
    ›¨Êhg  ã                   @   sÒ  d Z ddl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 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mZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ zddl,Z-ddl.m/Z/ W n e0y•   dZ-dZ/Y nw zddl1Z-W n	 e0y¥   Y nw dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:e$e;ƒZ<G dd „ d e)ƒZ=G d!d"„ d"e+e(ƒZ>e?e-d#dƒrßG d$d%„ d%e-j@jAe-jBƒZCG d&d'„ d'e>ƒZDdS )(zRedis result store backend.é    N)Úcontextmanager)Úpartial)Ú	CERT_NONEÚCERT_OPTIONALÚCERT_REQUIRED)Úunquote)Úretry_over_time)Úcached_property)Ú
_parse_urlÚmaybe_sanitize_url)Ústates)Útask_join_will_block)Úmaybe_signature)ÚBackendStoreErrorÚ
ChordErrorÚImproperlyConfigured)ÚGroupResultÚallow_join_result)Ú_regenÚ
dictfilter)Ú
get_logger)Úhumanize_secondsé   )ÚAsyncBackendMixinÚBaseResultConsumer)ÚBaseKeyValueStoreBackend)Úget_redis_error_classes)ÚRedisBackendÚSentinelBackendzW
You need to install the redis library in order to use the Redis result store backend.
zp
You need to install the redis library with support of sentinel in order to use the Redis result store backend.
zÎ
Setting ssl_cert_reqs=CERT_OPTIONAL when connecting to redis means that celery might not validate the identity of the redis broker when connecting. This leaves you vulnerable to man in the middle attacks.
zÉ
Setting ssl_cert_reqs=CERT_NONE when connecting to redis means that celery will not validate the identity of the redis broker when connecting. This leaves you vulnerable to man in the middle attacks.
z”
SSL connection parameters have been provided but the specified URL scheme is redis://. A Redis SSL connection URL should use the scheme rediss://.
zv
A rediss:// URL must have parameter ssl_cert_reqs and this must be set to CERT_REQUIRED, CERT_OPTIONAL, or CERT_NONE
z+Connection to Redis lost: Retry (%s/%s) %s.z„
Retry limit exceeded while trying to reconnect to the Celery redis result store backend. The Celery application must be restarted.
c                       sŽ   e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ Zedd	„ ƒZd
d„ Z	‡ fdd„Z
dd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚResultConsumerNc                    sF   t ƒ j|i |¤Ž | jj| _| jj| _| jj| _| jj	| _
tƒ | _d S ©N)ÚsuperÚ__init__ÚbackendÚget_key_for_taskÚ_get_key_for_taskÚdecode_resultÚ_decode_resultÚensureÚ_ensureÚconnection_errorsÚ_connection_errorsÚsetÚsubscribed_to©ÚselfÚargsÚkwargs©Ú	__class__© úG/var/www/html/env/lib/python3.10/site-packages/celery/backends/redis.pyr"   S   s   



zResultConsumer.__init__c              
      sh   z| j jj ¡  | jd ur| j ¡  W n ty, } zt t	|ƒ¡ W Y d }~nd }~ww t
ƒ  ¡  d S r    )r#   ÚclientÚconnection_poolÚresetÚ_pubsubÚcloseÚKeyErrorÚloggerÚwarningÚstrr!   Úon_after_fork)r/   Úer2   r4   r5   r?   [   s   

€€ÿzResultConsumer.on_after_forkc                 C   s¬   d | _ | jjj ¡  | jr*| jj | j¡}dd„ |D ƒ}|D ]}|  |  |¡d ¡ q| jjj	dd�| _ | jr?| j j
| jŽ  d S | j j d| j j¡| j _| j j | j j¡ d S )Nc                 S   s   g | ]}|r|‘qS r4   r4   )Ú.0Úmetar4   r4   r5   Ú
<listcomp>k   s    z4ResultConsumer._reconnect_pubsub.<locals>.<listcomp>T©Úignore_subscribe_messagesÚpubsub)r9   r#   r6   r7   r8   r-   ÚmgetÚon_state_changer'   rF   Ú	subscribeÚget_connectionÚ
shard_hintÚ
connectionÚregister_connect_callbackÚ
on_connect)r/   ÚmetasrB   r4   r4   r5   Ú_reconnect_pubsubd   s    ÿÿz ResultConsumer._reconnect_pubsubc                 c   sT   � zd V  W d S  | j y)   z|  | jd¡ W Y d S  | j y(   t t¡ ‚ w w ©Nr4   )r+   r)   rP   r<   ÚcriticalÚE_RETRY_LIMIT_EXCEEDED©r/   r4   r4   r5   Úreconnect_on_error|   s   €
þýz!ResultConsumer.reconnect_on_errorc                 C   s$   |d t jv r|  |d ¡ d S d S )NÚstatusÚtask_id)r   ÚREADY_STATESÚ
cancel_for)r/   rB   r4   r4   r5   Ú_maybe_cancel_ready_task‡   s   ÿz'ResultConsumer._maybe_cancel_ready_taskc                    s   t ƒ  ||¡ |  |¡ d S r    )r!   rH   rZ   )r/   rB   Úmessager2   r4   r5   rH   ‹   s   zResultConsumer.on_state_changec                 K   s    | j jjdd�| _|  |¡ d S )NTrD   )r#   r6   rF   r9   Ú_consume_from)r/   Úinitial_task_idr1   r4   r4   r5   Ústart�   s   ÿzResultConsumer.startc                 K   s.   |j di |¤ŽD ]}|d ur|  |d ¡ qd S rQ   )Ú
_iter_metarH   )r/   Úresultr1   rB   r4   r4   r5   Úon_wait_for_pending•   s
   €þz"ResultConsumer.on_wait_for_pendingc                 C   s   | j d ur| j  ¡  d S d S r    )r9   r:   rT   r4   r4   r5   Ústopš   s   
ÿzResultConsumer.stopc                 C   sž   | j rD|  ¡ �3 | j j|d�}|r*|d dkr2|  |  |d ¡|¡ W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 s=w   Y  d S |rMt |¡ d S d S )N)ÚtimeoutÚtyper[   Údata)r9   rU   Úget_messagerH   r'   ÚtimeÚsleep)r/   rc   r[   r4   r4   r5   Údrain_eventsž   s   
ýþ"þÿzResultConsumer.drain_eventsc                 C   s"   | j d u r
|  |¡S |  |¡ d S r    )r9   r^   r\   ©r/   rW   r4   r4   r5   Úconsume_from§   s   

zResultConsumer.consume_fromc                 C   s^   |   |¡}|| jvr-| j |¡ |  ¡ � | j |¡ W d   ƒ d S 1 s&w   Y  d S d S r    )r%   r-   ÚaddrU   r9   rI   ©r/   rW   Úkeyr4   r4   r5   r\   ¬   s   


"ÿþzResultConsumer._consume_fromc                 C   sZ   |   |¡}| j |¡ | jr+|  ¡ � | j |¡ W d   ƒ d S 1 s$w   Y  d S d S r    )r%   r-   Údiscardr9   rU   Úunsubscriberm   r4   r4   r5   rY   ³   s   

"ÿÿzResultConsumer.cancel_forr    )Ú__name__Ú
__module__Ú__qualname__r9   r"   r?   rP   r   rU   rZ   rH   r^   ra   rb   ri   rk   r\   rY   Ú__classcell__r4   r4   r2   r5   r   P   s     	


	r   c                       sN  e Zd ZdZeZeZerejndZdZdZ	dZ
dZ			d<‡ fdd„	Zdd„ Ze‡ fd	d
„ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zejejfd#d$„Zd%d&„ Z d'd(„ Z!ed)d*„ ƒZ"ed+d,„ ƒZ#	d=d-d.„Z$d/d0„ Z%d1d2„ Z&d3d4„ Z'e(d5d6„ ƒZ)ed7d8„ ƒZ*d>‡ fd:d;„	Z+‡  Z,S )?r   zyRedis task result store.

    It makes use of the following commands:
    GET, MGET, DEL, INCRBY, EXPIRE, SET, SETEX
    NTi    c              	      s  t ƒ jddti|¤Ž | jjj}	| jd u rtt 	¡ ƒ‚|r&d|v r&|d }}|p.|	dƒp.| j
| _
|| _|	dƒ}
|	dƒ}|	dƒ}|	dƒ}|	dƒ}|	d	ƒpLd
|	dƒpQd|	dƒpVd|	dƒ| j
|
o`t|
ƒ|pcd|oht|ƒdœ| _|	dƒ}|rw|| jd< |r~|| jd< |r…|| jd< |	dƒ}|r—| j |¡ | j| jd< |r¡|  || j¡| _d| jv rét| jd tjƒréd}ttttttdœ}| j d|¡}| ||¡}|| ¡ vrÑttƒ‚|tkrÛt t¡ n	|tkrät t¡ || jd< || _trñtƒ nd\| _| _ |  !| | j| j"| j#| j$¡| _%d S )NÚexpires_typez://Úredis_max_connectionsÚredis_socket_timeoutÚredis_socket_connect_timeoutÚredis_retry_on_timeoutÚredis_socket_keepaliveÚ#redis_backend_health_check_intervalÚ
redis_hostÚ	localhostÚ
redis_portië  Úredis_dbr   Úredis_passwordF)ÚhostÚportÚdbÚpasswordÚmax_connectionsÚsocket_timeoutÚretry_on_timeoutÚsocket_connect_timeoutÚredis_usernameÚusernameÚhealth_check_intervalÚsocket_keepaliveÚredis_backend_use_sslÚconnection_classÚMISSING)r   r   r   ÚrequiredÚoptionalÚnoneÚssl_cert_reqs)r4   r4   r4   )&r!   r"   ÚintÚappÚconfÚgetÚredisr   ÚE_REDIS_MISSINGÚstripr…   Ú_ConnectionPoolÚfloatÚ
connparamsÚupdateÚconnection_class_sslÚ_params_from_urlÚ
issubclassÚSSLConnectionr   r   r   ÚvaluesÚ
ValueErrorÚ%E_REDIS_SSL_CERT_REQS_MISSING_INVALIDr<   r=   ÚW_REDIS_SSL_CERT_OPTIONALÚW_REDIS_SSL_CERT_NONEÚurlr   r*   Úchannel_errorsr   ÚacceptÚ_pending_resultsÚ_pending_messagesÚresult_consumer)r/   r�   r‚   rƒ   r„   r…   r¨   r7   r1   Ú_getr†   rˆ   r‡   rŒ   r‹   rŠ   ÚsslÚssl_cert_reqs_missingÚssl_string_to_constantr“   r2   r4   r5   r"   Ò   s†   


ÿý




÷



ÿû



þ

þzRedisBackend.__init__c                    sx  t |ƒ\}}}}}}‰t|fi t||||ˆ dd ¡dœƒ¤Ž‰ |dkrAˆ  | jjd| dœ¡ ˆ  dd ¡ ˆ  dd ¡ ˆ  d¡ n|ˆ d	< g d
¢}	|dkrgt‡ fdd„|	D ƒƒsct‡fdd„|	D ƒƒrgtt	ƒ‚|dkrƒtj
ˆ d< |	D ]}
ˆ |
d ¡}|r‚t|ƒˆ |
< qrˆ  d	¡p‰d}t|tƒr”| d¡n|}t|ƒˆ d	< ˆ ¡ D ]\}}|tjjv r´tjj| |ƒˆ|< q ˆ  ˆ¡ ˆ S )NÚvirtual_host)r�   r‚   rŠ   r„   rƒ   Úsocketú/)rŽ   Úpathr�   r‚   rˆ   rƒ   )Ússl_ca_certsÚssl_certfileÚssl_keyfiler“   r˜   c                 3   ó   � | ]}|ˆ v V  qd S r    r4   ©rA   rn   )r�   r4   r5   Ú	<genexpr>N  ó   € z0RedisBackend._params_from_url.<locals>.<genexpr>c                 3   r¹   r    r4   rº   )Úqueryr4   r5   r»   O  r¼   ÚredissrŽ   r   )r
   Údictr   Úpoprž   r˜   ÚUnixDomainSocketConnectionÚanyr¤   Ú&E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCHr¢   r   r—   Ú
isinstancer>   rš   r”   ÚitemsrL   ÚURL_QUERY_ARGUMENT_PARSERS)r/   r¨   ÚdefaultsÚschemer�   r‚   rŠ   r„   rµ   Ússl_param_keysÚssl_settingÚssl_valrƒ   rn   Úvaluer4   )r�   r½   r5   r    3  sT   ÿþÿþÿ
€
ÿ€
zRedisBackend._params_from_urlc                    s.   t ƒ j}d| jv r| ¡ }| | jd ¡ |S )NÚretry_policy)r!   rÍ   Ú_transport_optionsÚcopyrž   )r/   rÍ   r2   r4   r5   rÍ   j  s
   
zRedisBackend.retry_policyc                 C   s   t ƒ s| j |¡ d S d S r    )r   r­   rk   )r/   ÚproducerrW   r4   r4   r5   Úon_task_calls  s   ÿzRedisBackend.on_task_callc                 C   ó   | j  |¡S r    )r6   r—   ©r/   rn   r4   r4   r5   r—   w  ó   zRedisBackend.getc                 C   rÒ   r    )r6   rG   )r/   Úkeysr4   r4   r5   rG   z  rÔ   zRedisBackend.mgetc                 K   s>   t | jfi |¤Ž}| d¡}t|| j|i t| j|ƒfi |¤ŽS )NÚmax_retries)r¿   rÍ   r—   r   r*   r   Úon_connection_error)r/   Úfunr0   ÚpolicyrÍ   rÖ   r4   r4   r5   r(   }  s   


þýzRedisBackend.ensurec                 C   s*   t |ƒ}t t ¡ ||pdt|dƒ¡ |S )NÚInfzin )Únextr<   ÚerrorÚE_LOSTrš   r   )r/   rÖ   ÚexcÚ	intervalsÚretriesÚttsr4   r4   r5   r×   …  s   þz RedisBackend.on_connection_errorc                 K   s:   t |tƒrt|ƒ| jkrtdƒ‚| j| j||ffi |¤ŽS )Nz!value too large for Redis backend)rÄ   r>   ÚlenÚ_MAX_STR_VALUE_SIZEr   r(   Ú_set)r/   rn   rÌ   rÍ   r4   r4   r5   r,   Œ  s   zRedisBackend.setc                 C   sh   | j  ¡ �%}| jr| || j|¡ n| ||¡ | ||¡ | ¡  W d   ƒ d S 1 s-w   Y  d S r    )r6   ÚpipelineÚexpiresÚsetexr,   ÚpublishÚexecute)r/   rn   rÌ   Úpiper4   r4   r5   rä   ’  s   
"úzRedisBackend._setc                    s   t ƒ  |¡ | j |¡ d S r    )r!   Úforgetr­   rY   rj   r2   r4   r5   rë   ›  s   zRedisBackend.forgetc                 C   s   | j  |¡ d S r    )r6   ÚdeleterÓ   r4   r4   r5   rì   Ÿ  ó   zRedisBackend.deletec                 C   rÒ   r    )r6   ÚincrrÓ   r4   r4   r5   rî   ¢  rÔ   zRedisBackend.incrc                 C   s   | j  ||¡S r    )r6   Úexpire)r/   rn   rÌ   r4   r4   r5   rï   ¥  s   zRedisBackend.expirec                 C   s   | j  |  |d¡d¡ d S )Nú.tr   )r6   rî   Úget_key_for_group)r/   Úgroup_idr`   r4   r4   r5   Úadd_to_chord¨  s   zRedisBackend.add_to_chordc           	      C   sB   ||ƒ\}}}}||v r|   |¡}||v rtd|› d|›�ƒ‚|S )NzDependency z raised )Úexception_to_pythonr   )	r/   ÚtupÚdecodeÚEXCEPTION_STATESÚPROPAGATE_STATESÚ_ÚtidÚstateÚretvalr4   r4   r5   Ú_unpack_chord_result«  s   
z!RedisBackend._unpack_chord_resultc                 C   s   |   |  |d¡|¡ d S )Nú.s)r,   rñ   )r/   rò   Ú
chord_sizer4   r4   r5   Úset_chord_sizeµ  s   zRedisBackend.set_chord_sizec                 K   sF   t |d tƒs| jj|Ž }tdd„ |jD ƒƒr!|j| d� d S d S d S )Nr   c                 s   s   � | ]}t |tƒV  qd S r    )rÄ   r   )rA   Únrr4   r4   r5   r»   Á  s   € z+RedisBackend.apply_chord.<locals>.<genexpr>)r#   )rÄ   r   r•   r   rÂ   ÚresultsÚsave)r/   Úheader_result_argsÚbodyr1   Úheader_resultr4   r4   r5   Úapply_chord¸  s   ýzRedisBackend.apply_chordc                 C   s   | j  dd¡S )NÚresult_chord_orderedT)rÎ   r—   rT   r4   r4   r5   Ú_chord_zsetÄ  s   zRedisBackend._chord_zsetc                 C   s   | j j di ¡S )NÚ result_backend_transport_options)r•   r–   r—   rT   r4   r4   r5   rÎ   È  s   zRedisBackend._transport_optionsc                    s  | j }|j|j|j}}}	|r|sd S |	d u rd}	| j}
|  |d¡}|  |d¡}|  |d¡}|  ||¡}|  d|||g¡}|
 ¡ �G}| j	rS| 
|||	i¡ |dd¡n| ||¡ |¡ |¡ |¡}| jrv| || j¡ || j¡ || j¡}| ¡ d d… \}}}}W d   ƒ n1 sŒw   Y  t|p•dƒ}|�r�z#t|j|d	�}t|ƒ| }||k�r¼t |¡}|d urà| ¡  |jrÁ|jn|j}tƒ � ||jjd
d�}W d   ƒ n1 sÚw   Y  n=| j| j‰ ‰|
 ¡ �}| j	r÷|  |dd¡}n| !|d|¡}| ¡ \}W d   ƒ n	1 �sw   Y  ‡ ‡fdd„|D ƒ}z{z| "|¡ W nK t#�yp } z>t$ %d|j|¡ |  &|t'd|›�ƒ¡W  Y d }~W |
 ¡ �}| (|¡ (|¡ (|¡ ¡  W d   ƒ W S 1 �sew   Y  W S d }~ww W |
 ¡ �}| (|¡ (|¡ (|¡ ¡  W d   ƒ W d S 1 �s‘w   Y  W d S |
 ¡ �}| (|¡ (|¡ (|¡ ¡  W d   ƒ w 1 �s¶w   Y  w W d S  t'�yß } zt$ %d|j|¡ |  &||¡W  Y d }~S d }~w t#�y } zt$ %d|j|¡ |  &|t'd|›�ƒ¡W  Y d }~S d }~ww d S )Nz+infz.jrð   rþ   r   z-infé   r   )r•   T)rc   Ú	propagateéÿÿÿÿc                    s   g | ]}ˆ|ˆ ƒ‘qS r4   r4   )rA   rõ   ©rö   Úunpackr4   r5   rC     s    z5RedisBackend.on_chord_part_return.<locals>.<listcomp>z Chord callback for %r raised: %rzCallback error: zChord %r raised: %rzJoin error: ))r•   ÚidÚgroupÚgroup_indexr6   rñ   Úencode_resultÚencoderå   r	  ÚzaddÚzcountÚrpushÚllenr—   ræ   rï   ré   r”   r   Úchordr   ÚrestoreÚon_readyÚsupports_native_joinÚjoin_nativeÚjoinr   r–   Úresult_chord_join_timeoutrö   rý   ÚzrangeÚlrangeÚdelayÚ	Exceptionr<   Ú	exceptionÚchord_error_from_stackr   rì   )r/   Úrequestrû   r`   r  r1   r•   rú   Úgidr  r6   ÚjkeyÚtkeyÚskeyÚencodedrê   rå   rù   Ú
readycountÚ	totaldiffÚchord_size_bytesÚcallbackÚtotalr  Ú	join_funcÚreslrÞ   r4   r  r5   Úon_chord_part_returnÌ  sÊ   
ÿü


ýô

ÿýþÿ€	
ûÿþ
$û€øÿ
	2û ûÔ2€þ€þÇz!RedisBackend.on_chord_part_returnc                 K   s   |   ¡ | jdi |¤Žd�S )N)r7   r4   )Ú_get_clientÚ	_get_pool©r/   Úparamsr4   r4   r5   Ú_create_client+  s   ÿzRedisBackend._create_clientc                 C   s   | j jS r    )r˜   ÚStrictRedisrT   r4   r4   r5   r4  0  s   zRedisBackend._get_clientc                 K   s   | j di |¤ŽS rQ   )ÚConnectionPoolr6  r4   r4   r5   r5  3  rí   zRedisBackend._get_poolc                 C   s   | j d u r
| jj| _ | j S r    )r›   r˜   r:  rT   r4   r4   r5   r:  6  s   

zRedisBackend.ConnectionPoolc                 C   s   | j di | j¤ŽS rQ   )r8  r�   rT   r4   r4   r5   r6   <  s   zRedisBackend.clientr4   c                    s(   |si n|}t ƒ  |t|| j| jd�¡S )N)ræ   r¨   )r!   Ú
__reduce__r¿   ræ   r¨   r.   r2   r4   r5   r;  @  s   ÿzRedisBackend.__reduce__)NNNNNNNr    )r4   N)-rq   rr   rs   Ú__doc__r   r˜   r¢   rŸ   r…   Úsupports_autoexpirer  rã   r"   r    r	   rÍ   rÑ   r—   rG   r(   r×   r,   rä   rë   rì   rî   rï   ró   r   r÷   rø   rý   r   r  r	  rÎ   r3  r8  r4  r5  Úpropertyr:  r6   r;  rt   r4   r4   r2   r5   r   »   s^    þa7	
þ



ÿ_

r   Úsentinelc                   @   s   e Zd ZdZdS )ÚSentinelManagedSSLConnectionzâConnect to a Redis server using Sentinel + TLS.

        Use Sentinel to identify which Redis server is the current master
        to connect to and when connecting to the Master server, use an
        SSL Connection.
        N)rq   rr   rs   r<  r4   r4   r4   r5   r@  G  s    r@  c                       sf   e Zd ZdZdZeeddƒZerendZ	‡ fdd„Z
d‡ fdd	„	Z‡ fd
d„Zdd„ Zdd„ Z‡  ZS )r   z!Redis sentinel task result store.ú;r?  Nc                    s,   | j d u rtt ¡ ƒ‚tƒ j|i |¤Ž d S r    )r?  r   ÚE_REDIS_SENTINEL_MISSINGrš   r!   r"   r.   r2   r4   r5   r"   [  s   
zSentinelBackend.__init__Fc                    sD   |r	t ƒ j|d�S dd„ | jpd | j¡D ƒ}| j dd„ |D ƒ¡S )zDReturn the server addresses as URIs, sanitizing the password or not.)Úinclude_passwordc                 s   s   � | ]}t |ƒV  qd S r    )r   )rA   Úchunkr4   r4   r5   r»   j  s
   € ÿ
ÿz)SentinelBackend.as_uri.<locals>.<genexpr>Ú c                 s   s*   � | ]}|  d ¡r|dd… n|V  qdS )z:///Nr  )Úendswith)rA   Úurir4   r4   r5   r»   p  s
   € ÿ
ÿ)r!   Úas_urir¨   ÚsplitÚ_SERVER_URI_SEPARATORr  )r/   rC  Ú
uri_chunksr2   r4   r5   rH  a  s   ÿþþzSentinelBackend.as_uric                    s�   |  | j¡}t|g d�}|D ]}tƒ j||d�}|d  |¡ qdD ]}| |¡ q"dD ]}|d rE||d d v rE|d d  |¡||< q,|S )N)Úhosts)r¨   rÇ   rL  )r�   r‚   rƒ   r„   )rƒ   r„   r   )rI  rJ  r¿   r!   r    ÚappendrÀ   r—   )r/   r¨   rÇ   Úchunksr�   rD  re   Úparamr2   r4   r5   r    u  s   ÿ€z SentinelBackend._params_from_urlc                 K   sV   |  ¡ }| d¡}| j dd¡}| j di ¡}| jjdd„ |D ƒf||dœ|¤Ž}|S )NrL  Úmin_other_sentinelsr   Úsentinel_kwargsc                 S   s   g | ]
}|d  |d f‘qS )r�   r‚   r4   )rA   Úcpr4   r4   r5   rC   �  s    z:SentinelBackend._get_sentinel_instance.<locals>.<listcomp>)rP  rQ  )rÏ   rÀ   rÎ   r—   r?  ÚSentinel)r/   r7  r�   rL  rP  rQ  Úsentinel_instancer4   r4   r5   Ú_get_sentinel_instance…  s   
ÿýüz&SentinelBackend._get_sentinel_instancec                 K   s2   | j di |¤Ž}| j dd ¡}|j||  ¡ d�jS )NÚmaster_name)Úservice_nameÚredis_classr4   )rU  rÎ   r—   Ú
master_forr4  r7   )r/   r7  rT  rV  r4   r4   r5   r5  ”  s   þýzSentinelBackend._get_pool)F)rq   rr   rs   r<  rJ  Úgetattrr˜   r?  r@  rŸ   r"   rH  r    rU  r5  rt   r4   r4   r2   r5   r   R  s    r   )Er<  rg   Ú
contextlibr   Ú	functoolsr   r¯   r   r   r   Úurllib.parser   Úkombu.utils.functionalr   Úkombu.utils.objectsr	   Úkombu.utils.urlr
   r   Úceleryr   Úcelery._stater   Úcelery.canvasr   Úcelery.exceptionsr   r   r   Úcelery.resultr   r   Úcelery.utils.functionalr   r   Úcelery.utils.logr   Úcelery.utils.timer   Úasynchronousr   r   Úbaser   Úredis.connectionr˜   Úkombu.transport.redisr   ÚImportErrorÚredis.sentinelÚ__all__r™   rB  r¦   r§   rÃ   r¥   rÝ   rS   rq   r<   r   r   rZ  r?  ÚSentinelManagedConnectionr¢   r@  r   r4   r4   r4   r5   Ú<module>   sh    þÿk   
þ