
\c           @` s'  d  d l  m Z m Z m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z y d  d l	 Z	 Wn e
 k
 r d Z	 n Xd  d l Z d  d l 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 m Z m Z m Z m  Z  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+ m, Z, m- Z- m. Z. m/ Z/ d d l m0 Z0 m1 Z1 m2 Z2 m3 Z3 e j4 e5  Z6 d   Z7 e7   Z8 d   Z9 d   Z: d   Z; d e+ f d     YZ< d e< f d     YZ= d   Z> d e? f d     YZ@ d e, e@ f d     YZA d eA f d     YZB d eA f d      YZC d! e- e@ f d"     YZD d# eD f d$     YZE d% eD f d&     YZF d' e% f d(     YZG d) eG f d*     YZH d+ eG f d,     YZI eH   e& d- <eI   e& d. <d S(/   i    (   t   print_functiont   divisiont   absolute_importN(   t   gent   netutil(   t   StreamClosedErrort   IOStream(   t	   TCPClient(   t	   TCPServeri   (   t   finalizet   PY3(   t   ThreadPoolExecutor(   t   ensure_bytest	   ensure_ipt   get_ipt   get_ipv6t   nbytest   parse_timedeltat   shutting_downi   (   t   Backendt   backends(   t   parse_host_portt   unparse_host_port(   t   Commt	   Connectort   Listenert   CommClosedErrort   FatalCommClosedError(   t	   to_framest   from_framest   get_tcp_server_addresst   ensure_concrete_hostc          C` s:   y! d d  l  }  |  j   j d SWn t k
 r5 d SXd  S(   Ni    i   g    eA(   t   psutilt   virtual_memoryt   totalt   ImportError(   R    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_total_physical_memory*   s
    c         C` sO  |  j    r d St j j d  } t t | d d  } |  j } d } | | d k se t d   t d | d	  } t d | | |  } | | | } | d
 k s t  yvt	 j
 j d  r t j d | |  | j t j d | d | d f  n | j t j t j d  y t j } t j } t j } Wn; t k
 rst	 j
 d k rjd } d } d } qtd } n X| d k	 rt j d | | |  | j t j | |  | j t j | |  | j t j | |  n  t	 j
 j d  r$t j d | d  d }	 | j t j |	 | d  n  Wn# t k
 rJ}
 t j d |
  n Xd S(   s5   
    Set kernel-level TCP timeout on the stream.
    Ns   distributed.comm.timeouts.tcpt   defaultt   secondsi
   i   s   Timeout too lowi   i   i    t   wins+   Setting TCP keepalive: idle=%d, interval=%di  t   darwini   i  i  s7   Setting TCP keepalive: nprobes=%d, idle=%d, interval=%dt   linuxs   Setting TCP user timeout: %d msi   s'   Could not set timeout on TCP stream: %s(   t   closedt   daskt   configt   gett   intR   t   sockett   AssertionErrort   maxt   syst   platformt
   startswitht   loggert   debugt   ioctlt   SIO_KEEPALIVE_VALSt
   setsockoptt
   SOL_SOCKETt   SO_KEEPALIVEt   TCP_KEEPIDLEt   TCP_KEEPINTVLt   TCP_KEEPCNTt   AttributeErrort   Nonet   SOL_TCPt   EnvironmentErrort   warning(   t   streamt   timeoutt   sockt   nprobest   idlet   intervalR<   R=   R>   t   TCP_USER_TIMEOUTt   e(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   set_tcp_timeout6   sR    	'			
!c         C` sD   |  j    r d Sy t |  j j   d    SWn t k
 r? d SXd S(   s'   
    Get a stream's local address.
    s   <closed>i   N(   R*   R   R/   t   getsocknameRB   (   RD   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_stream_addressq   s    c         C` s   | j  d k	 r | j  } t rd t | t j  rd d | j k rd t d |  | j j | f   qd n  t	 d |  | j j | f   n t	 d |  | f   d S(   s8   
    Re-raise StreamClosedError as CommClosedError.
    t
   UNKNOWN_CAs   in %s: %s: %ss	   in %s: %sN(
   t
   real_errorR@   t   sslt
   isinstancet   SSLErrort   reasonR   t	   __class__t   __name__R   (   t   objt   exc(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   convert_stream_closed_error   s    	""t   TCPc           B` s   e  Z d  Z e j d k Z e e d  Z e	 d  Z
 d   Z d   Z e d    Z e d    Z e j d d	   Z e j d d
 d   Z e j d    Z d   Z d   Z e d    Z RS(   sO   
    An established communication based on an underlying Tornado IOStream.
    i   i   t	   read_intoc         C` s   t  j |   | |  _ | |  _ | |  _ | |  _ t |  |  j    |  _ t	 |  j _
 i  |  _ | j t  t |  |  j   d  S(   N(   R   t   __init__t   _local_addrt
   _peer_addrRD   t   deserializeR	   t   _get_finalizert
   _finalizert   Falset   atexitt   _extrat   set_nodelayt   TrueRL   t   _read_extra(   t   selfRD   t
   local_addrt	   peer_addrR_   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR\      s    					
c         C` s   d  S(   N(    (   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyRg      s    c         C` s   |  j  t |   d  } | S(   Nc         S` s1   |  j    s- t j d | f  |  j   n  d  S(   Ns   Closing dangling stream in %s(   R*   R5   RC   t   close(   RD   t   r(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR	      s    (   RD   t   repr(   Rh   R	   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR`      s    c         C` s   |  j  S(   N(   R]   (   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   local_address   s    c         C` s   |  j  S(   N(   R^   (   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   peer_address   s    c         c` s  |  j  } | d  k r t  n  y | j d  V} t j d |  d } | j d |  V} t j d | |  } g  } x | D]~ } | r t r |  j r t |  } | j	 |  V} | | k s t
 | | f   q | j |  V} n d } | j |  q~ WWn5 t k
 r8}	 d  |  _  t   st |  |	  qnZ Xy  t | d |  j d | V}
 Wn' t k
 r|  j   t d   n Xt j |
   d  S(   Ni   t   Qi    t    R_   t   deserializerss    aborted stream on truncated data(   RD   R@   R   t
   read_bytest   structt   unpackR
   t   _iostream_has_read_intot	   bytearrayR[   R0   t   appendR   R   RY   R   R_   t   EOFErrort   abortR   t   Return(   Rh   Rr   RD   t   n_framest   lengthst   framest   lengtht   framet   nRK   t   msg(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   read   s:    		!		
t   messagec      
   c` s  |  j  } d } | d  k r$ t  n  t | d | d | d i |  j d 6|  j d 6V} yg  | D] } t |  ^ qa } t j d t	 |   g g  | D] }	 t j d |	  ^ q }
 t
 r t |  d k  r d
 j |
 |  } | j |  nx | j d
 j |
   x_ | D]W } |  j s-t |  } n  | j |  } | t |  7} | d k r| Vd } qqWWn] t k
 r} d  } t |  |  n8 t k
 r} | j d  k rt j d |  q  n Xt j t t t |     d  S(   Ni    t   serializerst   on_errort   contextt   sendert	   recipientRp   i   i   Rq   g    ~As*   tried to write message %s on closed streami   (   RD   R@   R   R   R]   R^   R   Rt   t   packt   lenR
   t   sumt   joint   writet   _iostream_allows_memoryviewR   R   RY   t	   TypeErrort   _write_bufferR5   t   infoR   R{   t   map(   Rh   R   R   R   RD   t   bytes_since_last_yieldR~   R   R}   t   xt   length_bytest   bt   futureRK   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR      sB    		&	c         c` s   |  j  d  } |  _  | d  k	 r | j   r zL y4 | j   rO | j d  Vn  | j j t j  Wn t k
 rv n XWd  |  j	 j
   | j   Xn  d  S(   NRq   (   RD   R@   R*   t   writingR   R/   t   shutdownt	   SHUT_RDWRRB   Ra   t   detachRk   (   Rh   RD   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyRk     s     c         C` sJ   |  j  d  } |  _  | d  k	 rF | j   rF |  j j   | j   n  d  S(   N(   RD   R@   R*   Ra   R   Rk   (   Rh   RD   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyRz      s    c         C` s   |  j  d  k p |  j  j   S(   N(   RD   R@   R*   (   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR*   &  s    c         C` s   |  j  S(   N(   Rd   (   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt
   extra_info)  s    (   i   i   N(   RV   t
   __module__t   __doc__t   tornadot   version_infoR   t   hasattrR   Rv   Rf   R\   Rg   R`   t   propertyRn   Ro   R   t	   coroutineR@   R   R   Rk   Rz   R*   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyRZ      s    		&.		t   TLSc           B` s   e  Z d  Z d   Z RS(   s(   
    A TLS-specific version of TCP.
    c         C` s   t  j |   |  j j } | d  k	 r |  j j d | j   d | j    |  j d \ } } } t	 j
 d |  j | | |  n  d  S(   Nt   peercertt   ciphers7   TLS connection with %r: protocol=%s, cipher=%s, bits=%d(   RZ   Rg   RD   R/   R@   Rd   t   updatet   getpeercertR   R5   R6   R^   (   Rh   RF   R   t   protot   bits(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyRg   3  s    %(   RV   R   R   Rg   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   .  s   c         C` s>   |  j  d  } t | t j  s: t d t |    n  | S(   Nt   ssl_contextss   TLS expects a `ssl_context` argument of type ssl.SSLContext (perhaps check your TLS configuration?)  Instead got %s(   R-   RR   RQ   t
   SSLContextR   t   str(   t   connection_argst   ctx(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   _expect_tls_contextB  s    t   RequireEncryptionMixinc           B` s   e  Z d    Z RS(   c         C` s:   |  j  r6 | j d  r6 t d |  j | f   n  d  S(   Nt   require_encryptionsL   encryption required by Dask configuration, refusing communication from/to %r(   t	   encryptedR-   t   RuntimeErrort   prefix(   Rh   t   addressR   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   _check_encryptionN  s    (   RV   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   M  s   t   BaseTCPConnectorc           B` se   e  Z e r9 e d  d d Z e j d e d e  Z n d Z e
 d e  Z e j e d   Z RS(   i   t   thread_name_prefixs   TCP-Executort   close_executort   executort   resolverc   
      k` s   |  j  | |  t |  \ } } |  j |   } yJ t j j | | d t | V} | j   rz | j rz t	 | j   n  Wn  t	 k
 r } t
 |  |  n X|  j t |  }	 t j |  j | |	 |  j | |    d  S(   Nt   max_buffer_size(   R   R   t   _get_connect_argsR   t   clientt   connectt   MAX_BUFFER_SIZER*   t   errorR   RY   R   RN   R   R{   t
   comm_class(
   Rh   R   R_   R   t   ipt   portt   kwargsRD   RK   Rn   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   _  s    	N(   RV   R   R
   R   t	   _executorR   t   ExecutorResolverRb   t	   _resolverR@   R   R   R   R   Rf   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   W  s   t   TCPConnectorc           B` s#   e  Z d  Z e Z e Z d   Z RS(   s   tcp://c         K` s   i  S(   N(    (   Rh   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    (   RV   R   R   RZ   R   Rb   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   {  s   t   TLSConnectorc           B` s#   e  Z d  Z e Z e Z d   Z RS(   s   tls://c         K` s   t  |  } i | d 6S(   Nt   ssl_options(   R   (   Rh   R   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    (   RV   R   R   R   R   Rf   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s   t   BaseTCPListenerc           B` sk   e  Z e d  d  Z d   Z d   Z d   Z e j d    Z	 d   Z
 e d    Z e d    Z RS(	   i    c         K` se   |  j  | |  t | |  \ |  _ |  _ | |  _ | |  _ |  j |   |  _ d  |  _	 d  |  _
 d  S(   N(   R   R   R   R   t   comm_handlerR_   t   _get_server_argst   server_argsR@   t
   tcp_servert   bound_address(   Rh   R   R   R_   t   default_portR   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR\     s    			c         C` s   t  d t |  j  |  _ |  j |  j _ t t j j	 d   } x t
 d  D] } y% t j |  j d |  j d | } Wn@ t k
 r } |  j d k s | j t j k r   n  | } qL X|  j j |  PqL W|  d  S(   NR   s   distributed.comm.socket-backlogi   R   t   backlogi    (   R   R   R   R   t   _handle_streamt   handle_streamR.   R+   R,   R-   t   rangeR   t   bind_socketsR   R   RB   t   errnot
   EADDRINUSEt   add_sockets(   Rh   R   t   it   socketsRK   RX   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   start  s    !
c         C` s0   |  j  d  } |  _  | d  k	 r, | j   n  d  S(   N(   R   R@   t   stop(   Rh   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    c         C` s"   |  j  d  k r t d   n  d  S(   Ns,   invalid operation on non-started TCPListener(   R   R@   t
   ValueError(   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   _check_started  s    c         c` s   |  j  t | d    } |  j | |  V} | d  k r: d  St j d | |  j  |  j  t |  } |  j | | | |  j	  } |  j
 |  Vd  S(   Ni   s!   Incoming connection from %r to %r(   R   R   t   _prepare_streamR@   R5   R6   t   contact_addressRN   R   R_   R   (   Rh   RD   R   Rn   t   comm(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    c         C` s9   |  j    |  j d k r. t |  j  |  _ n  |  j d  S(   s@   
        The listening address as a (host, port) tuple.
        i   N(   R   R   R@   R   R   (   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_host_port  s    
c         C` s   |  j  t |  j     S(   s4   
        The listening address as a string.
        (   R   R   R   (   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   listen_address  s    c         C` s2   |  j    \ } } t |  } |  j t | |  S(   s2   
        The contact address as a string.
        (   R   R   R   R   (   Rh   t   hostR   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    (   RV   R   Rf   R\   R   R   R   R   R   R   R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s   
				t   TCPListenerc           B` s5   e  Z d  Z e Z e Z d   Z e j	 d    Z
 RS(   s   tcp://c         K` s   i  S(   N(    (   Rh   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    c         C` s   t  j |   d  S(   N(   R   R{   (   Rh   RD   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    (   RV   R   R   RZ   R   Rb   R   R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s
   	t   TLSListenerc           B` s5   e  Z d  Z e Z e Z d   Z e j	 d    Z
 RS(   s   tls://c         K` s   t  |  } i | d 6S(   NR   (   R   (   Rh   R   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    c         c` sc   y | j    VWn> t k
 rO } t j d |  j | t | d d   pH |  n Xt j |   d  S(   Ns7   Listener on %r: TLS handshake failed with remote %r: %sRP   (	   t   wait_for_handshakeRB   R5   RC   R   t   getattrR@   R   R{   (   Rh   RD   R   RK   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s    (   RV   R   R   R   R   Rf   R   R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR     s
   	t   BaseTCPBackendc           B` s>   e  Z d    Z d   Z d   Z d   Z d   Z d   Z RS(   c         C` s
   |  j    S(   N(   t   _connector_class(   Rh   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_connector  s    c         K` s   |  j  | | | |  S(   N(   t   _listener_class(   Rh   t   loct   handle_commR_   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_listener  s    c         C` s   t  |  d S(   Ni    (   R   (   Rh   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_address_host  s    c         C` s
   t  |  S(   N(   R   (   Rh   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_address_host_port  s    c         C` s%   t  |  \ } } t t |  |  S(   N(   R   R   R   (   Rh   R   R   R   (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   resolve_address  s    c         C` sR   t  |  \ } } t |  } d | k r9 t |  } n t |  } t | d   S(   Nt   :(   R   R   R   R   R   R@   (   Rh   R   R   R   t
   local_host(    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   get_local_address_for   s    (   RV   R   R   R   R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   
  s   					t
   TCPBackendc           B` s   e  Z e Z e Z RS(    (   RV   R   R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   *  s   t
   TLSBackendc           B` s   e  Z e Z e Z RS(    (   RV   R   R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyR   /  s   t   tcpt   tls(J   t
   __future__R    R   R   R   t   loggingR/   Rt   R2   RQ   R#   R@   R+   R   R   R   t   tornado.iostreamR   R   t   tornado.tcpclientR   t   tornado.tcpserverR   t   compatibilityR	   R
   t   threadpoolexecutorR   t   utilsR   R   R   R   R   R   R   t   registryR   R   t
   addressingR   R   t   coreR   R   R   R   R   R   R   R   R   t	   getLoggerRV   R5   R$   R   RL   RN   RY   RZ   R   R   t   objectR   R   R   R   R   R   R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/distributed/comm/tcp.pyt   <module>   sV   
4
("				;			
$	
V 