Count connections in _open() and _close().
authorBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 21 May 2025 11:29:24 +0000 (13:29 +0200)
committerBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 21 May 2025 11:29:24 +0000 (13:29 +0200)
Only open on first and close on last.

controlpi_plugins/graph.py

index 4b650359b7289ca4b865deb2f2989c62cd730bc4..025dbd101a667819276c127769fd3de7ac1d67a2 100644 (file)
@@ -34,6 +34,7 @@ class Graph(BasePlugin):
                                     f"'{self.conf['crt']}'.")
         self._ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
         self._ssl_ctx.load_cert_chain(self.conf['crt'])
+        self._open_connections = 0
         self._messages: List[Message] = []
         self.bus.register(self.name, 'Graph',
                           [],
@@ -79,20 +80,21 @@ class Graph(BasePlugin):
         self._messages.append(message)
 
     async def _open(self) -> None:
-        self._reader = None
-        self._writer = None
-        (reader, writer) = await asyncio.open_connection(self._host,
-                                                         self._port,
-                                                         ssl=self._ssl_ctx)
-        self._reader = reader
-        self._writer = writer
-        if self._writer and self._reader:
-            # Read banner:
-            banner_size_bytes = await self._reader.readexactly(4)
-            banner_size_int = struct.unpack('<i', banner_size_bytes)[0]
-            banner_message = await self._reader.readexactly(banner_size_int)
-            # Inititalise call id:
-            self._call_id = 0
+        self._open_connections += 1
+        if self._open_connections == 1:
+            # First connection:
+            (reader, writer) = await asyncio.open_connection(self._host,
+                                                             self._port,
+                                                             ssl=self._ssl_ctx)
+            self._reader = reader
+            self._writer = writer
+            if self._writer and self._reader:
+                # Read banner:
+                size_bytes = await self._reader.readexactly(4)
+                size_int = struct.unpack('<i', banner_size_bytes)[0]
+                message = await self._reader.readexactly(size_int)
+                # Inititalise call id:
+                self._call_id = 0
 
     async def _call(self, method: str, params: List[Any]) -> Any:
         if self._writer and self._reader:
@@ -123,11 +125,14 @@ class Graph(BasePlugin):
             return None
 
     async def _close(self) -> None:
-        if self._writer:
-            # Close connection:
-            self._writer.close()
-        self._reader = None
-        self._writer = None
+        if self._open_connections > 0:
+            self.open_connections -= 1
+            if self._open_connections == 0:
+                if self._writer:
+                    # Close connection:
+                    self._writer.close()
+                self._reader = None
+                self._writer = None
 
     async def run(self) -> None:
         """Get coroot instance for name and send connection opened event."""