recreate sockets since they cannot be reused after closing
paulfantom committed
Jul 15, 2016 at 21:25 UTC
2df1f922987edeea151ab98c04d5e7aa73d25498
1 file changed
+23
-8
python.d/python_modules/base.py
+23
-8
@@ -485,8 +485,8 @@ class SocketService(SimpleService):
485
Get raw data with low-level "socket" module.
486
:return: str
487
"""
488
- #if self._sock is None:
489
- if True:
488
+ # Recreate socket since they cannot be reused
489
+ if self._sock is None:
490
try:
491
if self.unix_socket is None:
492
self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -503,12 +503,15 @@ class SocketService(SimpleService):
503
self._sock.settimeout(0.05)
504
self._sock.connect(self.unix_socket)
505
self._sock.settimeout(0.05) # Just to be sure
506
-
506
except Exception as e:
508
- self.error(str(e), "used configuration: host:", str(self.host), "port:", str(self.port), "socket:", str(self.unix_socket))
507
+ self.error(str(e),
508
+ "Cannot create socket with following configuration: host:", str(self.host),
509
+ "port:", str(self.port),
510
+ "socket:", str(self.unix_socket))
511
self._sock = None
512
return None
513
514
+ # Send request if it is needed
515
if self.request != "".encode():
516
try:
517
self._sock.send(self.request)
@@ -516,34 +519,46 @@ class SocketService(SimpleService):
519
try:
520
self._sock.shutdown(0)
521
self._sock.close()
522
+ self._sock = None
523
except:
524
pass
521
- self._sock = None
522
- self.error(str(e), "used configuration: host:", str(self.host), "port:", str(self.port), "socket:", str(self.unix_socket))
525
+ self.error(str(e),
526
+ "used configuration: host:", str(self.host),
527
+ "port:", str(self.port),
528
+ "socket:", str(self.unix_socket))
529
return None
530
531
+ # Receive first two bytes from socket. This will test if there is anything to receive
532
size = 2
533
try:
534
data = self._sock.recv(size).decode()
535
except Exception as e:
529
- self.error(str(e), "used configuration: host:", str(self.host), "port:", str(self.port), "socket:", str(self.unix_socket))
536
+ self.error(str(e),
537
+ "used configuration: host:", str(self.host),
538
+ "port:", str(self.port),
539
+ "socket:", str(self.unix_socket))
540
self._sock.shutdown(0)
541
self._sock.close()
542
self._sock = None
543
return None
544
545
+ # Receive the rest
546
while True:
547
# implement something like TCP Window Scaling
548
if size < 4096:
549
size *= 2
550
buf = self._sock.recv(size)
551
data += buf.decode()
541
- if len(buf) == 0: break
552
+ if len(buf) == 0: break # precaution
553
if len(buf) < size and not self._more_data_available():
554
break
555
else:
556
size = 4
557
558
+ self._sock.shutdown(0)
559
+ self._sock.close()
560
+ self._sock = None
561
+
562
return data
563
564
def _more_data_available(self):