
    xai/p                     T   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 	 ddl6Z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j                  j                  ej                        ZH G d) d*eC      ZIy# e5$ r dZdZ4Y w xY w# e5$ r Y w xY w)+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        |   |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      g/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/celery/backends/redis.pyr(   zResultConsumer.__init__V   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)r5   er8   s     r9   rE   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)   r<   r=   r>   r3   mgeton_state_changer-   rJ   	subscribeget_connection
shard_hint
connectionregister_connect_callback
on_connect)r5   metasmetas      r9   _reconnect_pubsubz ResultConsumer._reconnect_pubsubg   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                   $ r` 	 | j                  | j                  d       Y y # | j                   $ r.}t        j	                  t
               t        t
              |d }~ww xY ww xY wwN )r1   r/   rU   rB   criticalE_RETRY_LIMIT_EXCEEDEDRuntimeError)r5   rF   s     r9   reconnect_on_errorz!ResultConsumer.reconnect_on_error   sr     	B&& 	BBT33R8** B 67"#9:AB	Bs9   A;	 A;A87A;A4)A//A44A88A;c                 X    |d   t         j                  v r| j                  |d          y y )Nstatustask_id)r   READY_STATES
cancel_for)r5   rT   s     r9   _maybe_cancel_ready_taskz'ResultConsumer._maybe_cancel_ready_task   s)    >V000OODO, 1r:   c                 H    t         |   ||       | j                  |       y r&   )r'   rL   rb   )r5   rT   messager8   s      r9   rL   zResultConsumer.on_state_change   s     g.%%d+r:   c                 |    | j                   j                  j                  d      | _        | j	                  |       y )NTrH   )r)   r<   rJ   r?   _consume_from)r5   initial_task_idr7   s      r9   startzResultConsumer.start   s6    ||**11&* 2 
 	?+r:   c                 \     |j                   di |D ]  }|| j                  |d         y rW   )
_iter_metarL   )r5   resultr7   rT   s       r9   on_wait_for_pendingz"ResultConsumer.on_wait_for_pending   s7    %F%%// 	1D$$T40	1r:   c                 R    | j                   | j                   j                          y y r&   )r?   r@   r5   s    r9   stopzResultConsumer.stop   s!    <<#LL  $r:   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typerd   data)r?   r\   get_messagerL   r-   timesleep)r5   rq   rd   s      r9   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?   rh   rf   )r5   r_   s     r9   consume_fromzResultConsumer.consume_from   s)    <<::g&&7#r:   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+   r3   addr\   r?   rM   r5   r_   keys      r9   rf   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+   r3   discardr?   r\   unsubscriber|   s      r9   ra   zResultConsumer.cancel_for   sj    $$W-""3'<<((* .((-. . . .s   	A//A8r&   )__name__
__module____qualname__r?   r(   rE   rU   r   r\   rb   rL   rh   rl   ro   rw   ry   rf   ra   __classcell__r8   s   @r9   r$   r$   S   s[    G# W0 B B-,,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                 R   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	      } |	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	| _         |	d      }|r|| j                  d<   |rt        |t              rt!        |      } |       }t        |t"              st%        d      || j                  d<   | j                  j'                  dd        | j                  j'                  dd        |r|| j                  d<   |r|| j                  d<    |	d      }|r4| j                  j)                  |       | j*                  | j                  d<   |r!| j-                  || j                        | _        d| j                  v rt/        | j                  d   t        j0                        rd}t2        t4        t6        t2        t4        t6        d}| j                  j                  d|      }|j                  ||      }||j9                         vrt%        t:              |t4        k(  rt<        j?                  t@               n"|t6        k(  rt<        j?                  tB               || j                  d<   || _"        tF        r
tG               nd \  | _$        | _%        | jM                  | | j                  | jN                  | jP                  | jR                        | _*        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_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)rX   rX   rX   )+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__   s}    	4c4V4xx}}  ::&'<'<'>??ETMdC  !()!   	  /45!%&D!E 89 89 $%J K"#FG &5+&.$z"'a-.#33,F~1F 0 9E&H51G+H 34
 () +3DOOJ'-s3*89L*M'&=&?#13EF h  6IDOO12 OO
D1OO
D1 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 
r:   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d       }|rft        |t              rt#        |      } |       }t        |t$              st        d      |d<   j                  dd        j                  d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&   rX   ).0r}   r   s     r9   	<genexpr>z0RedisBackend._params_from_url.<locals>.<genexpr>d  s     @#C:%@   c              3   &   K   | ]  }|v  
 y wr&   rX   )r   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   itemsrP   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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 $ii(=tD-s3*89L*M'&=&?#13EF h  1DJ,-NN:t,NN:t,++- 	JCe&&AAA"--HHMc
	 	% r:   c                 2    t        || j                        ryy)NTF)r   r0   )r5   excs     r9   exception_safe_to_retryz$RedisBackend.exception_safe_to_retry  s    c4112r:   c                     t         |   }d| j                  v r.|j                         }|j	                  | j                  d          |S )Nretry_policy)r'   r   _transport_optionscopyr   )r5   r   r8   s     r9   r   zRedisBackend.retry_policy  sH    w+T444',,.L 7 7 GHr:   c                 P    t               s| j                  j                  |       y y r&   )r   r   ry   )r5   producerr_   s      r9   on_task_callzRedisBackend.on_task_call  s!    #%  --g6 &r:   c                 8    | j                   j                  |      S r&   )r<   r   r5   r}   s     r9   r   zRedisBackend.get  s    {{s##r:   c                 8    | j                   j                  |      S r&   )r<   rK   )r5   keyss     r9   rK   zRedisBackend.mget  s    {{%%r:   c           
          t        | j                  fi |}|j                  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  s]    D--88"&&}5''rD,,k:  	r:   c           	          t        |      }t        j                  t        j	                         ||xs 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  s<    9oLLN[)E+;C+G	I 
r:   c                     t        |t              r#t        |      | j                  kD  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  sI    eS!c%j43K3K&K#$GHHt{{499sElClCCr:   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&   )r<   pipelineexpiressetexr2   publishexecute)r5   r}   r   pipes       r9   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   ra   )r5   r_   r8   s     r9   r  zRedisBackend.forget  s#    w''0r:   c                 :    | j                   j                  |       y r&   )r<   deleter   s     r9   r  zRedisBackend.delete  s    3r:   c                 8    | j                   j                  |      S r&   )r<   incrr   s     r9   r  zRedisBackend.incr  s    {{$$r:   c                 :    | j                   j                  ||      S r&   )r<   expire)r5   r}   r   s      r9   r  zRedisBackend.expire  s    {{!!#u--r:   c                 \    | j                   j                  | j                  |d      d       y )N.tr   )r<   r  get_key_for_group)r5   group_idrk   s      r9   add_to_chordzRedisBackend.add_to_chord  s#    //$?Cr:   c                 |     ||      \  }}}}||v r| j                  |      }||v rt        d| d||      }	|	|S )NzDependency z raised )rd   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  sa     !'s3v$$--f5F$$8%cU(6*=FK r:   c                 H    | j                  | j                  |d      |       y )N.s)r2   r  )r5   r  
chord_sizes      r9   set_chord_sizezRedisBackend.set_chord_size  s    ''$7Dr:   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     r9   r   z+RedisBackend.apply_chord.<locals>.<genexpr>  s     O2:b+.Os   )r)   )r   r   r   r   r   resultssave)r5   header_result_argsbodyr7   header_results        r9   apply_chordzRedisBackend.apply_chord  s[     ,Q/80DHH002DEMO9N9NOO""4"0 P 9r:   c                 :    | j                   j                  dd      S )Nresult_chord_orderedT)r   r   rn   s    r9   _chord_zsetzRedisBackend._chord_zset  s    &&**+A4HHr:   c                 N    | j                   j                  j                  di       S )N result_backend_transport_options)r   r   r   rn   s    r9   r   zRedisBackend._transport_options  s    xx}}  !CRHHr:   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(  rut+        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)rq   	propagatez Chord callback for %r raised: %rzCallback error: zChord %r raised: %rzJoin error: ))r   idgroupgroup_indexr<   r  encode_resultencoder  r7  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$  rk   r<  r7   r   r#  gidr@  r<   jkeytkeyskeyencodedr  r  r"  
readycount	totaldiffchord_size_bytescallbacktotalr3  	join_funcreslr  unpackr  r   s                                 r9   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$EM$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) 5M"1R) AM.R) M:'R) *M? <R) >P6
R) M"M+'R) .M73R) ?	P3>P.P3Q R) >P"R) "P+	'R) +R) .P33Q 6P?;R) ?R) R&>R	R&R#R&&R) )	T?22S*$T?*T?6>T:4T?:T?c                 P     | j                          | j                  di |      S )N)r=   rX   )_get_client	_get_poolr5   paramss     r9   _create_clientzRedisBackend._create_clientZ  s+    !t!*DNN4V4
 	
r:   c                 .    | j                   j                  S r&   )r   StrictRedisrn   s    r9   rd  zRedisBackend._get_client_  s    zz%%%r:   c                 &     | j                   di |S rW   )ConnectionPoolrf  s     r9   re  zRedisBackend._get_poolb  s    "t"",V,,r:   c                 h    | j                   | j                  j                  | _         | j                   S r&   )r   r   rl  rn   s    r9   rl  zRedisBackend.ConnectionPoole  s,    '#'::#<#<D ###r:   c                 :     | j                   di | j                  S rW   )rh  r   rn   s    r9   r<   zRedisBackend.clientk  s    "t""5T__55r:   c                 p    |si n|}t         |   |t        || j                  | j                              S )N)r	  r   )r'   
__reduce__r   r	  r   r4   s      r9   rp  zRedisBackend.__reduce__o  s6    !vw!$vt||BD 	Dr:   )NNNNNNNr&   )rX   N).r   r   r   __doc__r$   r   r   r   r   supports_autoexpirerJ  r  r(   r   r   r   r   r   r   rK   r.   r   r2   r  r  r  r  r  r  r   r   r!  r'  r+  r4  r7  r   rb  rh  rd  re  propertyrl  r<   rp  r   r   s   @r9   r!   r!      sN    $N E275..T O $?C+/!%r
hFP
  7$&D1 %.D /5.E.E.4.E.EE
1 I I I I (,]~

&- $ $
 6 6D Dr:   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   rq  rX   r:   r9   rv  rv  v  s    	r:   rv  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.;rt  Nc                 v    | j                   t        t        j                               t	        |   |i | y r&   )rt  r   E_REDIS_SENTINEL_MISSINGr   r'   r(   r4   s      r9   r(   zSentinelBackend.__init__  s4    == &'?'E'E'GHH$)&)r:   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     r9   r   z)SentinelBackend.as_uri.<locals>.<genexpr>  s      
 u%
s    c              3   L   K   | ]  }|j                  d       r|dd n|  yw)z:///Nr=  )endswith)r   uris     r9   r   z)SentinelBackend.as_uri.<locals>.<genexpr>  s.      /
 V,CH#5/
s   "$)r'   as_urir   split_SERVER_URI_SEPARATORrL  )r5   r|  
uri_chunksr8   s      r9   r  zSentinelBackend.as_uri  sq     7>!1 "  

((.b//0J0JK

 )).. /
!/
 
 	
r:   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   r  )r   r   r   r   )r   r   r   r   )r  r  r   r'   r   appendr   r   )	r5   r   r   chunksr   r~  rs   paramr8   s	           r9   r   z SentinelBackend._params_from_url  s    4556("-
 	-E7+H , .Dw&&t,	- 8 	"ENN5!	" 4 	FE'"u
70CA0F'F$.w$7$:$>$>u$E
5!	F r:   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 )Nr  min_other_sentinelsr   sentinel_kwargsr   r   )r  r  )r   r   r   r   rt  Sentinel)r5   rg  r   r  r  r  cpsentinel_instances           r9   _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       }dD ci c]  }||v s|||    }} |j                  d|| j	                         d|j
                  S c c}w )Nmaster_name)r   r   )service_nameredis_classrX   )r  r   r   
master_forrd  r=   )r5   rg  r  r  kcredentialss         r9   re  zSentinelBackend._get_pool  s    7D77A&A--11-F #;
a6kAvayL
 
 , ++ 
$((*
 
 /			
s
   	A4A4)F)r   r   r   rq  r  getattrr   rt  rv  r   r(   r  r   r  re  r   r   s   @r9   r"   r"     s@    +  uj$/H;C7*
( !r:   r"   )Jrq  ru   
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   rz  r   r   r   r   r   rZ   r   rB   r$   r!   r  rt  SentinelManagedConnectionr   rv  r"   rX   r:   r9   <module>r     sB   !  %  7 7   & 2 / : $  . ? ) Q Q 8 6 ' . ? *#=
	 .
 
  * &
) %
 
7 
 
H	h.' h.VtD+-> tDn 5*d#NN44Ol OG  #E"#  		s$   
D D 	DDD'&D'