U
    be>                     @   sl   d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
 d dlmZ eeZG dd dZdS )    N)ClientPooledClientcheck_key_helpernormalize_server_spec)RendezvousHash)MemcacheErrorc                   @   sr  e Zd ZdZeZeddddddedddddddddddd	d
dfddZdd Z	dHddddZ
dIddddZddddZdd Zdd Zdd Zdd Zdd Zd d! Zd"d# ZeZd$d% ZdJd&d'Zd(d) Zd*d+ Zd,d- ZeZdKd.d/ZeZd0d1 Zd2d3 ZeZd4d5 Z d6d7 Z!d8d9 Z"d:d; Z#e$dd<d=Z%e%Z&d>d? Z'd@dA Z(dBdC Z)dddDdEZ*dddFdGZ+dS )L
HashClientzH
    A client for communicating with a cluster of memcached servers
    NF    r         <   Tasciic                 C   s   i | _ || _|| _|| _|| _|| _|| _|| _i | _i | _	t

 | _| | _||||	|
||||||||d| _|dkr| j|||d |D ]}| t| q|| _|| _dS )aQ  
        Constructor.

        Args:
          servers: list() of tuple(hostname, port) or string containing a UNIX
                   socket path.
          hasher: optional class three functions ``get_node``, ``add_node``,
                  and ``remove_node``
                  defaults to Rendezvous (HRW) hash.

          use_pooling: use py:class:`.PooledClient` as the default underlying
                       class. ``max_pool_size`` and ``lock_generator`` can
                       be used with this. default: False

          retry_attempts: Amount of times a client should be tried before it
                          is marked dead and removed from the pool.
          retry_timeout (float): Time in seconds that should pass between retry
                                 attempts.
          dead_timeout (float): Time in seconds before attempting to add a node
                                back in the pool.
          encoding: optional str, controls data encoding (defaults to 'ascii').

        Further arguments are interpreted as for :py:class:`.Client`
        constructor.
        )connect_timeouttimeoutno_delaysocket_modulesocket_keepalive
key_prefixserde
serializerdeserializerallow_unicode_keysdefault_noreplyencodingtls_contextT)max_pool_sizepool_idle_timeoutlock_generatorN)clientsretry_attemptsretry_timeoutdead_timeoutuse_poolingr   
ignore_excr   _failed_clients_dead_clientstime_last_dead_check_timehasherdefault_kwargsupdate
add_serverr   r   r   )selfZserversr(   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r   r   r   r   server r.   X/var/www/html/services/stratfitenv/lib/python3.8/site-packages/pymemcache/client/hash.py__init__   sJ    3
zHashClient.__init__c                 C   s&   t |ttfr"t|dkr"d| S |S )Nr
   z%s:%s)
isinstancelisttuplelen)r,   r-   r.   r.   r/   _make_client_keyy   s    zHashClient._make_client_key)returnc                 C   sr   |d k	r"t |tstd||f}| jr,tn| j}||f| j}| jrN| j|_| |}|| j|< | j	
| d S Nz*Server must be a string when passing port.)r1   str	TypeErrorr"   r   client_classr)   r5   r   r(   add_node)r,   r-   port_classclientkeyr.   r.   r/   r+   ~   s    


zHashClient.add_serverc                 C   sZ   |d k	r"t |tstd||f}| |}t }| j| || j|< | j	| d S r7   )
r1   r8   r9   r5   r&   r$   popr%   r(   remove_node)r,   r-   r<   r?   	dead_timer.   r.   r/   remove_server   s    


zHashClient.remove_serverc                 C   s~   t   }| j}|| | jkrzg }| j D ] \}}|| | jkr*|| q*|D ]"}td| | | | j|= qP|| _d S )Nz%bringing server back into rotation %s)	r&   r'   r!   r%   itemsappendloggerdebugr+   )r,   current_timeZldc
candidatesr-   rB   r.   r.   r/   _retry_dead   s    

zHashClient._retry_deadc                 C   sR   t || j| j | jr|   | j|}|d krH| jdkr@d S td| j	| S )NTz%All servers seem to be down right now)
r   r   r   r%   rJ   r(   Zget_noder#   r   r   )r,   r?   r-   r.   r.   r/   _get_client   s    
zHashClient._get_clientc           	      O   s   z|j | jkr| j|j  }|d | jk rt|d }t | | jkrntd|j  |||}| j|j  |W S |W S td|j  | |j  |||}|W S  t	k
r   | 
|j  | js | Y S  tk
r   | jsނ | Y S X d S Nattemptsfailed_timezretrying failed server: %szmarking server as dead: %s)r-   r$   r   r&   r    rF   rG   r@   rC   OSError_mark_failed_serverr#   	Exception)	r,   r>   funcdefault_valargskwargsfailed_metadatarN   resultr.   r.   r/   _safely_run_func   s0    

zHashClient._safely_run_funcc           
      O   s`  g }g }z|j | jkr| j|j  }|d | jk r|d }t | | jkrtd|j  | j||f||\}}}	|	d k	r~|	| j|j  |W S |	 W S td|j  | 
|j  | j||f||\}}}	|	d k	r|	|W S  tk
r$   | |j  | js tt|	 t|  Y S  tk
rZ   | js> tt|	 t|  Y S X d S rL   )r-   r$   r   r&   r    rF   rG   	_set_manyr@   keysrC   rO   rP   r#   r2   setrQ   )
r,   r>   valuesrT   rU   failed	succeededrV   rN   errr.   r.   r/   _safely_run_set_many   sJ     

zHashClient._safely_run_set_manyc                 C   s   || j kr*| jdkr*t dd| j |< np|| j krj| jdkrjt dd| j |< td| | | n0| j | }|d  d7  < t |d< || j |< d S )Nr   )rN   rM   zmarking server as dead %srM   r   rN   )r$   r   r&   rF   rG   rC   )r,   r-   rV   r.   r.   r/   rP   !  s    
zHashClient._mark_failed_serverc                 O   sJ   |  |}|d kr|S t||}t|}|d| | j|||f||S Nr   )rK   getattrr2   insertrX   )r,   cmdr?   rS   rT   rU   r>   rR   r.   r.   r/   _run_cmd9  s    

zHashClient._run_cmdc              
      sv   g  g }z|j |f|| W n: tk
rX } z| jsH| |f W Y S W 5 d }~X Y nX  fdd|D }| d fS )Nc                    s   g | ]}| kr|qS r.   r.   ).0r?   r]   r.   r/   
<listcomp>N  s      z(HashClient._set_many.<locals>.<listcomp>)set_manyrQ   r#   )r,   r>   r\   rT   rU   r^   er.   rg   r/   rY   D  s    $zHashClient._set_manyc                 C   s$   | j  D ]}| ||jd q
d S NF)r   r\   rX   closer,   r>   r.   r.   r/   rl   Q  s    zHashClient.closec                 O   s   | j d|df||S )Nr[   Fre   r,   r?   rT   rU   r.   r.   r/   r[   W  s    zHashClient.setc                 K   s   | j d||fd|i|S )Ngetdefaultrn   )r,   r?   rq   rU   r.   r.   r/   rp   Z  s    zHashClient.getc                 O   s   | j d|df||S )NincrFrn   ro   r.   r.   r/   rr   ]  s    zHashClient.incrc                 O   s   | j d|df||S )NdecrFrn   ro   r.   r.   r/   rs   `  s    zHashClient.decrc           
      O   s   t t}g }| D ]4\}}| |}|d kr<|| q|||j |< q| D ]0\}	}| j| |	 }|| j	||f||7 }qT|S )N)
collectionsdefaultdictdictrD   rK   rE   r-   r   r5   r`   )
r,   r\   rT   rU   client_batchesr]   r?   valuer>   r-   r.   r.   r/   ri   c  s    


zHashClient.set_manyc                 O   s   t t}i }|D ](}| |}|d kr*q||j | q| D ]^\}	}| j| |	 }t|}
|
	d| |r||j
}n|j}| j||i f|
|}|| qD|S ra   )rt   ru   r2   rK   r-   rE   rD   r   r5   rc   	gets_manyget_manyrX   r*   )r,   rZ   getsrT   rU   rw   endr?   r>   r-   new_argsZget_funcrW   r.   r.   r/   rz   x  s"    

zHashClient.get_manyc                 O   s   | j d|d f||S )Nr{   rn   ro   r.   r.   r/   r{     s    zHashClient.getsc                 O   s   | j |f|ddi|S )Nr{   T)rz   )r,   rZ   rT   rU   r.   r.   r/   ry     s    zHashClient.gets_manyc                 O   s   | j d|df||S )NaddFrn   ro   r.   r.   r/   r~     s    zHashClient.addc                 O   s   | j d|df||S )NprependFrn   ro   r.   r.   r/   r     s    zHashClient.prependc                 O   s   | j d|df||S )NrE   Frn   ro   r.   r.   r/   rE     s    zHashClient.appendc                 O   s   | j d|df||S )NdeleteFrn   ro   r.   r.   r/   r     s    zHashClient.deletec                 O   s$   |D ]}| j d|df|| qdS )Nr   FTrn   )r,   rZ   rT   rU   r?   r.   r.   r/   delete_many  s    zHashClient.delete_manyc                 O   s   | j d|df||S )NcasFrn   ro   r.   r.   r/   r     s    zHashClient.casc                 O   s   | j d|df||S )NreplaceFrn   ro   r.   r.   r/   r     s    zHashClient.replacec                 O   s   | j d|df||S )NtouchFrn   ro   r.   r.   r/   r     s    zHashClient.touchc                 O   s,   | j  D ]}| j||jdf|| q
d S rk   )r   r\   rX   	flush_all)r,   rT   rU   r>   r.   r.   r/   r     s    zHashClient.flush_allc                 C   s$   | j  D ]}| ||jd q
d S rk   )r   r\   rX   quitrm   r.   r.   r/   r     s    zHashClient.quit)N)N)N)F),__name__
__module____qualname____doc__r   r:   r   socketr0   r5   r+   rC   rJ   rK   rX   r`   rP   re   rY   rl   Zdisconnect_allr[   rp   rr   rs   ri   Z	set_multirz   Z	get_multir{   ry   Z
gets_multir~   r   rE   r   boolr   Zdelete_multir   r   r   r   r   r.   r.   r.   r/   r      sv   
_/8

r   )rt   r   r&   loggingZpymemcache.client.baser   r   r   r   Zpymemcache.client.rendezvousr   Zpymemcache.exceptionsr   	getLoggerr   rF   r   r.   r.   r.   r/   <module>   s   
