
    leJio                     `   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 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 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l0m1Z1 	 ddl2Zddl3m4Z4 n# e5$ r dZdZ4Y nw xY w	 ddl6Zn# e5$ r Y nw xY wdZ7dZ8dZ9dZ:dZ;dZ<dZ=d Z>d!Z? e*e@          ZA G d" d#e/          ZB G d$ d%e1e.          ZC eDed&d          r G d' d(ejE        jF        ejG                  ZH G d) d*eC          ZIdS )+zRedis result store backend.    N)contextmanager)partial)	CERT_NONECERT_OPTIONALCERT_REQUIRED)unquote)symbol_by_name)retry_over_time)cached_property)
_parse_urlmaybe_sanitize_url)CredentialProvider)states)task_join_will_block)_create_chord_error_with_cause)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      [/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/celery/backends/redis.pyr(   zResultConsumer.__init__V   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)r5   er8   s     r9   rE   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  rI   ).0metas     r9   
<listcomp>z4ResultConsumer._reconnect_pubsub.<locals>.<listcomp>n   s    444dt4T444r:   Tignore_subscribe_messagespubsub)r?   r)   r<   r=   r>   r3   mgeton_state_changer-   rO   	subscribeget_connection
shard_hint
connectionregister_connect_callback
on_connect)r5   metasrK   s      r9   _reconnect_pubsubz ResultConsumer._reconnect_pubsubg   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Vr:   c              #      K   	 d V  d S # | j         $ rf 	 |                     | j        d           Y d S # | j         $ r9}t                              t
                     t          t
                    |d }~ww xY ww xY wNrI   )r1   r/   rY   rB   criticalE_RETRY_LIMIT_EXCEEDEDRuntimeError)r5   rF   s     r9   reconnect_on_errorz!ResultConsumer.reconnect_on_error   s      	BEEEEE& 	B 	B 	BBT3R888888* B B B 6777"#9::AB	Bs#   
 
A:3
A64A11A66A:c                 h    |d         t           j        v r|                     |d                    d S d S )Nstatustask_id)r   READY_STATES
cancel_for)r5   rK   s     r9   _maybe_cancel_ready_taskz'ResultConsumer._maybe_cancel_ready_task   s8    >V000OODO,,,,, 10r:   c                 v    t                                          ||           |                     |           d S r&   )r'   rQ   re   )r5   rK   messager8   s      r9   rQ   zResultConsumer.on_state_change   s7    g...%%d+++++r:   c                 z    | j         j                            d          | _        |                     |           d S )NTrM   )r)   r<   rO   r?   _consume_from)r5   initial_task_idr7   s      r9   startzResultConsumer.start   sB    |*11&* 2 
 
 	?+++++r:   c                 V     |j         di |D ]}||                     |d            d S r[   )
_iter_metarQ   )r5   resultr7   rK   s       r9   on_wait_for_pendingz"ResultConsumer.on_wait_for_pending   sK    %F%//// 	1 	1D$$T4000	1 	1r:   c                 J    | j         | j                                          d S d S r&   )r?   r@   r5   s    r9   stopzResultConsumer.stop   s,    <#L      $#r:   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typerg   data)r?   r_   get_messagerQ   r-   timesleep)r5   rt   rg   s      r9   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?   rk   ri   )r5   rb   s     r9   consume_fromzResultConsumer.consume_from   s6    <::g&&&7#####r:   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+   r3   addr_   r?   rR   r5   rb   keys      r9   ri   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+   r3   discardr?   r_   unsubscriber   s      r9   rd   zResultConsumer.cancel_for   s    $$W--""3'''< 	.((** . .((---. . . . . . . . . . . . . . . . . .	. 	.s   A33A7:A7r&   )__name__
__module____qualname__r?   r(   rE   rY   r   r_   re   rQ   rk   ro   rr   rz   r|   ri   rd   __classcell__r8   s   @r9   r$   r$   S   s       G# # # # #         W W W0 B B ^B- - -, , , , ,, , ,1 1 1
! ! !       $ $ $
, , ,. . . . . . .r:   r$   c                   v    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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                      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	          } |	d
          pd |	d          pd |	d          pd |	d          | j
        |
ot          |
          |pd|ot          |           |	d          d	| _         |	d          }|r
|| j        d<   |rt          |t                    rt!          |          } |            }t          |t"                    st%          d          || j        d<   | j                            dd            | j                            d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}t2          t4          t6          t2          t4          t6          d}| j                            d|          }|                    ||          }||                                vrt%          t:                    |t4          k    r t<                              t@                     n*|t6          k    rt<                              tB                     || j        d<   || _"        tF          rtG                      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_backend_credential_provider
redis_host	localhost
redis_porti  redis_dbr   redis_passwordFredis_client_name)	hostportdbpasswordmax_connectionssocket_timeoutretry_on_timeoutsocket_connect_timeoutclient_nameredis_usernameusernameRCredential provider is not an instance of a redis.CredentialProvider or a subclasscredential_providerr   health_check_intervalsocket_keepaliveredis_backend_use_sslconnection_classMISSING)r   r   r   requiredoptionalnonessl_cert_reqs)rI   rI   rI   )+r'   r(   intappconfgetredisr   E_REDIS_MISSINGstripr   _ConnectionPoolfloat
connparams
isinstancerD   r	   r   
ValueErrorpopupdateconnection_class_ssl_params_from_url
issubclassSSLConnectionr   r   r   values%E_REDIS_SSL_CERT_REQS_MISSING_INVALIDrB   rC   W_REDIS_SSL_CERT_OPTIONALW_REDIS_SSL_CERT_NONEurlr    r0   channel_errorsr$   accept_pending_results_pending_messagesresult_consumer)r5   r   r   r   r   r   r   r=   r7   _getr   r   r   r   r   r   r   credential_provider_clssslssl_cert_reqs_missingssl_string_to_constantr   r8   s                         r9   r(   zRedisBackend.__init__   sO    	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#FGG D&&5+D&&.$$z""'a-..#3,F~1F1F 0 9E&H51G+H+H4 344
 
 4()) 	3 +3DOJ' 	2-s33 @*89L*M*M'&=&=&?&?#13EFF  h   6IDO12 O
D111O
D111  	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 
  
r:   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d           }|rt          |t                    rt#          |          } |            }t          |t$                    st          d          |d<                       dd                                d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&   rI   )rJ   r   r   s     r9   	<genexpr>z0RedisBackend._params_from_url.<locals>.<genexpr>d  s(      @@#C:%@@@@@@r:   c              3       K   | ]}|v V  	d S r&   rI   )rJ   r   querys     r9   r   z0RedisBackend._params_from_url.<locals>.<genexpr>e  s'      ??u??????r:   redissr   r   r   r   r   r   )r   dictr   r   r   r   UnixDomainSocketConnectionanyr   &E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCHr   r   r   r   rD   r   r   r	   r   itemsrU   URL_QUERY_ARGUMENT_PARSERS)r5   r   defaultsschemer   r   r   r   r   ssl_param_keysssl_settingssl_valr   r   r   r   valuer   r   s                    @@r9   r   zRedisBackend._params_from_urlI  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 $ii(=tDD 	--s33 @*89L*M*M'&=&=&?&?#13EFF  h   1DJ,-NN:t,,,NN:t,,,++-- 	 	JCe&AAA"-HM c

 	%   r:   c                 4    t          || j                  rdS dS )NTF)r   r0   )r5   excs     r9   exception_safe_to_retryz$RedisBackend.exception_safe_to_retry  s!    c4122 	4ur:   c                     t                      j        }d| j        v r4|                                }|                    | j        d                    |S )Nretry_policy)r'   r   _transport_optionscopyr   )r5   r   r8   s     r9   r   zRedisBackend.retry_policy  sP    ww+T444',,..L 7 GHHHr:   c                 Z    t                      s| j                            |           d S d S r&   )r   r   r|   )r5   producerrb   s      r9   on_task_callzRedisBackend.on_task_call  s7    #%% 	7 --g66666	7 	7r:   c                 6    | j                             |          S r&   )r<   r   r5   r   s     r9   r   zRedisBackend.get  s    {s###r:   c                 6    | j                             |          S r&   )r<   rP   )r5   keyss     r9   rP   zRedisBackend.mget  s    {%%%r:   c           
          t          | j        fi |}|                    d          }t          || j        |i t          | j        |          fi |S )Nmax_retries)r   r   r   r
   r0   r   on_connection_error)r5   funr6   policyr   r   s         r9   r.   zRedisBackend.ensure  sj    D-8888"&&}55'rD,k::    	r:   c           	          t          |          }t                              t                                          ||pdt          |d                     |S )NInfzin )nextrB   errorE_LOSTr   r   )r5   r   r   	intervalsretriesttss         r9   r   z RedisBackend.on_connection_error  sO    9ooLLNN[)E+;C+G+G	I 	I 	I 
r:   c                     t          |t                    r't          |          | j        k    rt	          d           | j        | j        ||ffi |S )Nz!value too large for Redis backend)r   rD   len_MAX_STR_VALUE_SIZEr   r.   _set)r5   r   r   r   s       r9   r2   zRedisBackend.set  sY    eS!! 	Ic%jj43K&K&K#$GHHHt{49sElCClCCCr:   c                 2   | j                                         5 }| j        r|                    || j        |           n|                    ||           |                    ||           |                                 d d d            d S # 1 swxY w Y   d S r&   )r<   pipelineexpiressetexr2   publishexecute)r5   r   r   pipes       r9   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   rd   )r5   rb   r8   s     r9   r  zRedisBackend.forget  s6    w''00000r:   c                 :    | j                             |           d S r&   )r<   deleter   s     r9   r  zRedisBackend.delete  s    3r:   c                 6    | j                             |          S r&   )r<   incrr   s     r9   r  zRedisBackend.incr  s    {$$$r:   c                 8    | j                             ||          S r&   )r<   expire)r5   r   r   s      r9   r  zRedisBackend.expire  s    {!!#u---r:   c                 d    | j                             |                     |d          d           d S )N.tr   )r<   r  get_key_for_group)r5   group_idrn   s      r9   add_to_chordzRedisBackend.add_to_chord  s0    //$??CCCCCr:   c                      ||          \  }}}}||v r|                      |          }||v rt          d| d||          }	|	|S )NzDependency z raised )rg   original_exc)exception_to_pythonr   )
r5   tupdecodeEXCEPTION_STATESPROPAGATE_STATES_tidstateretvalchord_errors
             r9   _unpack_chord_resultz!RedisBackend._unpack_chord_result  s{     !'s3v$$$--f55F$$$8=c==6==F  K r:   c                 Z    |                      |                     |d          |           d S )N.s)r2   r  )r5   r  
chord_sizes      r9   set_chord_sizezRedisBackend.set_chord_size  s,    ''$77DDDDDr:   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   )rJ   nrs     r9   r   z+RedisBackend.apply_chord.<locals>.<genexpr>  s,      OO2:b+..OOOOOOr:   )r)   )r   r   r   r   r   resultssave)r5   header_result_argsbodyr7   header_results        r9   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 1r:   c                 8    | j                             dd          S )Nresult_chord_orderedT)r   r   rq   s    r9   _chord_zsetzRedisBackend._chord_zset  s    &**+A4HHHr:   c                 B    | j         j                            di           S )N result_backend_transport_options)r   r   r   rq   s    r9   r   zRedisBackend._transport_options  s    x}  !CRHHHr:   c                 d   | 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)rt   	propagatec                 (    g | ]} |          S rI   rI   )rJ   r  r   unpacks     r9   rL   z5RedisBackend.on_chord_part_return.<locals>.<listcomp>?  s%    DDDsF 3 3DDDr:   z Chord callback for %r raised: %rzCallback error: zChord %r raised: %rzJoin error: ))r   idgroupgroup_indexr<   r  encode_resultencoder	  r8  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	ExceptionrB   	exceptionchord_error_from_stackr   r  )r5   requestr%  rn   r=  r7   r   r$  gidrC  r<   jkeytkeyskeyencodedr  r	  r#  
readycount	totaldiffchord_size_bytescallbacktotalr4  	join_funcreslr   r   r@  s                              @@r9   on_chord_part_returnz!RedisBackend.on_chord_part_return  sq   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$E$E$EM$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<0T	 <J  T	 J 'T	 +AL8T	 LT	 LT	 L5 4R	 5
P	?APP	R	 
T	 AO8,T	 8O<	<T	 ?O<	 T	 P		R	 T	 !AQ</T	 <R  T	 R T	 	TAS8,T8S<<T?S< TT	 	
V-6U	V-V-AV("V-(V-c                 T     |                                   | j        di |          S )N)r=   rI   )_get_client	_get_poolr5   paramss     r9   _create_clientzRedisBackend._create_clientZ  s<    !t!!*DN44V44
 
 
 	
r:   c                     | j         j        S r&   )r   StrictRedisrq   s    r9   rf  zRedisBackend._get_client_  s    z%%r:   c                      | j         di |S r[   )ConnectionPoolrh  s     r9   rg  zRedisBackend._get_poolb  s    "t",,V,,,r:   c                 @    | j         | j        j        | _         | j         S r&   )r   r   rn  rq   s    r9   rn  zRedisBackend.ConnectionPoole  s!    '#':#<D ##r:   c                 &     | j         di | j        S r[   )rj  r   rq   s    r9   r<   zRedisBackend.clientk  s    "t"55T_555r:   rI   c                     |si n|}t                                          |t          || j        | j                            S )N)r
  r   )r'   
__reduce__r   r
  r   r4   s      r9   rr  zRedisBackend.__reduce__o  sH    !-vww!!$vt|BBBD D 	Dr:   )NNNNNNNr&   )rI   N).r   r   r   __doc__r$   r   r   r   r   supports_autoexpirerM  r  r(   r   r   r   r   r   r   rP   r.   r   r2   r  r  r  r  r  r  r   r!  r"  r(  r,  r5  r8  r   rd  rj  rf  rg  propertyrn  r<   rr  r   r   s   @r9   r!   r!      s         $N E27A5..T O $?C+/!%r
 r
 r
 r
 r
 r
hF F FP  
     _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r:   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   rs  rI   r:   r9   rx  rx  v  s        	 	 	 	r:   rx  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.;rv  Nc                     | j         &t          t                                                     t	                      j        |i | d S r&   )rv  r   E_REDIS_SENTINEL_MISSINGr   r'   r(   r4   s      r9   r(   zSentinelBackend.__init__  sH    = &'?'E'E'G'GHHH$)&)))))r:   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   )rJ   chunks     r9   r   z)SentinelBackend.as_uri.<locals>.<genexpr>  s>       
 
 u%%
 
 
 
 
 
r:    c              3   X   K   | ]%}|                     d           r
|dd         n|V  &dS )z:///Nr>  )endswith)rJ   uris     r9   r   z)SentinelBackend.as_uri.<locals>.<genexpr>  sS       /
 /
 V,,5CHH#/
 /
 /
 /
 /
 /
r:   )r'   as_urir   split_SERVER_URI_SEPARATORrO  )r5   r~  
uri_chunksr8   s      r9   r  zSentinelBackend.as_uri  s      	77>>!1 "   

 
(.b//0JKK
 
 

 ).. /
 /
!/
 /
 /
 
 
 	
r:   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   )r  r  r   r'   r   appendr   r   )	r5   r   r   chunksr   r  rv   paramr8   s	           r9   r   z SentinelBackend._params_from_url  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!r:   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   rI   )rJ   cps     r9   rL   z:SentinelBackend._get_sentinel_instance.<locals>.<listcomp>  s%    666"bj"V*%666r:   )r  r  )r   r   r   r   rv  Sentinel)r5   ri  r   r  r  r  sentinel_instances          r9   _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+  	  ! r:   c                      | j         di |}| j                            dd           }|                    ||                                           j        S )Nmaster_name)service_nameredis_classrI   )r  r   r   
master_forrf  r=   )r5   ri  r  r  s       r9   rg  zSentinelBackend._get_pool  sg    7D7AA&AA-11-FF ++$((** , 
 
 	r:   )F)r   r   r   rs  r  getattrr   rv  rx  r   r(   r  r   r  rg  r   r   s   @r9   r"   r"     s        ++  wuj$//H;CM77* * * * *
 
 
 
 
 
(     ! ! !      r:   r"   )Jrs  rx   
contextlibr   	functoolsr   r   r   r   r   urllib.parser   kombu.utilsr	   kombu.utils.functionalr
   kombu.utils.objectsr   kombu.utils.urlr   r   r   r   celeryr   celery._stater   celery.backends.baser   celery.canvasr   celery.exceptionsr   r   r   celery.resultr   r   celery.utils.functionalr   r   celery.utils.logr   celery.utils.timer   asynchronousr   r   baser   redis.connectionkombu.transport.redisr    ImportErrorredis.sentinel__all__r   r|  r   r   r   r   r   r]   r   rB   r$   r!   r  rv  SentinelManagedConnectionr   rx  r"   rI   r:   r9   <module>r     s   ! !  % % % % % %       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tD tD tD tD tD+-> tD tD tDn 75*d## 	    N4  J J J J Jl J J J J Js$   
B 	B'&B'+B0 0B87B8