This is an automated email from the ASF dual-hosted git repository. jking pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/thrift.git
The following commit(s) were added to refs/heads/master by this push: new f6511c9 THRIFT-4767: Added TSocket/TSSLSocket support tcp keep-alive in python (#1725) f6511c9 is described below commit f6511c904bcac1dd8c7e24aa3432326738865f1b Author: Jun <junnp...@users.noreply.github.com> AuthorDate: Fri Feb 1 12:07:58 2019 +0800 THRIFT-4767: Added TSocket/TSSLSocket support tcp keep-alive in python (#1725) * THRIFT-4767: Added TSocket support tcp keep-alive in python * TSSLSocket support tcp keep-alive --- lib/py/src/transport/TSSLSocket.py | 5 ++++- lib/py/src/transport/TSocket.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/py/src/transport/TSSLSocket.py b/lib/py/src/transport/TSSLSocket.py index 00d1f10..c87e81c 100644 --- a/lib/py/src/transport/TSSLSocket.py +++ b/lib/py/src/transport/TSSLSocket.py @@ -232,6 +232,7 @@ class TSSLSocket(TSocket.TSocket, TSSLBase): ``validate_callback`` (cert, hostname) -> None: Called after SSL handshake. Can raise when hostname does not match the cert. + ``socket_keepalive`` enable TCP keepalive, default off. """ self.is_valid = False self.peercert = None @@ -259,9 +260,11 @@ class TSSLSocket(TSocket.TSocket, TSSLBase): kwargs['cert_reqs'] = ssl.CERT_REQUIRED if validate else ssl.CERT_NONE unix_socket = kwargs.pop('unix_socket', None) + socket_keepalive = kwargs.pop('socket_keepalive', False) self._validate_callback = kwargs.pop('validate_callback', _match_hostname) TSSLBase.__init__(self, False, host, kwargs) - TSocket.TSocket.__init__(self, host, port, unix_socket) + TSocket.TSocket.__init__(self, host, port, unix_socket, + socket_keepalive=socket_keepalive) def close(self): try: diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py index a7d6617..c8be25a 100644 --- a/lib/py/src/transport/TSocket.py +++ b/lib/py/src/transport/TSocket.py @@ -50,7 +50,9 @@ class TSocketBase(TTransportBase): class TSocket(TSocketBase): """Socket implementation of TTransport base.""" - def __init__(self, host='localhost', port=9090, unix_socket=None, socket_family=socket.AF_UNSPEC): + def __init__(self, host='localhost', port=9090, unix_socket=None, + socket_family=socket.AF_UNSPEC, + socket_keepalive=False): """Initialize a TSocket @param host(str) The host to connect to. @@ -58,6 +60,7 @@ class TSocket(TSocketBase): @param unix_socket(str) The filename of a unix socket to connect to. (host and port will be ignored.) @param socket_family(int) The socket family to use with this socket. + @param socket_keepalive(bool) enable TCP keepalive, default off. """ self.host = host self.port = port @@ -65,6 +68,7 @@ class TSocket(TSocketBase): self._unix_socket = unix_socket self._timeout = None self._socket_family = socket_family + self._socket_keepalive = socket_keepalive def setHandle(self, h): self.handle = h @@ -99,6 +103,11 @@ class TSocket(TSocketBase): raise TTransportException(TTransportException.NOT_OPEN, msg) for family, socktype, _, _, sockaddr in addrs: handle = self._do_open(family, socktype) + + # TCP_KEEPALIVE + if self._socket_keepalive: + handle.setsockopt(socket.IPPROTO_TCP, socket.SO_KEEPALIVE, 1) + handle.settimeout(self._timeout) try: handle.connect(sockaddr)