From fe64d3754058aacdce80f8339d99f851a9e5987d Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Fri, 9 Jan 2026 23:14:14 +0000 Subject: fix: eliminate disconnect race condition by adding Disconnecting state Previously, disconnect_relay() would immediately remove RelayState and pending batches before the event loop finished draining messages. This caused confusing 'unknown relay' debug messages for EOSE and other events that arrived after state removal but were expected during normal shutdown. Changes: - Add ConnectionStatus::Disconnecting to track intentional disconnects - disconnect_relay() now marks relay as Disconnecting (keeps state) - Event loop drains messages while state exists - handle_disconnect() detects intentional vs unexpected disconnects: - Intentional: Completes cleanup by removing state/connections - Unexpected: Updates to Disconnected, keeps connection for retry - handle_eose() suppresses logs for Disconnecting relays (TRACE level) - check_disconnects() skips relays already in Disconnecting state This ensures proper sequencing: mark->drain->cleanup instead of remove->drain->confusion. Fixes the root cause instead of just hiding log messages. --- src/sync/metrics.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src/sync/metrics.rs') diff --git a/src/sync/metrics.rs b/src/sync/metrics.rs index aacfa2c..13211b9 100644 --- a/src/sync/metrics.rs +++ b/src/sync/metrics.rs @@ -311,6 +311,7 @@ impl SyncMetrics { ConnectionStatus::Syncing => 2, ConnectionStatus::Connected => 3, ConnectionStatus::ConnectedHistoricSyncFailures => 4, + ConnectionStatus::Disconnecting => 5, }; self.relay_connected .with_label_values(&[relay]) -- cgit v1.2.3