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))