
    gg                     0   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+ 	 ddl,Z-ddl.m/Z/ 	 ddl1Z-dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ: e$e;      Z< G d d e)      Z= G d! d"e+e(      Z> e?e-d#d      r* G d$ d%e-j                  j                  e-j                        ZC G d& d'e>      ZDy# e0$ r dZ-dZ/Y w xY w# e0$ r Y w xY w)(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                   ~     e Zd ZdZ fdZ fdZd Zed        Zd Z	 fdZ
d Zd	 Zd
 ZddZd Zd Zd Z xZS )ResultConsumerNc                    t        |   |i | | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        | j                  j                  | _
        t               | _        y 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__s      V/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/celery/backends/redis.pyr%   zResultConsumer.__init__S   sf    $)&)!%!>!>"ll88||**"&,,"@"@ U    c                 4   	 | j                   j                  j                  j                          | j                  | j                  j                          t        | -          y # t        $ r(}t        j                  t        |             Y d }~;d }~ww xY wr#   )r&   clientconnection_poolreset_pubsubcloseKeyErrorloggerwarningstrr$   on_after_fork)r2   er5   s     r6   rB   zResultConsumer.on_after_fork[   sp    	#LL//557||'""$ 	  	#NN3q6""	#s   AA& &	B/BBc                    d | _         | j                  j                  j                  j	                          | j
                  ri| j                  j                  j                  | j
                        }|D cg c]  }|s|	 }}|D ]#  }| j                  | j                  |      d        % | j                  j                  j                  d      | _         | j
                  r$ | j                   j                  | j
                    y | j                   j                  j                  d| j                   j                        | j                   _        | j                   j                  j                  | j                   j                         y c c}w )NTignore_subscribe_messagespubsub)r<   r&   r9   r:   r;   r0   mgeton_state_changer*   rG   	subscribeget_connection
shard_hint
connectionregister_connect_callback
on_connect)r2   metasmetas      r6   _reconnect_pubsubz ResultConsumer._reconnect_pubsubd   s3   ++113 LL'',,T-?-?@E&+4dtT4E4 F$$T%8%8%>EF||**11&* 2 
 "DLL""D$6$67&*ll&B&B&Q&Q$,,11'DLL#
 LL##==dll>U>UV 5s   5F	=F	c              #      K   	 d  y # | j                   $ rM 	 | j                  | j                  d       Y y # | j                   $ r t        j	                  t
                w xY ww xY wwN )r.   r,   rR   r?   criticalE_RETRY_LIMIT_EXCEEDEDr2   s    r6   reconnect_on_errorz!ResultConsumer.reconnect_on_error|   s`     	&& 	T33R8**  67	s-   A(	 A(A%7A(*A!!A%%A(c                 X    |d   t         j                  v r| j                  |d          y y )Nstatustask_id)r   READY_STATES
cancel_for)r2   rQ   s     r6   _maybe_cancel_ready_taskz'ResultConsumer._maybe_cancel_ready_task   s)    >V000OODO, 1r7   c                 H    t         |   ||       | j                  |       y r#   )r$   rI   r_   )r2   rQ   messager5   s      r6   rI   zResultConsumer.on_state_change   s     g.%%d+r7   c                 |    | j                   j                  j                  d      | _        | j	                  |       y )NTrE   )r&   r9   rG   r<   _consume_from)r2   initial_task_idr4   s      r6   startzResultConsumer.start   s6    ||**11&* 2 
 	?+r7   c                 \     |j                   di |D ]  }|| j                  |d         y rT   )
_iter_metarI   )r2   resultr4   rQ   s       r6   on_wait_for_pendingz"ResultConsumer.on_wait_for_pending   s7    %F%%// 	1D$$T40	1r7   c                 R    | j                   | j                   j                          y y r#   )r<   r=   rX   s    r6   stopzResultConsumer.stop   s!    <<#LL  $r7   c                 ,   | j                   rd| j                         5  | j                   j                  |      }|r,|d   dk(  r$| j                  | j	                  |d         |       d d d        y |rt        j                  |       y y # 1 sw Y   y xY w)N)timeouttypera   data)r<   rY   get_messagerI   r*   timesleep)r2   rm   ra   s      r6   drain_eventszResultConsumer.drain_events   s    <<((* X,,2272Cwv);(()<)<WV_)MwWX X JJw 	X Xs   AB

Bc                 `    | j                   | j                  |      S | j                  |       y r#   )r<   re   rc   )r2   r\   s     r6   consume_fromzResultConsumer.consume_from   s)    <<::g&&7#r7   c                     | j                  |      }|| j                  vrP| j                  j                  |       | j                         5  | j                  j                  |       d d d        y y # 1 sw Y   y xY wr#   )r(   r0   addrY   r<   rJ   r2   r\   keys      r6   rc   zResultConsumer._consume_from   sq    $$W-d(((""3'((* ,&&s+, , ), ,s   A11A:c                     | j                  |      }| j                  j                  |       | j                  r5| j	                         5  | j                  j                  |       d d d        y y # 1 sw Y   y xY wr#   )r(   r0   discardr<   rY   unsubscriberx   s      r6   r^   zResultConsumer.cancel_for   sj    $$W-""3'<<((* .((-. . . .s   	A//A8r#   )__name__
__module____qualname__r<   r%   rB   rR   r   rY   r_   rI   re   ri   rk   rs   ru   rc   r^   __classcell__r5   s   @r6   r!   r!   P   sY    G# W0  -,,1
! $
,.r7   r!   c                   p    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	Zd Ze fd       Zd Zd	 Zd
 Zd Zd Zd Zd Z fdZd Zd Zd Zd Zej:                  ej<                  fdZd Z d Z!ed        Z"ed        Z#	 d!dZ$d Z%d Z&d Z'e(d        Z)ed        Z*d" fd	Z+ xZ,S )#r   zyRedis task result store.

    It makes use of the following commands:
    GET, MGET, DEL, INCRBY, EXPIRE, SET, SETEX
    NTi    c           
      (   t        |   ddt        i| | j                  j                  j
                  }	| j                  t        t        j                               |rd|v r|d }}|xs  |	d      xs | j                  | _
        || _         |	d      }
 |	d      } |	d      } |	d      } |	d      } |	d	      xs d
 |	d      xs d |	d      xs d |	d      | j                  |
xr t        |
      |xs d|xr t        |      d| _         |	d      }|r|| j                  d<   |r|| j                  d<   |r|| j                  d<    |	d      }|r4| j                  j                  |       | j                  | j                  d<   |r!| j!                  || j                        | _        d| j                  v rt#        | j                  d   t        j$                        rd}t&        t(        t*        t&        t(        t*        d}| j                  j                  d|      }|j                  ||      }||j-                         vrt/        t0              |t(        k(  rt2        j5                  t6               n"|t*        k(  rt2        j5                  t8               || j                  d<   || _        t<        r
t=               nd\  | _        | _         | jC                  | | j                  | jD                  | jF                  | jH                        | _%        y )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)rU   rU   rU   )&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)r2   r   r   r   r   r   r   r:   r4   _getr   r   r   r   r   r   sslssl_cert_reqs_missingssl_string_to_constantr   r5   s                       r6   r%   zRedisBackend.__init__   s    	4c4V4xx}}  ::&'<'<'>??ETMdC  !()!   	  /45!%&D!E 89 89 $%J K &5+&.$z"'a-.#33,F~1F 0 9E&H51G+H

 () +3DOOJ' 7LDOO34 2BDOO./
 *+OO""3'262K2KDOO./"33CIDO
 $//14??+=>@S@ST$-!7D7D3<2?2?.7&9" !OO//AVWM266}mTM$:$A$A$CC !FGG-89)+45/<DOOO, *A#% 	4 3  $22$((DKK!!4#9#9 
r7   c                    t        |      \  }}}}}}t        |fi t        ||||j                  dd       d      |dk(  raj	                  | j
                  j                  d|z   d       j                  dd        j                  dd        j                  d       n|d	<   g d
}	|dk(  r7t        fd|	D              st        fd|	D              rt        t              |dk(  r=t
        j                  d<   |	D ]%  }
j                  |
d       }|st        |      |
<   ' j                  d	      xs d}t        |t              r|j                  d      n|}t!        |      d	<   j#                         D ]G  \  }}|t
        j$                  j&                  v s#t        j$                  j&                  |   |      |<   I j	                         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   &   K   | ]  }|v  
 y wr#   rU   ).0ry   r   s     r6   	<genexpr>z0RedisBackend._params_from_url.<locals>.<genexpr>N  s     @#C:%@   c              3   &   K   | ]  }|v  
 y wr#   rU   )r   ry   querys     r6   r   z0RedisBackend._params_from_url.<locals>.<genexpr>O  s     ?u?r   redissr   r   )r   dictr   popr   r   UnixDomainSocketConnectionanyr   &E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCHr   r   r   
isinstancerA   r   r   itemsrM   URL_QUERY_ARGUMENT_PARSERS)r2   r   defaultsschemer   r   r   r   r   ssl_param_keysssl_settingssl_valr   ry   valuer   r   s                  @@r6   r   zRedisBackend._params_from_url3  s   >Ho;dHhe
"d$EIInd,K$M N

 X $(JJ$I$Id
 
 NN64(NN64(NN34#Jt+ W@@@??? !GHHX-2-@-@J)*  . ?))K6.5g.>J{+? ^^D!&Q(S1RXXc]rr7
4++- 	JCe&&AAA"--HHMc
	 	% r7   c                     t         |   }d| j                  v r.|j                         }|j	                  | j                  d          |S )Nretry_policy)r$   r   _transport_optionscopyr   )r2   r   r5   s     r6   r   zRedisBackend.retry_policyj  sH    w+T444',,.L 7 7 GHr7   c                 P    t               s| j                  j                  |       y y r#   )r   r   ru   )r2   producerr\   s      r6   on_task_callzRedisBackend.on_task_calls  s!    #%  --g6 &r7   c                 8    | j                   j                  |      S r#   )r9   r   r2   ry   s     r6   r   zRedisBackend.getw  s    {{s##r7   c                 8    | j                   j                  |      S r#   )r9   rH   )r2   keyss     r6   rH   zRedisBackend.mgetz  s    {{%%r7   c           
          t        | j                  fi |}|j                  d      }t        || j                  |i t        | j                  |      fi |S )Nmax_retries)r   r   r   r	   r-   r   on_connection_error)r2   funr3   policyr   r   s         r6   r+   zRedisBackend.ensure}  s]    D--88"&&}5''rD,,k:  	r7   c           	          t        |      }t        j                  t        j	                         ||xs dt        |d             |S )NInfzin )nextr?   errorE_LOSTr   r   )r2   r   exc	intervalsretriesttss         r6   r   z RedisBackend.on_connection_error  s<    9oLLN[)E+;C+G	I 
r7   c                     t        |t              r#t        |      | j                  kD  rt	        d       | j
                  | j                  ||ffi |S )Nz!value too large for Redis backend)r   rA   len_MAX_STR_VALUE_SIZEr   r+   _set)r2   ry   r   r   s       r6   r/   zRedisBackend.set  sI    eS!c%j43K3K&K#$GHHt{{499sElClCCr7   c                    | j                   j                         5 }| j                  r|j                  || j                  |       n|j	                  ||       |j                  ||       |j                          d d d        y # 1 sw Y   y xY wr#   )r9   pipelineexpiressetexr/   publishexecute)r2   ry   r   pipes       r6   r   zRedisBackend._set  si    [[!!# 	t||

3e4e$LLe$LLN	 	 	s   ABBc                 Z    t         |   |       | j                  j                  |       y r#   )r$   forgetr   r^   )r2   r\   r5   s     r6   r  zRedisBackend.forget  s#    w''0r7   c                 :    | j                   j                  |       y r#   )r9   deleter   s     r6   r  zRedisBackend.delete  s    3r7   c                 8    | j                   j                  |      S r#   )r9   incrr   s     r6   r  zRedisBackend.incr  s    {{$$r7   c                 :    | j                   j                  ||      S r#   )r9   expire)r2   ry   r   s      r6   r	  zRedisBackend.expire  s    {{!!#u--r7   c                 \    | j                   j                  | j                  |d      d       y )N.tr   )r9   r  get_key_for_group)r2   group_idrh   s      r6   add_to_chordzRedisBackend.add_to_chord  s#    //$?Cr7   c                 t     ||      \  }}}}||v r| j                  |      }||v rt        d| d|      |S )NzDependency z raised )exception_to_pythonr   )	r2   tupdecodeEXCEPTION_STATESPROPAGATE_STATES_tidstateretvals	            r6   _unpack_chord_resultz!RedisBackend._unpack_chord_result  sU     !'s3v$$--f5F$${3%xzBCCr7   c                 H    | j                  | j                  |d      |       y )N.s)r/   r  )r2   r  
chord_sizes      r6   set_chord_sizezRedisBackend.set_chord_size  s    ''$7Dr7   c                     t        |d   t              sI | j                  j                  | }t	        d |j
                  D              r|j                  |        y y y )Nr   c              3   <   K   | ]  }t        |t                y wr#   )r   r   )r   nrs     r6   r   z+RedisBackend.apply_chord.<locals>.<genexpr>  s     O2:b+.Os   )r&   )r   r   r   r   r   resultssave)r2   header_result_argsbodyr4   header_results        r6   apply_chordzRedisBackend.apply_chord  s[     ,Q/80DHH002DEMO9N9NOO""4"0 P 9r7   c                 :    | j                   j                  dd      S )Nresult_chord_orderedT)r   r   rX   s    r6   _chord_zsetzRedisBackend._chord_zset  s    &&**+A4HHr7   c                 N    | j                   j                  j                  di       S )N result_backend_transport_options)r   r   r   rX   s    r6   r   zRedisBackend._transport_options  s    xx}}  !CRHHr7   c                 
   | j                   }|j                  |j                  |j                  }	}}|r|sy |	d}	| j                  }
| j                  |d      }| j                  |d      }| j                  |d      }| j                  ||      }| j                  d|||g      }|
j                         5 }| j                  r%|j                  |||	i      j                  |dd      n |j                  ||      j                  |      j                  |      j                  |      }| j                  rP|j!                  || j                        j!                  || j                        j!                  || j                        }|j#                         d d \  }}}}d d d        t%        xs d      }r	 t'        |j(                  |	      }t%        |      |z   }|k(  rst+        j,                  |      }|f|j/                          |j0                  r|j2                  n|j4                  }t7               5   ||j8                  j:                  d
      }d d d        n| j<                  | j>                  }}|
j                         5 }| j                  r|jA                  |dd      }n|jC                  |d|      }|j#                         \  }d d d        D cg c]  } |||       }}	 |jE                         	 |
j                         5 }|jQ                  |      jQ                  |      jQ                  |      j#                          d d d        y y y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}w # tF        $ r}tH        jK                  d|j                  |       | jM                  |tO        d|            cY d }~|
j                         5 }|jQ                  |      jQ                  |      jQ                  |      j#                          d d d        S # 1 sw Y   S xY wd }~ww xY w# 1 sw Y   y xY w# |
j                         5 }|jQ                  |      jQ                  |      jQ                  |      j#                          d d d        w # 1 sw Y   w xY wxY w# tN        $ r=}tH        jK                  d|j                  |       | jM                  |      cY d }~S d }~wtF        $ rI}tH        jK                  d|j                  |       | jM                  tO        d|            cY d }~S d }~ww xY w)Nz+infz.jr  r  r   z-inf   r   )r   T)rm   	propagatez Chord callback for %r raised: %rzCallback error: zChord %r raised: %rzJoin error: ))r   idgroupgroup_indexr9   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  )r2   requestr  rh   r.  r4   r   r  gidr2  r9   jkeytkeyskeyencodedr  r   r  
readycount	totaldiffchord_size_bytescallbacktotalr%  	join_funcreslr  unpackr  r   s                                 r6   on_chord_part_returnz!RedisBackend.on_chord_part_return  s   hh '

GMM7;N;N+S# K%%c40%%c40%%c40##FE2++q#uf56__ 	P$ ## 		$+ 67>>tVVTZZg.33D9c$iD		 
 ||#VD$,,/VD$,,/VD$,,/ 
 :B9I9I9KBQ9O6Az9&6	P 	Q'	=*7==cB,-	9&$/$7$7$<M$0 &..0  -AA *55!.!3!3 "
 /0 #,(+(J(J*.$D  *.d6O6O#__. 7$#//+/;;tQ+C+/;;tQ+F$,$4$4$6ED7 @DDsF 3DD+ t, $__. +$ !'!'!'!(+ +Y '	 !	P 	PJ 7 7  E % ((>sT#::$&)9#'AB  
 $__. +$ !'!'!'!(+ + ++ +V__. +$ !'!'!'!(+ + +  B  !6sK228SAA   !6sK22cW56 s  3C%M3B R' 3M 1R' AM,	R' M8%R' (M= :R' 
>P4R' M M)%R' ,M51R' =	P1>P,P1Q  	R' >P R'  P)	%R' )R' ,P11Q  4P=9R' =R'  R$>R	R$R!R$$R' '	T=02S("T=(T=4>T82T=8T=c                 P     | j                          | j                  di |      S )N)r:   rU   )_get_client	_get_poolr2   paramss     r6   _create_clientzRedisBackend._create_client+  s+    !t!*DNN4V4
 	
r7   c                 .    | j                   j                  S r#   )r   StrictRedisrX   s    r6   rV  zRedisBackend._get_client0  s    zz%%%r7   c                 &     | j                   di |S rT   )ConnectionPoolrX  s     r6   rW  zRedisBackend._get_pool3  s    "t"",V,,r7   c                 h    | j                   | j                  j                  | _         | j                   S r#   )r   r   r^  rX   s    r6   r^  zRedisBackend.ConnectionPool6  s,    '#'::#<#<D ###r7   c                 :     | j                   di | j                  S rT   )rZ  r   rX   s    r6   r9   zRedisBackend.client<  s    "t""5T__55r7   c                 p    |si n|}t         |   |t        || j                  | j                              S )N)r   r   )r$   
__reduce__r   r   r   r1   s      r6   rb  zRedisBackend.__reduce__@  s6    !vw!$vt||BD 	Dr7   )NNNNNNNr#   )rU   N)-r}   r~   r   __doc__r!   r   r   r   r   supports_autoexpirer<  r   r%   r   r
   r   r   r   rH   r+   r   r/   r   r  r  r  r	  r  r   r  r  r  r  r&  r)  r   rT  rZ  rV  rW  propertyr^  r9   rb  r   r   s   @r6   r   r      sH    $N E275..T O $?C+/!%_
B5n  7$&D1 %.D /5.E.E.4.E.EE
1 I I I I (,]~

&- $ $
 6 6D Dr7   r   sentinelc                       e Zd ZdZy)SentinelManagedSSLConnectionzConnect 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)r}   r~   r   rc  rU   r7   r6   rh  rh  G  s    	r7   rh  c                   h     e Zd ZdZdZ eedd      ZerendZ	 fdZ
d
 fd	Z fdZd Zd	 Z xZS )r   z!Redis sentinel task result store.;rf  Nc                 v    | j                   t        t        j                               t	        |   |i | y r#   )rf  r   E_REDIS_SENTINEL_MISSINGr   r$   r%   r1   s      r6   r%   zSentinelBackend.__init__[  s4    == &'?'E'E'GHH$)&)r7   c                     |rt         |   |      S d | j                  xs dj                  | j                        D        }| j                  j                  d |D              S )zDReturn the server addresses as URIs, sanitizing the password or not.)include_passwordc              3   2   K   | ]  }t        |        y wr#   )r   )r   chunks     r6   r   z)SentinelBackend.as_uri.<locals>.<genexpr>j  s      
 u%
s    c              3   L   K   | ]  }|j                  d       r|dd n|  yw)z:///Nr/  )endswith)r   uris     r6   r   z)SentinelBackend.as_uri.<locals>.<genexpr>p  s.      /
 V,CH#5/
s   "$)r$   as_urir   split_SERVER_URI_SEPARATORr>  )r2   rn  
uri_chunksr5   s      r6   ru  zSentinelBackend.as_uria  sq     7>!1 "  

((.b//0J0JK

 )).. /
!/
 
 	
r7   c                 D   |j                  | j                        }t        |g       }|D ]'  }t        |   ||      }|d   j                  |       ) dD ]  }|j                  |        dD ]-  }|d   s	||d   d   v s|d   d   j                  |      ||<   / |S )N)hosts)r   r   rz  )r   r   r   r   )r   r   r   )rv  rw  r   r$   r   appendr   r   )	r2   r   r   chunksr   rp  ro   paramr5   s	           r6   r   z SentinelBackend._params_from_urlu  s    4556("-
 	-E7+H , .Dw&&t,	- 8 	"ENN5!	" ( 	FE'"u
70CA0F'F$.w$7$:$>$>u$E
5!	F r7   c                 .   |j                         }|j                  d      }| j                  j                  dd      }| j                  j                  di       } | j                  j
                  |D cg c]  }|d   |d   f c}f||d|}|S c c}w )Nrz  min_other_sentinelsr   sentinel_kwargsr   r   )r  r  )r   r   r   r   rf  Sentinel)r2   rY  r   rz  r  r  cpsentinel_instances           r6   _get_sentinel_instancez&SentinelBackend._get_sentinel_instance  s    [[]
w'"5599:OQRS11556GL2DMM22056"bj"V*%6 3+ 	 !  7s   4Bc                      | j                   di |}| j                  j                  dd       }|j                  || j	                               j
                  S )Nmaster_name)service_nameredis_classrU   )r  r   r   
master_forrV  r:   )r2   rY  r  r  s       r6   rW  zSentinelBackend._get_pool  s^    7D77A&A--11-F ++$((* , 
 /	r7   )F)r}   r~   r   rc  rw  getattrr   rf  rh  r   r%   ru  r   r  rW  r   r   s   @r6   r   r   R  s@    +  uj$/H;C7*
( !r7   r   )Erc  rq   
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   rl  r   r   r   r   r   rW   r}   r?   r!   r   r  rf  SentinelManagedConnectionr   rh  r   rU   r7   r6   <module>r     s9   !  %  7 7   2 / :  . ) Q Q 8 6 ' . ? *#=
	 .
 
  * &
) %
 
7 
 
H	h.' h.VHD+-> HDV 5*d#NN44Jl Jo  #E"#  		s$   >
C> 	D >	D
	D
DD