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