From c5a0526aeffbf0ee10e505ddbb770aab1f4a6f9c Mon Sep 17 00:00:00 2001
From: Roland Koller <roland.koller@ecmind.ch>
Date: Fri, 24 Jan 2025 08:28:12 +0100
Subject: [PATCH 1/2] - add timeout parameter to connection - break out of
 server loop on successful pool connection - test

---
 ecmind_blue_client/tcp_client.py                   |  4 +++-
 .../tcp_client_classes/job_caller.py               |  3 +++
 ecmind_blue_client/tcp_pool_client.py              |  6 ++++++
 test_tcp_pool.py                                   | 14 ++++++++++++++
 4 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/ecmind_blue_client/tcp_client.py b/ecmind_blue_client/tcp_client.py
index 965fb91..8dd1bc3 100644
--- a/ecmind_blue_client/tcp_client.py
+++ b/ecmind_blue_client/tcp_client.py
@@ -94,6 +94,7 @@ class TcpClient(Client):
         use_ssl: bool = True,
         file_cache_byte_limit: int = 33554432,
         auto_reconnect: bool = True,
+        connect_timeout: int = 10
     ):
         self.session_guid = None
         self.job_caller = None
@@ -105,6 +106,7 @@ class TcpClient(Client):
         self.use_ssl = use_ssl
         self.file_cache_byte_limit = file_cache_byte_limit
         self.auto_reconnect = auto_reconnect
+        self.connect_timeout = connect_timeout
         self._connect()
 
     def _connect(self):
@@ -117,7 +119,7 @@ class TcpClient(Client):
             # remove job_caller reference
             self.job_caller = None
 
-        self.job_caller = JobCaller(self.hostname, self.port, self.use_ssl, self.file_cache_byte_limit)
+        self.job_caller = JobCaller(self.hostname, self.port, self.use_ssl, self.file_cache_byte_limit, self.connect_timeout)
         self.__attach__(self.username, self.password)
 
     def __del__(self):
diff --git a/ecmind_blue_client/tcp_client_classes/job_caller.py b/ecmind_blue_client/tcp_client_classes/job_caller.py
index 8a1eb4b..8d39ab2 100644
--- a/ecmind_blue_client/tcp_client_classes/job_caller.py
+++ b/ecmind_blue_client/tcp_client_classes/job_caller.py
@@ -72,6 +72,7 @@ class JobCaller:
         port,
         use_ssl: Optional[bool] = True,
         file_cache_byte_limit: Optional[int] = 33554432,
+        connect_timeout = 10
     ):
         self.hostname = hostname
         self.port = port
@@ -85,7 +86,9 @@ class JobCaller:
             self.socket = ssl_context.wrap_socket(plain_text_socket)
         else:
             self.socket = plain_text_socket
+        self.socket.settimeout(connect_timeout)
         self.socket.connect((hostname, port))
+        self.socket.settimeout(None)
 
     def close(self):
         self.socket.close()
diff --git a/ecmind_blue_client/tcp_pool_client.py b/ecmind_blue_client/tcp_pool_client.py
index 3b9c6e0..fee4d51 100644
--- a/ecmind_blue_client/tcp_pool_client.py
+++ b/ecmind_blue_client/tcp_pool_client.py
@@ -23,6 +23,7 @@ class TcpPoolClient(Client):
         use_ssl: bool = True,
         file_cache_byte_limit: int = 33554432,
         pool_size: int = 10,
+        connect_timeout: int = 10,
     ):
         super()
         servers = []
@@ -47,6 +48,7 @@ class TcpPoolClient(Client):
         self.password = password
         self.use_ssl = use_ssl
         self.file_cache_byte_limit = file_cache_byte_limit
+        self.connect_timeout = connect_timeout
         self._pool_size = pool_size
         self._pool_available = queue.Queue()
         self._pool_in_use = 0
@@ -115,7 +117,11 @@ class TcpPoolClient(Client):
                     server["port"],
                     self.use_ssl,
                     self.file_cache_byte_limit,
+                    self.connect_timeout,                    
                 )
+                if job_caller:
+                    logging.debug("Connected with %s:", server["hostname"], server["port"])
+                    break
             except (ConnectionRefusedError, TimeoutError) as err:
                 logging.error(err)
 
diff --git a/test_tcp_pool.py b/test_tcp_pool.py
index 8cc82c6..4b015ec 100644
--- a/test_tcp_pool.py
+++ b/test_tcp_pool.py
@@ -728,5 +728,19 @@ class TestTcpPoolClient(unittest.TestCase):
 
         self.assertRaises(BlueException, test_function)
 
+    def test_partially_defect_pool(self):
+        client = TcpPoolClient(
+            self.connection_string + "#" + "localhost:4001:5", 
+            "TestApp", 
+            "root", 
+            "!;`|K!llEF!llE6!;k", 
+            self.use_ssl,
+            connect_timeout=3
+        )
+        test_job = Job(Jobs.KRN_GETSERVERINFO, Flags=0, Info=6)
+        result = client.execute(test_job)
+        self.assertEqual(result.values["Value"], "oxtrodbc.dll")
+
+
 if __name__ == "__main__":
     unittest.main()
-- 
GitLab


From 799ada4c2bcbc062217526ab201bb85c350e07f7 Mon Sep 17 00:00:00 2001
From: Roland Koller <roland.koller@ecmind.ch>
Date: Fri, 24 Jan 2025 08:28:39 +0100
Subject: [PATCH 2/2] Version 0.7.5

---
 setup.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/setup.py b/setup.py
index 8eb4fe3..189801b 100644
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="UTF-8") as fh:
 
 setuptools.setup(
     name="ecmind_blue_client",
-    version="0.7.4",
+    version="0.7.5",
     author="Ulrich Wohlfeil, Roland Koller",
     author_email="info@ecmind.ch",
     description="A client wrapper for blue",
-- 
GitLab