Your IP : 216.73.216.213


Current Path : /opt/alt/python35/lib/python3.5/site-packages/aioredis/sentinel/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib/python3.5/site-packages/aioredis/sentinel/__pycache__/pool.cpython-35.pyc



�D�ZG�@s�ddlZddlZddlmZddlmZddlmZddlm	Z	ddl
mZmZddl
mZmZmZmZmZmZe�Zejd	�Zd
dddddd
ddddddddddddd�	ZGdd�d�ZGdd�de�Zdd�ZGdd�de�ZGd d!�d!e�ZGd"d#�d#e�ZGd$d%�d%e�Z dS)&�N)�
ALL_COMPLETED)�timeout�)�sentinel_logger)�Receiver)�create_pool�ConnectionsPool)�MasterNotFoundError�SlaveNotFoundError�PoolClosedError�
RedisError�MasterReplyError�SlaveReplyError�monitor�db�password�encoding�minsize��maxsize�
�ssl�parserrg�������?�loopc	�s�t|ttf�s!t|��|	dkr9tj�}	t|d|d|d|d|d|d|d|d	|d
|	�	}
|
j�IdH|
S)zCreate SentinelPool.Nrrrrrrrrr)�
isinstance�list�tuple�AssertionError�asyncio�get_event_loop�SentinelPool�discover)�	sentinelsrrrrrrrrr�pool�r$�G/opt/alt/python35/lib/python3.5/site-packages/aioredis/sentinel/pool.py�create_sentinel_pools!	r&c@seZdZdZddddddddddddd	d
�Zedd��Zd
d�Zdd�Zdd�Z	edd��Z
dd�Zdd�Zdd�Z
ddd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�ZdS)+r z�Sentinel connections pool.

    Holds connection pools to known and discovered (TBD) Sentinels
    as well as services' connections.
    rNrrrrrc	s�|
dkrtj�}
t|��_|
�_|	�_g�_i�_i�_|�_	|�_
|�_|�_|�_
|�_|�_tjd|
��_d�_td|
��_���fdd�}tj|�d|
��_dS)Nrc�s�y�x��j�IdHr��jdd�IdH\}\}}|jd�}tjd||�|dkr|jd�^}}}|dkr�j|�qWWntjk
r�YnXdS)Nrzutf-8z%s: %s�+odown� �master)r')	Zwait_message�get�decode�_logger�debug�split�_need_rediscoverr�CancelledError)�chZev�data�typ�name�tail)r�selfr$r%�echo_eventsRs#z*SentinelPool.__init__.<locals>.echo_events)rr�set�
_sentinels�_loop�_timeout�_pools�_masters�_slaves�
_parser_class�	_redis_db�_redis_password�
_redis_ssl�_redis_encoding�_redis_minsize�_redis_maxsize�Event�_close_state�
_close_waiterr�_monitor�
ensure_future�
_monitor_task)r6r"rrrrrrrrrr7r$)rr6r%�__init__7s(													zSentinelPool.__init__cCs|jS)zjTimeout (seconds) for Redis/Sentinel command calls during
        master/slave address discovery.
        )r;)r6r$r$r%�discover_timeoutkszSentinelPool.discover_timeoutcCs~||jkrst||ddd|jd|jd|jd|jd|jd|jd	|jd
|j	�	|j|<|j|S)z7Returns wrapper to master's pool for requested service.�	is_masterTrrrrrrrr)
r=�ManagedPoolr@rArCrDrErBr?r:)r6�servicer$r$r%�
master_forrs							zSentinelPool.master_forcCs~||jkrst||ddd|jd|jd|jd|jd|jd|jd	|jd
|j	�	|j|<|j|S)z6Returns wrapper to slave's pool for requested service.rNFrrrrrrrr)
r>rOr@rArCrDrErBr?r:)r6rPr$r$r%�	slave_for�s							zSentinelPool.slave_forcOs=|jrtd��x!|jD]}|j|||�SWdS)zExecute sentinel command.zSentinel pool is closedN)�closedrr<�execute)r6�command�args�kwargsr#r$r$r%rT�s	zSentinelPool.executecCs
|jj�S)z"True if pool is closed or closing.)rG�is_set)r6r$r$r%rS�szSentinelPool.closedcCsA|jj�s=tj|j�d|j�|_|jj�dS)z;Close all controlled connections (both sentinel and redis).rN)rGrXrrJ�	_do_closer:rHr8)r6r$r$r%�close�szSentinelPool.closec�s$|jj�IdHg}|jd}|_|j�|j|�x<|jr�|jjd�}|j�|j|j��qEWx?|j	r�|j	j
�\}}|j�|j|j��q�Wx?|jr|jj
�\}}|j�|j|j��q�Wtj
|d|j�IdHdS)Nrr)rG�waitrK�cancel�appendr<�poprZ�wait_closedr=�popitemr>rZgatherr:)r6�tasks�taskr#�_r$r$r%rY�s$




zSentinelPool._do_closec�sI|jj�IdH|jdk	s't�tj|jd|j�IdHdS)zWait until pool gets closed.Nr)rGr[rHrrZshieldr:)r6r$r$r%r_�szSentinelPool.wait_closedc
�sa|dkr|j}g}g}x-|jD]"}|j|j|||��q+Wtj|d|jdt�IdH\}}|s�td||f��x,|D]$}|j	�}t
|t�r�q�q�W|s�td��|jdd�|}|jdd�<x'|D]}	|	j
�|	j�IdHqWx2|jD]'}	|	jd|jjd��IdHq2WdS)u�Discover sentinels and all monitored services within given timeout.

        If no sentinels discovered within timeout: TimeoutError is raised.
        If some sentinels were discovered but not all — it is ok.
        If not all monitored services (masters/slaves) discovered
        (or connections established) — it is ok.
        TBD: what if some sentinels/services unreachable;
        NrZreturn_whenzExpected all tasks to completez!Could not connect to any sentinels
psubscribe�*)rMr9r]�_connect_sentinelrr[r:rr�resultr�	Exceptionr<rZr_Zexecute_pubsubrI�pattern)
r6rra�pools�addr�done�pendingrbrfr#r$r$r%r!�s,	 
'

zSentinelPool.discoverc�s�yat|d|j��4t|ddddd|jd|j�IdH}WdQRX|j|�|SWnztjk
r�}ztjd||�|SWYdd}~Xn<t	k
r�}ztjd	||�|SWYdd}~XnXdS)
zeTry to connect to specified Sentinel returning either
        connections pool or exception.
        rrrrrrNz4Failed to connect to Sentinel(%r) within %ss timeoutz$Error connecting to Sentinel(%r): %r)
�
async_timeoutr:rr?r]r�TimeoutErrorrr-rg)r6�addressrrir#�errr$r$r%re�s"	


zSentinelPool._connect_sentinelc�s�|}|jdd�}x�|D]�}y�t|d|j��|j||�IdH}WdQRX|j|}t|d|j��^tj��J}|j|�IdH}	|j|	j	�|j
|	d�IdH|j�WdQRXWdQRX|	SWq tj
k
r��Yq tjk
rw Yq tk
rn}
z9tjd|||
�tj|d|j�IdHw WYdd}
~
Xq tk
r�}
ztdj|�|
��WYdd}
~
Xq tk
r�tj|d|j�IdHw Yq Xq Wtdj|���dS)z/Perform Master discovery for specified service.Nrr)zDiscoverError(%r, %s): %rzService {} errorzNo master found for {})r<rmr:�_get_masters_addressr=�
contextlib�	ExitStack�_create_new_connection�callbackrZ�_verify_service_role�pop_allrr0rn�
DiscoverErrorrr-�sleeprr
�formatrgr	)r6rPr�idle_timeoutri�sentinelror#�stack�connrpr$r$r%�discover_masters<	

	
*
zSentinelPool.discover_masterc�s�|}|jdd�}x�|D]�}y�t|d|j��|j||�IdH}WdQRX|j|}t|d|j��^tj��J}	|j|�IdH}
|	j|
j	�|j
|
d�IdH|	j�WdQRXWdQRX|
SWq tj
k
r��Yq tjk
rw Yq tk
rEtj|d|j�IdHw Yq tk
r�}ztdj|�|��WYdd}~Xq tk
r�tj|d|j�IdHw Yq Xq Wtdj|���dS)z.Perform Slave discovery for specified service.NrZslavezService {} errorzNo slave found for {})r<rmr:�_get_slave_addressr>rrrsrtrurZrvrwrr0rnrxryrrrzrgr
)r6rPrrWr{rir|ror#r}r~rpr$r$r%�discover_slave1s8


*
zSentinelPool.discover_slavec�s�|jdd|dd�IdH}|s/t��t|�}|dt|d�f}t|djd��}d	d
dh|@r�t|��|S)Nssentinelsmasterrzutf-8�ip�port�flags�,�s_down�o_down�disconnected)rT�UnknownService�	make_dict�intr8r.�BadState)r6r|rP�stateror�r$r$r%rqRs	z!SentinelPool._get_masters_addressc�s�|jdd|dd�IdH}|s/t��xmtt|�D]P}|dt|d�f}t|djd��}d	d
dh|@r�q?|SWt|��dS)Nssentinelsslavesrzutf-8r�r�r�r�r�r�r�)rTr��mapr�r�r8r.r�)r6r|rPZslavesr�ror�r$r$r%r�as	zSentinelPool._get_slave_addressc�s:|jddd�IdH}|d|kr6t|��dS)Nsrolerzutf-8r)rT�RoleMismatch)r6r~Zrole�resr$r$r%rvpsz!SentinelPool._verify_service_rolecCshtjd|�x'|jj�D]\}}|j�q Wx'|jj�D]\}}|j�qJWdS)NzMust redisover service %s)rr-r=�items�need_rediscoverr>)r6rPr#r$r$r%r/us
zSentinelPool._need_rediscover)�__name__�
__module__�__qualname__�__doc__rL�propertyrMrQrRrTrSrZrYr_r!rerr�rqr�rvr/r$r$r$r%r 0s(2&1!r cs�eZdZdddddddd�fdd�Zedd��Zf�fdd	�Z�fd
d�Z�fdd
�Zdf�fdd�Z	�fdd�Z
dd�Z�S)rONrrcs}t�jtd|d|d|d|d|	d|
d|d|�|jtksUt�||_||_||_d	|_dS)
Nrrrrrrrrg�������?)	�superrL�_NON_DISCOVERED�_addressr�	_sentinel�_service�
_is_masterZ_discover_timeout)r6r|rPrNrrrrrrrr)�	__class__r$r%rLs
			zManagedPool.__init__cCs|jtkrdS|jS)N)r�r�)r6r$r$r%ro�szManagedPool.addresscs,|jtkrdtfSt�j||�S)N)r�r�r��get_connection)r6rUrV)r�r$r%r��s
zManagedPool.get_connectionc�s�|tkr�|j�IdH|jrM|jj|jd|jj�IdH}n&|jj|jd|jj�IdH}|j|_	t
jd|j|j�|St�j
|�IdHS)Nrz!Discoverred new address %r for %s)r�Z	_do_clearr�r�rr�rMr�ror�rr-r�rt)r6ror~)r�r$r%rt�s		 		z"ManagedPool._create_new_connectioncs\t|j�}t�j�|t|j�8}|rXtjd|�|jj|j�dS)Nz1Dropped %d closed connnection(s); must rediscover)	�lenZ_poolr��_drop_closedrr-r�r/r�)r6Zdiff)r�r$r%r��s

zManagedPool._drop_closedc�s6|jtkr|j�IdHt�j||�IdHS)N)r�r��clearr��acquire)r6rUrV)r�r$r%r��szManagedPool.acquirecsC|j}t�j|�|r?tjd�|jj|j�dS)Nz+Released closed connection; must rediscover)rSr��releaserr-r�r/r�)r6r~Z
was_closed)r�r$r%r��s	zManagedPool.releasecCs
t|_dS)N)r�r�)r6r$r$r%r��szManagedPool.need_rediscover)r�r�r�rLr�ror�rtr�r�r�r�r$r$)r�r%rO}s	rOcCst|�}tt||��S)N)�iter�dict�zip)Z
plain_list�itr$r$r%r��sr�c@seZdZdZdS)rxz-Internal errors for masters/slaves discovery.N)r�r�r�r�r$r$r$r%rx�srxc@seZdZdZdS)r�z0Bad master's / slave's state read from sentinel.N)r�r�r�r�r$r$r$r%r��sr�c@seZdZdZdS)r�z.Service is not monitored by specific sentinel.N)r�r�r�r�r$r$r$r%r��sr�c@seZdZdZdS)r�z$Service reported to have other Role.N)r�r�r�r�r$r$r$r%r��sr�)!rrrZconcurrent.futuresrrmr�logrZpubsubrr#rr�errorsr	r
rrr
r�objectr�ZgetChildr,r&r rOr�rgrxr�r�r�r$r$r$r%�<module>s(.	!�NJ