]> arthur.barton.de Git - netdata.git/commitdiff
non-blocking `SocketService` draft 2
authorpaulfantom <paulfantom@gmail.com>
Mon, 18 Jul 2016 23:56:24 +0000 (01:56 +0200)
committerpaulfantom <paulfantom@gmail.com>
Mon, 18 Jul 2016 23:56:24 +0000 (01:56 +0200)
python.d/python_modules/base.py
python.d/redis.chart.py
python.d/squid.chart.py

index a074228b2fde3be78dc681cbca758ce5be312d4d..fde12dfea18bb70099ab357a15bf747453532aa6 100644 (file)
@@ -475,7 +475,7 @@ class UrlService(SimpleService):
 class SocketService(SimpleService):
     def __init__(self, configuration=None, name=None):
         self._sock = None
-        self._keep_alive = True
+        self._keep_alive = False
         self.host = "localhost"
         self.port = None
         self.unix_socket = None
@@ -485,7 +485,7 @@ class SocketService(SimpleService):
 
     def _connect(self):
         """
-        Recreate socket and connect to it since they cannot be reused
+        Recreate socket and connect to it since sockets cannot be reused after closing
         Available configurations are IPv6, IPv4 or UNIX socket
         :return:
         """
@@ -565,7 +565,7 @@ class SocketService(SimpleService):
         data = ""
         while True:
             try:
-                ready_to_read, _, in_error = select.select([self._sock], [], [], 0.01)
+                ready_to_read, _, in_error = select.select([self._sock], [], [], 60)
             except Exception as e:
                 self.debug("SELECT", str(e))
                 self._disconnect()
@@ -575,8 +575,10 @@ class SocketService(SimpleService):
                 if len(buf) == 0 or buf is None:
                     break
                 data += buf.decode()
+                if self._check_raw_data(data):
+                    break
             else:
-                self._disconnect()
+                self._disconnect()
                 break
 
         return data
@@ -593,16 +595,7 @@ class SocketService(SimpleService):
         if not self._send():
             return None
 
-        finished = False
-        data = ""
-        prevent_infinite_loop = 1000000
-        while not finished:
-            data += self._receive()
-            finished = self._check_raw_data(data)
-            prevent_infinite_loop -= 1
-            if prevent_infinite_loop <= 0:
-                self.debug("Almost got into infinite loop while grabbing data. Is _check_raw_data() ok?")
-                break
+        data = self._receive()
 
         if not self._keep_alive:
             self._disconnect()
index f4655ac23c9850c221bb7dd43b15e77e37374e54..f54762df2b0f6849e3b1df44806d87c1b6dc5317 100644 (file)
@@ -66,6 +66,7 @@ class Service(SocketService):
         self.unix_socket = None
         self.order = ORDER
         self.definitions = CHARTS
+        self._keep_alive = True
 
     def _get_data(self):
         """
index 8ad9a794693bf7700e3e4b5f2a462d0290ea81b9..6b9edaf5f88ab2149030b11224e223f78233a3fe 100644 (file)
@@ -46,7 +46,7 @@ CHARTS = {
 class Service(SocketService):
     def __init__(self, configuration=None, name=None):
         SocketService.__init__(self, configuration=configuration, name=name)
-        self._keep_alive = False
+        self._keep_alive = True
         self.request = ""
         self.host = "localhost"
         self.port = 3128
@@ -60,7 +60,11 @@ class Service(SocketService):
         """
         data = {}
         try:
-            raw = self._get_raw_data().split('\r\n')[-1]
+            raw = ""
+            for tmp in self._get_raw_data().split('\r\n'):
+                if tmp.startswith("sample_time"):
+                    raw = tmp
+                    break
             if raw.startswith('<'):
                 self.error("invalid data received")
                 return None
@@ -72,7 +76,6 @@ class Service(SocketService):
             self.error("invalid data received")
             return None
 
-        self.debug("DATA:", str(len(raw)))
         if len(data) == 0:
             self.error("no data received")
             return None
@@ -80,21 +83,31 @@ class Service(SocketService):
             return data
 
     def _check_raw_data(self, data):
-        if "Content-Length" not in data[:1024]:  # assuming headers should be in first 1024 bytes (performance)
-            return True  # "Content-Length" not found, assume everything is ok
-
-        # TODO write some parser of "Content-Length"
-        return True
-        length = len(data)
-
+        if "Connection: keep-alive" in data[:1024]:
+            self._keep_alive = True
+        else:
+            self._keep_alive = False
 
-        supposed = 0
-        if length >= supposed:
+        if "client" in data and "server.all" in data:
             return True
         else:
             return False
-
-        return False
+    #     # TODO write some parser of "Transfer-Encoding: chunked"
+    #     if "Transfer-Encoding: chunked" in data[:1024]:
+    #         data = data[self.__last:]
+    #
+    #
+    #     print(data)
+    #     import time
+    #     time.sleep(10)
+    #     return False
+    #     supposed = 0
+    #     if length >= supposed:
+    #         return True
+    #     else:
+    #         return False
+    #
+    #     return False
 
     def check(self):
         """
@@ -106,8 +119,8 @@ class Service(SocketService):
         req = self.request.decode()
         if not req.startswith("GET"):
             req = "GET " + req
-        if not req.endswith(" HTTP/1.0\r\n\r\n"):
-            req += " HTTP/1.0\r\n\r\n"
+        if not req.endswith(" HTTP/1.1\r\n\r\n"):
+            req += " HTTP/1.1\r\n\r\n"
         self.request = req.encode()
         if self._get_data() is not None:
             return True