@cryptotaxi247 / netdata-1 / commits / 2df1f9229

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