From b8333b64088916dbef6c965566b0c3e38741e634 Mon Sep 17 00:00:00 2001 From: Artur Borecki Date: Tue, 23 Sep 2025 13:50:48 +0200 Subject: [PATCH] refactor(connector.py): avoid recursion in `connect()` --- src/judas_client/connector.py | 50 ++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/judas_client/connector.py b/src/judas_client/connector.py index 2488e37..c86e8cd 100644 --- a/src/judas_client/connector.py +++ b/src/judas_client/connector.py @@ -68,29 +68,35 @@ class Connector: return False - def connect(self, retry_interval: int = 1) -> None: - self.logger.debug( - f"Connecting to {self.host}:{self.port} with timeout {self.connect_timeout}s..." - ) - try: - self.socket.settimeout(self.connect_timeout) - self.socket.connect((self.host, self.port)) - self.socket.settimeout(self.socket_timeout) - self.logger.info(f"[+] Connected to {self.host}:{self.port}") - self.send_hello() - except ( - socket.timeout, - ConnectionRefusedError, - ConnectionAbortedError, - ) as e: - self.logger.error( - f"[!] Connection to {self.host}:{self.port} failed: {e}" + def connect(self) -> None: + retry_interval: int = 1 + connected: bool = False + while not connected: + self.logger.debug( + f"[.] Connecting to {self.host}:{self.port} with timeout {self.connect_timeout}s..." ) - self.logger.info( - f"[.] Retrying connection in {retry_interval} s..." - ) - time.sleep(retry_interval) - self.connect(retry_interval=min(30, retry_interval * 2)) + try: + self.socket.settimeout(self.connect_timeout) + self.socket.connect((self.host, self.port)) + self.socket.settimeout(self.socket_timeout) + self.logger.info(f"[+] Connected to {self.host}:{self.port}") + self.send_hello() + connected = True + except ( + socket.timeout, + ConnectionRefusedError, + ConnectionAbortedError, + ) as e: + self.logger.error( + f"[!] Connection to {self.host}:{self.port} failed: {e}" + ) + self.logger.info( + f"[.] Retrying connection in {retry_interval} s..." + ) + time.sleep(retry_interval) + retry_interval = min( + retry_interval * 2, 30 + ) # exponential backoff def send(self, data: bytes, no_check_ack: bool = False) -> None: self.logger.debug(f"[>] Sending data: {data}")