@cryptotaxi247 / netdata-1 / commits / 339d33412

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

Ilya Mashchenko committed Apr 25, 2019 at 11:16 UTC 339d3341292aa6b46114a8ee8dc6eb69ecff80b7
1 file changed +18 -5
collectors/python.d.plugin/python_modules/bases/FrameworkServices/SocketService.py
+18 -5
@@ -16,6 +16,11 @@ else:
16 from bases.FrameworkServices.SimpleService import SimpleService
17
18
19 +DEFAULT_CONNECT_TIMEOUT = 2.0
20 +DEFAULT_READ_TIMEOUT = 2.0
21 +DEFAULT_WRITE_TIMEOUT = 2.0
22 +
23 +
24 class SocketService(SimpleService):
25 def __init__(self, configuration=None, name=None):
26 self._sock = None
@@ -31,6 +36,9 @@ class SocketService(SimpleService):
36 self.__socket_config = None
37 self.__empty_request = "".encode()
38 SimpleService.__init__(self, configuration=configuration, name=name)
39 + self.connect_timeout = configuration.get('connect_timeout', DEFAULT_CONNECT_TIMEOUT)
40 + self.read_timeout = configuration.get('read_timeout', DEFAULT_READ_TIMEOUT)
41 + self.write_timeout = configuration.get('write_timeout', DEFAULT_WRITE_TIMEOUT)
42
43 def _socket_error(self, message=None):
44 if self.unix_socket is not None:
@@ -86,6 +94,8 @@ class SocketService(SimpleService):
94
95 try:
96 self.debug('connecting socket to "{address}", port {port}'.format(address=sa[0], port=sa[1]))
97 + self._sock.settimeout(self.connect_timeout)
98 + self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout()))
99 self._sock.connect(sa)
100 except (socket.error, ssl.SSLError) as error:
101 self.error('Failed to connect to "{address}", port {port}, error: {error}'.format(address=sa[0],
@@ -111,6 +121,8 @@ class SocketService(SimpleService):
121 try:
122 self.debug('attempting DGRAM unix socket "{0}"'.format(self.unix_socket))
123 self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
124 + self._sock.settimeout(self.connect_timeout)
125 + self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout()))
126 self._sock.connect(self.unix_socket)
127 self.debug('connected DGRAM unix socket "{0}"'.format(self.unix_socket))
128 return True
@@ -121,6 +133,8 @@ class SocketService(SimpleService):
133 try:
134 self.debug('attempting STREAM unix socket "{0}"'.format(self.unix_socket))
135 self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
136 + self._sock.settimeout(self.connect_timeout)
137 + self.debug('set socket connect timeout to: {0}'.format(self._sock.gettimeout()))
138 self._sock.connect(self.unix_socket)
139 self.debug('connected STREAM unix socket "{0}"'.format(self.unix_socket))
140 return True
@@ -156,11 +170,6 @@ class SocketService(SimpleService):
170 self._sock = None
171 self.__socket_config = None
172
159 - if self._sock is not None:
160 - self._sock.setblocking(0)
161 - self._sock.settimeout(5)
162 - self.debug('set socket timeout to: {0}'.format(self._sock.gettimeout()))
163 -
173 def _disconnect(self):
174 """
175 Close socket connection
@@ -183,6 +192,8 @@ class SocketService(SimpleService):
192 # Send request if it is needed
193 if self.request != self.__empty_request:
194 try:
195 + self.debug('set socket write timeout to: {0}'.format(self._sock.gettimeout()))
196 + self._sock.settimeout(self.write_timeout)
197 self.debug('sending request: {0}'.format(request or self.request))
198 self._sock.send(request or self.request)
199 except Exception as error:
@@ -203,6 +214,8 @@ class SocketService(SimpleService):
214 while True:
215 self.debug('receiving response')
216 try:
217 + self.debug('set socket read timeout to: {0}'.format(self._sock.gettimeout()))
218 + self._sock.settimeout(self.read_timeout)
219 buf = self._sock.recv(4096)
220 except Exception as error:
221 self._socket_error('failed to receive response: {0}'.format(error))