summaryrefslogtreecommitdiffstats
path: root/python.d
diff options
context:
space:
mode:
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>2016-11-09 02:20:00 +0200
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>2016-11-09 02:20:00 +0200
commitb56269a245bab7e1deeea50d449e44d8c3b07a83 (patch)
treefb08a8bf8a779fc205a1943fd735b63413ced6d1 /python.d
parent888363f77690b8b4b0d600c8b67cab609c90b2a4 (diff)
attempt to fix freezes on socket service
Diffstat (limited to 'python.d')
-rw-r--r--python.d/memcached.chart.py4
-rw-r--r--python.d/python_modules/base.py31
2 files changed, 25 insertions, 10 deletions
diff --git a/python.d/memcached.chart.py b/python.d/memcached.chart.py
index 5a1400c992..09ceed2210 100644
--- a/python.d/memcached.chart.py
+++ b/python.d/memcached.chart.py
@@ -131,7 +131,7 @@ class Service(SocketService):
self.error("no data received")
return None
if raw[0].startswith('ERROR'):
- self.error("Memcached returned ERROR")
+ self.error("memcached returned ERROR")
return None
data = {}
for line in raw:
@@ -160,8 +160,10 @@ class Service(SocketService):
def _check_raw_data(self, data):
if data.endswith('END\r\n'):
+ self.debug("received response")
return True
else:
+ self.debug("waiting response")
return False
def check(self):
diff --git a/python.d/python_modules/base.py b/python.d/python_modules/base.py
index 70c586f8e4..cf2f7847e1 100644
--- a/python.d/python_modules/base.py
+++ b/python.d/python_modules/base.py
@@ -519,6 +519,7 @@ class SocketService(SimpleService):
if self.__socket_config is None:
# establish ipv6 or ipv4 connection.
for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM):
+ self.debug("connecting socket to host '" + str(self.host) + "', port " + str(self.port))
try:
# noinspection SpellCheckingInspection
af, socktype, proto, canonname, sa = res
@@ -547,6 +548,7 @@ class SocketService(SimpleService):
else:
# connect to unix socket
try:
+ self.debug("connecting unix socket '" + str(self.unix_socket) + "'")
self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
self._sock.connect(self.unix_socket)
except socket.error:
@@ -559,19 +561,27 @@ class SocketService(SimpleService):
"port:", str(self.port),
"socket:", str(self.unix_socket))
self._sock = None
- self._sock.setblocking(0)
+
+ if self._sock is not None:
+ self._sock.setblocking(0)
+ self._sock.settimeout(5)
+ self.debug("connected with timeout " + str(self._sock.gettimeout()))
+ else:
+ self.debug("not connected")
def _disconnect(self):
"""
Close socket connection
:return:
"""
- try:
- self._sock.shutdown(2) # 0 - read, 1 - write, 2 - all
- self._sock.close()
- except Exception:
- pass
- self._sock = None
+ if self._sock is not None:
+ try:
+ self.debug("disconnecting")
+ self._sock.shutdown(2) # 0 - read, 1 - write, 2 - all
+ self._sock.close()
+ except Exception:
+ pass
+ self._sock = None
def _send(self):
"""
@@ -581,6 +591,7 @@ class SocketService(SimpleService):
# Send request if it is needed
if self.request != "".encode():
try:
+ self.debug("sending request")
self._sock.send(self.request)
except Exception as e:
self._disconnect()
@@ -599,14 +610,16 @@ class SocketService(SimpleService):
data = ""
while True:
try:
+ self.debug("receiving response")
ready_to_read, _, in_error = select.select([self._sock], [], [], 5)
except Exception as e:
- self.debug("SELECT", str(e))
+ self.error("timeout while waiting for response:", str(e))
self._disconnect()
break
if len(ready_to_read) > 0:
buf = self._sock.recv(4096)
- if len(buf) == 0 or buf is None: # handle server disconnect
+ if buf is None or len(buf) == 0: # handle server disconnect
+ self._disconnect()
break
data += buf.decode(errors='ignore')
if self._check_raw_data(data):