
    `fg                     <   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/ n# e0$ r dZ-dZ/Y nw xY w	 ddl1Z-n# e0$ r Y nw xY w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@        jA        e-jB                  ZC G 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                        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                      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__s      G/var/www/html/env/lib/python3.11/site-packages/celery/backends/redis.pyr%   zResultConsumer.__init__S   sd    $)&)))!%!>"l8|*"&,"@ UU    c                 N   	 | j         j        j                                         | j        | j                                         n># t          $ r1}t                              t          |                     Y d }~nd }~ww xY wt                                                       d S 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[   s    	#L/55777|'""$$$ 	# 	# 	#NN3q66""""""""	#s   AA 
B'A==Bc                 b   d | _         | j        j        j                                         | j        r^| j        j                            | j                  }d |D             }|D ]+}|                     |                     |          d            ,| j        j        	                    d          | _         | j        r | j         j
        | j          d S | j         j                            d| j         j                  | j         _        | j         j                            | j         j                   d S )Nc                     g | ]}||S  rF   ).0metas     r6   
<listcomp>z4ResultConsumer._reconnect_pubsub.<locals>.<listcomp>k   s    444dt4T444r7   Tignore_subscribe_messagespubsub)r<   r&   r9   r:   r;   r0   mgeton_state_changer*   rL   	subscribeget_connection
shard_hint
connectionregister_connect_callback
on_connect)r2   metasrH   s      r6   _reconnect_pubsubz ResultConsumer._reconnect_pubsubd   s3   +11333  	FL',,T-?@@E44e444E F F$$T%8%8%>%>EEEE|*11&* 2 
 
  	W"DL"D$67777&*l&B&Q&Q$,1' 'DL#
 L#==dl>UVVVVVr7   c              #      K   	 d V  d S # | j         $ rN 	 |                     | j        d           Y d S # | j         $ r! t                              t
                      w xY ww xY wNrF   )r.   r,   rV   r?   criticalE_RETRY_LIMIT_EXCEEDEDr2   s    r6   reconnect_on_errorz!ResultConsumer.reconnect_on_error|   s      	EEEEE& 	 	 	T3R888888*    6777	s   
 
A"3+AA"c                 h    |d         t           j        v r|                     |d                    d S d S )Nstatustask_id)r   READY_STATES
cancel_for)r2   rH   s     r6   _maybe_cancel_ready_taskz'ResultConsumer._maybe_cancel_ready_task   s8    >V000OODO,,,,, 10r7   c                 v    t                                          ||           |                     |           d S r#   )r$   rN   rb   )r2   rH   messager5   s      r6   rN   zResultConsumer.on_state_change   s7    g...%%d+++++r7   c                 z    | j         j                            d          | _        |                     |           d S )NTrJ   )r&   r9   rL   r<   _consume_from)r2   initial_task_idr4   s      r6   startzResultConsumer.start   sB    |*11&* 2 
 
 	?+++++r7   c                 V     |j         di |D ]}||                     |d            d S rX   )
_iter_metarN   )r2   resultr4   rH   s       r6   on_wait_for_pendingz"ResultConsumer.on_wait_for_pending   sK    %F%//// 	1 	1D$$T4000	1 	1r7   c                 J    | j         | j                                          d S d S r#   )r<   r=   r[   s    r6   stopzResultConsumer.stop   s,    <#L      $#r7   c                 R   | j         r|                                 5  | j                             |          }|r;|d         dk    r/|                     |                     |d                   |           d d d            d S # 1 swxY w Y   d S |rt          j        |           d S d S )N)timeouttyperd   data)r<   r\   get_messagerN   r*   timesleep)r2   rp   rd   s      r6   drain_eventszResultConsumer.drain_events   s   < 	 ((** X X,2272CC Xwv);;(()<)<WV_)M)MwWWWX X X X X X X X X X X X X X X X X X  	 Jw	  	 s   ABB	Bc                 h    | j         |                     |          S |                     |           d S r#   )r<   rh   rf   )r2   r_   s     r6   consume_fromzResultConsumer.consume_from   s6    <::g&&&7#####r7   c                    |                      |          }|| j        vrc| j                            |           |                                 5  | j                            |           d d d            d S # 1 swxY w Y   d S d S r#   )r(   r0   addr\   r<   rO   r2   r_   keys      r6   rf   zResultConsumer._consume_from   s    $$W--d(((""3'''((** , ,&&s+++, , , , , , , , , , , , , , , , , , )(s   A55A9<A9c                    |                      |          }| j                            |           | j        rI|                                 5  | j                            |           d d d            d S # 1 swxY w Y   d S d S r#   )r(   r0   discardr<   r\   unsubscriber{   s      r6   ra   zResultConsumer.cancel_for   s    $$W--""3'''< 	.((** . .((---. . . . . . . . . . . . . . . . . .	. 	.s   A33A7:A7r#   )__name__
__module____qualname__r<   r%   rB   rV   r   r\   rb   rN   rh   rl   rn   rv   rx   rf   ra   __classcell__r5   s   @r6   r!   r!   P   s       G# # # # #         W W W0   ^- - -, , , , ,, , ,1 1 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           
      0    t                      j        ddt          i| | j        j        j        }	| j        &t          t          	                                          |rd|v r|d }}|p |	d          p| j
        | _
        || _         |	d          }
 |	d          } |	d          } |	d          } |	d          } |	d	          pd
 |	d          pd |	d          pd |	d          | j
        |
ot          |
          |pd|ot          |          d| _         |	d          }|r
|| 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                  rd}t&          t(          t*          t&          t(          t*          d}| j                            d|          }|                    ||          }||                                vrt/          t0                    |t(          k    r t2                              t6                     n*|t*          k    rt2                              t8                     || 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)rF   rF   rF   )&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    	44c4V444x} :&'<'<'>'>??? 	#ETMMdC  !D())!  	  /455!%&D!E!E4 8994 899 $%J K K D&&5+D&&.$$z""'a-..#3,F~1F1F 0 9E&H51G+H+H

 

 4()) 	3 +3DOJ'  	M7LDO34  	C2BDO./
 d*++ 	LO""3'''262KDO./ 	J"33CIIDO
 $/114?+=>@STT 2$-!7D7D3<2?2?.7&9 &9" !O//AVWWM266}mTTM$:$A$A$C$CCC !FGGG--89999)++4555/<DOO, *A #%%% 	4 3  $22$(DK!4#9 
  
r7   c                 &   t          |          \  }}}}}}t          |fi t          ||||                    dd           d          |dk    rg                    | j        j        d|z   d                               dd                                dd                                d           n|d	<   g d
}	|dk    rJt          fd|	D                       st          fd|	D                       rt          t                    |dk    r>t
          j
        d<   |	D ],}
                    |
d           }|rt          |          |
<   -                    d	          pd}t          |t                    r|                    d          n|}t!          |          d	<                                   D ]:\  }}|t
          j        j        v r"t          j        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 V  	d S r#   rF   )rG   r|   r   s     r6   	<genexpr>z0RedisBackend._params_from_url.<locals>.<genexpr>N  s(      @@#C:%@@@@@@r7   c              3       K   | ]}|v V  	d S r#   rF   )rG   r|   querys     r6   r   z0RedisBackend._params_from_url.<locals>.<genexpr>O  s'      ??u??????r7   redissr   r   )r   dictr   popr   r   UnixDomainSocketConnectionanyr   &E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCHr   r   r   
isinstancerA   r   r   itemsrR   URL_QUERY_ARGUMENT_PARSERS)r2   r   defaultsschemer   r   r   r   r   ssl_param_keysssl_settingssl_valr   r|   valuer   r   s                  @@r6   r   zRedisBackend._params_from_url3  s~   >Hoo;dHhe
 
"d$EIInd,K,K$M $M N N
 

 X $(J$Id
    
 NN64(((NN64(((NN34444#Jt+ + + W@@@@@@@@@ I?????????I !GHHHX-2-@J)*  . ? ?))K66 ?.5g.>.>J{+ ^^D!!&Q(S119RXXc]]]rr77
4++-- 	 	JCe&AAA"-HM c

 	%   r7   c                     t                      j        }d| j        v r4|                                }|                    | j        d                    |S )Nretry_policy)r$   r   _transport_optionscopyr   )r2   r   r5   s     r6   r   zRedisBackend.retry_policyj  sP    ww+T444',,..L 7 GHHHr7   c                 Z    t                      s| j                            |           d S d S r#   )r   r   rx   )r2   producerr_   s      r6   on_task_callzRedisBackend.on_task_calls  s7    #%% 	7 --g66666	7 	7r7   c                 6    | j                             |          S r#   )r9   r   r2   r|   s     r6   r   zRedisBackend.getw  s    {s###r7   c                 6    | j                             |          S r#   )r9   rM   )r2   keyss     r6   rM   zRedisBackend.mgetz  s    {%%%r7   c           
          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)r2   funr3   policyr   r   s         r6   r+   zRedisBackend.ensure}  sj    D-8888"&&}55'rD,k::    	r7   c           	          t          |          }t                              t                                          ||p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  sO    9ooLLNN[)E+;C+G+G	I 	I 	I 
r7   c                     t          |t                    r't          |          | j        k    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   r|   r   r   s       r6   r/   zRedisBackend.set  sY    eS!! 	Ic%jj43K&K&K#$GHHHt{49sElCClCCCr7   c                 2   | j                                         5 }| j        r|                    || j        |           n|                    ||           |                    ||           |                                 d d d            d S # 1 swxY w Y   d S r#   )r9   pipelineexpiressetexr/   publishexecute)r2   r|   r   pipes       r6   r   zRedisBackend._set  s    [!!## 	t| %

3e4444e$$$LLe$$$LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A%BBBc                 ~    t                                          |           | j                            |           d S r#   )r$   forgetr   ra   )r2   r_   r5   s     r6   r  zRedisBackend.forget  s6    w''00000r7   c                 :    | j                             |           d S r#   )r9   deleter   s     r6   r  zRedisBackend.delete  s    3r7   c                 6    | j                             |          S r#   )r9   incrr   s     r6   r  zRedisBackend.incr  s    {$$$r7   c                 8    | j                             ||          S r#   )r9   expire)r2   r|   r   s      r6   r
  zRedisBackend.expire  s    {!!#u---r7   c                 d    | j                             |                     |d          d           d S )N.tr   )r9   r  get_key_for_group)r2   group_idrk   s      r6   add_to_chordzRedisBackend.add_to_chord  s0    //$??CCCCCr7   c                      ||          \  }}}}||v r|                      |          }||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  si     !'s3v$$$--f55F$$$B3BBBBCCCr7   c                 Z    |                      |                     |d          |           d S )N.s)r/   r  )r2   r  
chord_sizes      r6   set_chord_sizezRedisBackend.set_chord_size  s,    ''$77DDDDDr7   c                     t          |d         t                    sE | j        j        | }t	          d |j        D                       r|                    |            d S d S d S )Nr   c              3   @   K   | ]}t          |t                    V  d S r#   )r   r   )rG   nrs     r6   r   z+RedisBackend.apply_chord.<locals>.<genexpr>  s,      OO2:b+..OOOOOOr7   )r&   )r   r   r   r   r   resultssave)r2   header_result_argsbodyr4   header_results        r6   apply_chordzRedisBackend.apply_chord  s     ,Q/88 	10DH02DEMOO9NOOOOO 1""4"00000	1 	11 1r7   c                 8    | j                             dd          S )Nresult_chord_orderedT)r   r   r[   s    r6   _chord_zsetzRedisBackend._chord_zset  s    &**+A4HHHr7   c                 B    | j         j                            di           S )N result_backend_transport_options)r   r   r   r[   s    r6   r   zRedisBackend._transport_options  s    x}  !CRHHHr7   c                 `   | j         }|j        |j        |j        }	}}|r|sd S |	d}	| j        }
|                     |d          }|                     |d          }|                     |d          }|                     ||          }|                     d|||g          }|
                                5 }| j	        r-|
                    |||	i                              |dd          n(|                    ||                              |                              |                              |          }| j        rM|                    || j                                      || j                                      || j                  }|                                d d         \  }}}}d d d            n# 1 swxY w Y   t%          |pd          }|r	 t'          |j        |	          }t%          |          |z   }||k    rt+          j        |          }|g|                                 |j        r|j        n|j        }t7                      5   ||j        j        d
          }d d d            n# 1 swxY w Y   n| j        | j        c|
                                5 }| j	        r|                     |dd          }n|!                    |d|          }|                                \  }d d d            n# 1 swxY w Y   fd|D             }	 |"                    |           n# tF          $ r}tH          %                    d|j        |           | &                    |tO          d|                    cY d }~|
                                5 }|(                    |          (                    |          (                    |                                           d d d            S # 1 swxY w Y   S d }~ww xY w	 |
                                5 }|(                    |          (                    |          (                    |                                           d d d            d S # 1 swxY w Y   d S # |
                                5 }|(                    |          (                    |          (                    |                                           d d d            w # 1 swxY w Y   w xY wd S # tN          $ rA}tH          %                    d|j        |           | &                    ||          cY d }~S d }~wtF          $ rQ}tH          %                    d|j        |           | &                    |tO          d|                    cY d }~S d }~ww xY wd S )Nz+infz.jr  r  r   z-inf   r   )r   T)rp   	propagatec                 (    g | ]} |          S rF   rF   )rG   r  r  unpacks     r6   rI   z5RedisBackend.on_chord_part_return.<locals>.<listcomp>  s%    DDDsF 3 3DDDr7   z 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  rk   r/  r4   r   r  gidr5  r9   jkeytkeyskeyencodedr  r   r  
readycount	totaldiffchord_size_bytescallbacktotalr&  	join_funcreslr   r  r2  s                              @@r6   on_chord_part_returnz!RedisBackend.on_chord_part_return  sl   h '
GM7;N+S 	# 	F K%%c400%%c400%%c400##FE22++q#uf566__ 	P$ #:		$+ 677>>tVVTTTZZg..33D99c$iiD			 
 | 0#VD$,//VD$,//VD$,// 
 :B9I9I9K9KBQB9O6Az9&6	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	Q''	 >	=*7=cBBB,--	9&&$/$7$<$<M$0 &..000  -A4M55!.!3 "
 /00  #,9(+(J*.$ $ $D               *.d6O#__.. 7$#/ G+/;;tQ+C+C+/;;tQ+F+F$,$4$4$6$6ED7 7 7 7 7 7 7 7 7 7 7 7 7 7 7  EDDDDtDDD+ t,,,,$   ((>sT T T#::$&'A#'A'ABB        
 $__.. +$ !'!'!'!(+ + + + + + + + + + + + + + + + - $__.. +$ !'!'!'!(+ + + + + + + + + + + + + + + + + +V__.. +$ !'!'!'!(+ + + + + + + + + + + + + + + +Y '&d  B B B  !6sKKK228SAAAAAAAA     !6sKKK225c5566       s>	 >	sF  5C9F::F>F>A<T I:.T :I>>T I>'T )AL6T LT 	L
T L3 2R 3
P=APPR T AO6*T 6O:	:T =O:	>T PR T AQ:-T :Q>>T Q>T TAS6*T6S::T=S:>TT 
V+6UV+V+AV& V+&V+c                 T     |                                   | j        di |          S )N)r:   rF   )_get_client	_get_poolr2   paramss     r6   _create_clientzRedisBackend._create_client+  s<    !t!!*DN44V44
 
 
 	
r7   c                     | j         j        S r#   )r   StrictRedisr[   s    r6   rX  zRedisBackend._get_client0  s    z%%r7   c                      | j         di |S rX   )ConnectionPoolrZ  s     r6   rY  zRedisBackend._get_pool3  s    "t",,V,,,r7   c                 @    | j         | j        j        | _         | j         S r#   )r   r   r`  r[   s    r6   r`  zRedisBackend.ConnectionPool6  s!    '#':#<D ##r7   c                 &     | j         di | j        S rX   )r\  r   r[   s    r6   r9   zRedisBackend.client<  s    "t"55T_555r7   rF   c                     |si n|}t                                          |t          || j        | j                            S )N)r   r   )r$   
__reduce__r   r   r   r1   s      r6   rd  zRedisBackend.__reduce__@  sH    !-vww!!$vt|BBBD D 	Dr7   )NNNNNNNr#   )rF   N)-r   r   r   __doc__r!   r   r   r   r   supports_autoexpirer?  r   r%   r   r
   r   r   r   rM   r+   r   r/   r   r  r  r  r
  r  r   r  r  r  r  r'  r*  r   rV  r\  rX  rY  propertyr`  r9   rd  r   r   s   @r6   r   r      s         $N E27A5..T O $?C+/!%_
 _
 _
 _
 _
 _
B5 5 5n     _7 7 7$ $ $& & &    D D D  1 1 1 1 1     % % %. . .D D D /5.E.4.E   E E E
1 
1 
1 I I _I I I _I (,] ] ] ]~
 
 

& & &- - - $ $ X$
 6 6 _6D D D D D D D D D Dr7   r   sentinelc                       e Zd ZdZdS )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   re  rF   r7   r6   rj  rj  G  s        	 	 	 	r7   rj  c                   n     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.;rh  Nc                     | j         &t          t                                                     t	                      j        |i | d S r#   )rh  r   E_REDIS_SENTINEL_MISSINGr   r$   r%   r1   s      r6   r%   zSentinelBackend.__init__[  sH    = &'?'E'E'G'GHHH$)&)))))r7   Fc                     |r"t                                          |          S d | j        pd                    | j                  D             }| j                            d |D                       S )zDReturn the server addresses as URIs, sanitizing the password or not.)include_passwordc              3   4   K   | ]}t          |          V  d S r#   )r   )rG   chunks     r6   r   z)SentinelBackend.as_uri.<locals>.<genexpr>j  s>       
 
 u%%
 
 
 
 
 
r7    c              3   X   K   | ]%}|                     d           r
|dd         n|V  &dS )z:///Nr0  )endswith)rG   uris     r6   r   z)SentinelBackend.as_uri.<locals>.<genexpr>p  sS       /
 /
 V,,5CHH#/
 /
 /
 /
 /
 /
r7   )r$   as_urir   split_SERVER_URI_SEPARATORrA  )r2   rp  
uri_chunksr5   s      r6   rw  zSentinelBackend.as_uria  s      	77>>!1 "   

 
(.b//0JKK
 
 

 ).. /
 /
!/
 /
 /
 
 
 	
r7   c                    |                     | j                  }t          |g           }|D ]@}t                                          ||          }|d                             |           AdD ]}|                    |           dD ]>}|d         r4||d         d         v r$|d         d                             |          ||<   ?|S )N)hosts)r   r   r|  )r   r   r   r   )r   r   r   )rx  ry  r   r$   r   appendr   r   )	r2   r   r   chunksr   rr  rr   paramr5   s	           r6   r   z SentinelBackend._params_from_urlu  s    4566("---
 	- 	-E77++H , . .Dw&&t,,,,7 	" 	"ENN5!!!! ( 	F 	FE'" Fu
70CA0F'F'F$.w$7$:$>$>u$E$E
5!r7   c                    |                                 }|                    d          }| j                            dd          }| j                            di           } | j        j        d |D             f||d|}|S )Nr|  min_other_sentinelsr   sentinel_kwargsc                 .    g | ]}|d          |d         fS )r   r   rF   )rG   cps     r6   rI   z:SentinelBackend._get_sentinel_instance.<locals>.<listcomp>  s%    666"bj"V*%666r7   )r  r  )r   r   r   r   rh  Sentinel)r2   r[  r   r|  r  r  sentinel_instances          r6   _get_sentinel_instancez&SentinelBackend._get_sentinel_instance  s    [[]]
w''"599:OQRSS1556GLL2DM266666 3+  	  ! r7   c                      | j         di |}| j                            dd           }|                    ||                                           j        S )Nmaster_name)service_nameredis_classrF   )r  r   r   
master_forrX  r:   )r2   r[  r  r  s       r6   rY  zSentinelBackend._get_pool  sg    7D7AA&AA-11-FF ++$((** , 
 
 	r7   )F)r   r   r   re  ry  getattrr   rh  rj  r   r%   rw  r   r  rY  r   r   s   @r6   r   r   R  s        ++  wuj$//H;CM77* * * * *
 
 
 
 
 
(     ! ! !      r7   r   )Ere  rt   
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   rn  r   r   r   r   r   rZ   r   r?   r!   r   r  rh  SentinelManagedConnectionr   rj  r   rF   r7   r6   <module>r     sQ   ! !  % % % % % %       7 7 7 7 7 7 7 7 7 7             2 2 2 2 2 2 / / / / / / : : : : : : : :       . . . . . . ) ) ) ) ) ) Q Q Q Q Q Q Q Q Q Q 8 8 8 8 8 8 8 8 6 6 6 6 6 6 6 6 ' ' ' ' ' ' . . . . . . ? ? ? ? ? ? ? ? * * * * * *#======= # # #E"#	 	 	 	D	 .
 
  * &
) %
 
7 
 
H		h. h. h. h. h.' h. h. h.VHD HD HD HD HD+-> HD HD HDV 75*d## 	    N4  J J J J Jl J J J J Js$   >
B	 		BBB B&%B&