diff options
author | Ilya Mashchenko <ilyamaschenko@gmail.com> | 2019-04-25 11:16:47 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-25 11:16:47 +0300 |
commit | 339d3341292aa6b46114a8ee8dc6eb69ecff80b7 (patch) | |
tree | cfd314a07ea5fc7deba5aa3c4aeb3dcadf85b3e5 /collectors/python.d.plugin/python_modules | |
parent | 3e53f7d32fe4d35bd9b9f453ebe17dae152cb74d (diff) |
SocketService: set socket operation timeout before connecting (#5911)
* set socket operation timeout before connecting
* add connect, read, write timeouts
* remove .setblocking calls
* set default timeouts to 2
Diffstat (limited to 'collectors/python.d.plugin/python_modules')
-rw-r--r-- | collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py b/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py index c8b2724da5..27519b76af 100644 --- a/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py +++ b/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py @@ -16,6 +16,11 @@ else: from bases.FrameworkServices.SimpleService import SimpleService +DEFAULT_CONNECT_TIMEOUT = 2.0 +DEFAULT_READ_TIMEOUT = 2.0 +DEFAULT_WRITE_TIMEOUT = 2.0 + + class SocketService(SimpleService): def __init__(self, configuration=None, name=None): self._sock = None @@ -31,6 +36,9 @@ class SocketService(SimpleService): self.__socket_config = None self.__empty_request = "".encode() SimpleService.__init__(self, configuration=configuration, name=name) + self.connect_timeout = configuration.get('connect_timeout', DEFAULT_CONNECT_TIMEOUT) + self.read_timeout = configuration.get('read_timeout', DEFAULT_READ_TIMEOUT) + self.write_timeout = configuration.get('write_timeout', DEFAULT_WRITE_TIMEOUT) def _socket_error(self, message=None): if self.unix_socket is not None: @@ -86,6 +94,8 @@ class SocketService(SimpleService): try: self.debug('connecting socket to "{address}", port {port}'.format(address=sa[0], port=sa[1])) + self._sock.settimeout(self.connect_timeout) + self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout())) self._sock.connect(sa) except (socket.error, ssl.SSLError) as error: self.error('Failed to connect to "{address}", port {port}, error: {error}'.format(address=sa[0], @@ -111,6 +121,8 @@ class SocketService(SimpleService): try: self.debug('attempting DGRAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) + self._sock.settimeout(self.connect_timeout) + self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout())) self._sock.connect(self.unix_socket) self.debug('connected DGRAM unix socket "{0}"'.format(self.unix_socket)) return True @@ -121,6 +133,8 @@ class SocketService(SimpleService): try: self.debug('attempting STREAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self._sock.settimeout(self.connect_timeout) + self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout())) self._sock.connect(self.unix_socket) self.debug('connected STREAM unix socket "{0}"'.format(self.unix_socket)) return True @@ -156,11 +170,6 @@ class SocketService(SimpleService): self._sock = None self.__socket_config = None - if self._sock is not None: - self._sock.setblocking(0) - self._sock.settimeout(5) - self.debug('set socket timeout to: {0}'.format(self._sock.gettimeout())) - def _disconnect(self): """ Close socket connection @@ -183,6 +192,8 @@ class SocketService(SimpleService): # Send request if it is needed if self.request != self.__empty_request: try: + self.debug('set socket write timeout to: {0}'.format(self._sock.gettimeout())) + self._sock.settimeout(self.write_timeout) self.debug('sending request: {0}'.format(request or self.request)) self._sock.send(request or self.request) except Exception as error: @@ -203,6 +214,8 @@ class SocketService(SimpleService): while True: self.debug('receiving response') try: + self.debug('set socket read timeout to: {0}'.format(self._sock.gettimeout())) + self._sock.settimeout(self.read_timeout) buf = self._sock.recv(4096) except Exception as error: self._socket_error('failed to receive response: {0}'.format(error)) |