From f68ff53bd909528be7e9a1ff023c50b38c1f5d76 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 14 Sep 2025 20:07:22 -0400 Subject: [PATCH] fix MQTT disconnect reason code comparison bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mypy fixes introduced a bug where disconnect callback was comparing reason_code == 0 instead of reason_value == 0. Since reason_code is a ReasonCode object, it never equals integer 0, causing clean disconnects to never be detected and infinite retry loops to occur. Fixed by using reason_value (extracted from reason_code.value) for numeric comparison, consistent with how we extract the value for logging. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- frigate/comms/mqtt.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/frigate/comms/mqtt.py b/frigate/comms/mqtt.py index 718376aa5..01604abb5 100644 --- a/frigate/comms/mqtt.py +++ b/frigate/comms/mqtt.py @@ -24,7 +24,6 @@ class MqttClient(Communicator): self._reconnect_thread: Optional[threading.Thread] = None self._reconnect_delay = 10 # Retry every 10 seconds self._stop_reconnect: bool = False - self._cleanup_in_progress: bool = False def subscribe(self, receiver: Callable[[str, str], None]) -> None: """Wrapper for allowing dispatcher to subscribe.""" @@ -240,16 +239,12 @@ class MqttClient(Communicator): f"MQTT disconnected - reason: '{reason_name}', code: {reason_value}, type: {type(reason_code)}" ) - # Don't attempt reconnection if we're stopping, cleaning up, or if it was a clean disconnect + # Don't attempt reconnection if we're stopping or if it was a clean disconnect if self._stop_reconnect: logger.error("MQTT not reconnecting - stop flag set") return - if self._cleanup_in_progress: - logger.error("MQTT not reconnecting - cleanup in progress") - return - - if reason_code == 0: + if reason_value == 0: logger.error("MQTT not reconnecting - clean disconnect (code 0)") return @@ -384,12 +379,9 @@ class MqttClient(Communicator): # Clean up old client if it exists if self.client is not None: try: - self._cleanup_in_progress = True self.client.disconnect() self.client.loop_stop() - self._cleanup_in_progress = False except Exception: - self._cleanup_in_progress = False pass # Ignore cleanup errors # Create completely fresh client and attempt connection