From 0122a5e81e0bf5b81fe7a2b2cca52f87c9a2dd2d Mon Sep 17 00:00:00 2001 From: Jonathan Becker Date: Tue, 20 Feb 2024 16:37:42 +0100 Subject: [PATCH] improve ha client keepalive error handling --- asyncua/client/ha/ha_client.py | 51 +++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/asyncua/client/ha/ha_client.py b/asyncua/client/ha/ha_client.py index 52e691adb..e7d04f83d 100644 --- a/asyncua/client/ha/ha_client.py +++ b/asyncua/client/ha/ha_client.py @@ -450,29 +450,36 @@ async def run(self) -> None: f"Starting keepalive loop for {server_info.url}, checking every {self.timer}sec" ) while self.is_running: - try: - status, slevel = await client.read_values([status_node, slevel_node]) - if status != ua.ServerState.Running: - _logger.info("ServerState is not running") - server_info.status = ConnectionStates.NO_DATA - else: - server_info.status = slevel - except BadSessionNotActivated: - _logger.warning("Session is not yet activated.") - server_info.status = ConnectionStates.NO_DATA - except BadSessionClosed: - _logger.warning("Session is closed.") - server_info.status = ConnectionStates.NO_DATA - except asyncio.TimeoutError: - _logger.warning("Timeout when fetching state") - server_info.status = ConnectionStates.NO_DATA - except asyncio.CancelledError: - _logger.warning("CancelledError, this means we should shutdown") - server_info.status = ConnectionStates.NO_DATA - # FIXME: It cannot be correct to catch CancelledError here, we should re-raise - except Exception: - _logger.exception("Unknown exception during keepalive liveness check") + if client.uaclient.protocol is None: server_info.status = ConnectionStates.NO_DATA + _logger.info("No active client") + else: + try: + status, slevel = await client.read_values([status_node, slevel_node]) + if status != ua.ServerState.Running: + _logger.info("ServerState is not running") + server_info.status = ConnectionStates.NO_DATA + else: + server_info.status = slevel + except BadSessionNotActivated: + _logger.warning("Session is not yet activated.") + server_info.status = ConnectionStates.NO_DATA + except BadSessionClosed : + _logger.warning("Session is closed.") + server_info.status = ConnectionStates.NO_DATA + except ConnectionError : + _logger.warning("No connection.") + server_info.status = ConnectionStates.NO_DATA + except asyncio.TimeoutError: + _logger.warning("Timeout when fetching state") + server_info.status = ConnectionStates.NO_DATA + except asyncio.CancelledError: + _logger.warning("CancelledError, this means we should shutdown") + server_info.status = ConnectionStates.NO_DATA + # FIXME: It cannot be correct to catch CancelledError here, we should re-raise + except Exception: + _logger.exception("Unknown exception during keepalive liveness check") + server_info.status = ConnectionStates.NO_DATA _logger.info(f"ServiceLevel for {server_info.url}: {server_info.status}") if await event_wait(self.stop_event, self.timer):