From 10943215e3283ba22df756a524d9bea0a5ed90c0 Mon Sep 17 00:00:00 2001 From: lgz Date: Wed, 24 Apr 2019 15:39:08 +0300 Subject: [PATCH 1/4] set socket operation timeout before connecting --- .../bases/FrameworkServices/SocketService.py | 17 ++++++++++++----- 1 file changed, 12 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 c8b2724da5fd15..1dd4357640a2cd 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,9 @@ from bases.FrameworkServices.SimpleService import SimpleService +DEFAULT_SOCKET_TIMEOUT = 3 + + class SocketService(SimpleService): def __init__(self, configuration=None, name=None): self._sock = None @@ -86,6 +89,9 @@ def _connect2socket(self, res=None): try: self.debug('connecting socket to "{address}", port {port}'.format(address=sa[0], port=sa[1])) + self._sock.setblocking(False) + self._sock.settimeout(DEFAULT_SOCKET_TIMEOUT) + self.debug('set socket 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 +117,9 @@ def _connect2unixsocket(self): try: self.debug('attempting DGRAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) + self._sock.setblocking(False) + self._sock.settimeout(DEFAULT_SOCKET_TIMEOUT) + self.debug('set socket 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 +130,9 @@ def _connect2unixsocket(self): try: self.debug('attempting STREAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self._sock.setblocking(False) + self._sock.settimeout(DEFAULT_SOCKET_TIMEOUT) + self.debug('set socket 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 +168,6 @@ def _connect(self): 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 From 0bedf41554cd838f32e38925f97fda9383f3bc01 Mon Sep 17 00:00:00 2001 From: lgz Date: Wed, 24 Apr 2019 16:05:03 +0300 Subject: [PATCH 2/4] add connect, read, write timeouts --- .../bases/FrameworkServices/SocketService.py | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 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 1dd4357640a2cd..3a62844729f966 100644 --- a/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py +++ b/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py @@ -16,7 +16,9 @@ from bases.FrameworkServices.SimpleService import SimpleService -DEFAULT_SOCKET_TIMEOUT = 3 +DEFAULT_CONNECT_TIMEOUT = 3.0 +DEFAULT_READ_TIMEOUT = 3.0 +DEFAULT_WRITE_TIMEOUT = 3.0 class SocketService(SimpleService): @@ -34,6 +36,9 @@ def __init__(self, configuration=None, name=None): 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: @@ -89,9 +94,9 @@ def _connect2socket(self, res=None): try: self.debug('connecting socket to "{address}", port {port}'.format(address=sa[0], port=sa[1])) - self._sock.setblocking(False) - self._sock.settimeout(DEFAULT_SOCKET_TIMEOUT) - self.debug('set socket timeout to: {0}'.format(self._sock.gettimeout())) + # self._sock.setblocking(False) + 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], @@ -117,9 +122,9 @@ def _connect2unixsocket(self): try: self.debug('attempting DGRAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) - self._sock.setblocking(False) - self._sock.settimeout(DEFAULT_SOCKET_TIMEOUT) - self.debug('set socket timeout to: {0}'.format(self._sock.gettimeout())) + # self._sock.setblocking(False) + 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 @@ -131,8 +136,8 @@ def _connect2unixsocket(self): self.debug('attempting STREAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._sock.setblocking(False) - self._sock.settimeout(DEFAULT_SOCKET_TIMEOUT) - self.debug('set socket timeout to: {0}'.format(self._sock.gettimeout())) + 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 @@ -190,6 +195,8 @@ def _send(self, request=None): # 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: @@ -210,6 +217,8 @@ def _receive(self, raw=False): 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)) From 7229c5ed6da3bd8c3a0e410e46bac1c7b173a318 Mon Sep 17 00:00:00 2001 From: lgz Date: Wed, 24 Apr 2019 16:07:18 +0300 Subject: [PATCH 3/4] remove .setblocking calls --- .../python_modules/bases/FrameworkServices/SocketService.py | 3 --- 1 file changed, 3 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 3a62844729f966..bc4436cc059eb9 100644 --- a/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py +++ b/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py @@ -94,7 +94,6 @@ def _connect2socket(self, res=None): try: self.debug('connecting socket to "{address}", port {port}'.format(address=sa[0], port=sa[1])) - # self._sock.setblocking(False) self._sock.settimeout(self.connect_timeout) self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout())) self._sock.connect(sa) @@ -122,7 +121,6 @@ def _connect2unixsocket(self): try: self.debug('attempting DGRAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) - # self._sock.setblocking(False) self._sock.settimeout(self.connect_timeout) self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout())) self._sock.connect(self.unix_socket) @@ -135,7 +133,6 @@ def _connect2unixsocket(self): try: self.debug('attempting STREAM unix socket "{0}"'.format(self.unix_socket)) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self._sock.setblocking(False) self._sock.settimeout(self.connect_timeout) self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout())) self._sock.connect(self.unix_socket) From caf340b50036fc2bbe06f45dc5348b8a4fe3c0dc Mon Sep 17 00:00:00 2001 From: lgz Date: Wed, 24 Apr 2019 16:23:33 +0300 Subject: [PATCH 4/4] set default timeouts to 2 --- .../python_modules/bases/FrameworkServices/SocketService.py | 6 +++--- 1 file changed, 3 insertions(+), 3 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 bc4436cc059eb9..27519b76af040d 100644 --- a/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py +++ b/collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py @@ -16,9 +16,9 @@ from bases.FrameworkServices.SimpleService import SimpleService -DEFAULT_CONNECT_TIMEOUT = 3.0 -DEFAULT_READ_TIMEOUT = 3.0 -DEFAULT_WRITE_TIMEOUT = 3.0 +DEFAULT_CONNECT_TIMEOUT = 2.0 +DEFAULT_READ_TIMEOUT = 2.0 +DEFAULT_WRITE_TIMEOUT = 2.0 class SocketService(SimpleService):