From 33bf6fdace7459d59cf00377bb0f5a0321f4ac59 Mon Sep 17 00:00:00 2001 From: Petri Kero Date: Mon, 22 Dec 2025 09:53:10 +0200 Subject: [PATCH 1/3] Minimal fix to handle SocketError.ConnectionAborted in TcpListener. --- src/core/Akka/IO/TcpListener.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/Akka/IO/TcpListener.cs b/src/core/Akka/IO/TcpListener.cs index 01dd20f3486..ce75ae6a598 100644 --- a/src/core/Akka/IO/TcpListener.cs +++ b/src/core/Akka/IO/TcpListener.cs @@ -142,7 +142,7 @@ private bool HandleStatsMessages(object msg) { subscriber.Tell(stats); } - } + } return true; case Tcp.SubscribeToTcpListenerStats subscribe: @@ -277,6 +277,7 @@ private void HandleAccept(SocketAsyncEventArgs saea) break; case SocketError.ConnectionReset: + case SocketError.ConnectionAborted: case SocketError.NoBufferSpaceAvailable: case SocketError.TryAgain: case SocketError.TimedOut: From 0b603c45add0ae411b55229c863aa9413ad94ae5 Mon Sep 17 00:00:00 2001 From: Petri Kero Date: Mon, 22 Dec 2025 10:04:03 +0200 Subject: [PATCH 2/3] Handle more transient error cases. Handle known fatal errors explicitly. --- src/core/Akka/IO/TcpListener.cs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/core/Akka/IO/TcpListener.cs b/src/core/Akka/IO/TcpListener.cs index ce75ae6a598..4f0d757c4d0 100644 --- a/src/core/Akka/IO/TcpListener.cs +++ b/src/core/Akka/IO/TcpListener.cs @@ -282,6 +282,12 @@ private void HandleAccept(SocketAsyncEventArgs saea) case SocketError.TryAgain: case SocketError.TimedOut: case SocketError.WouldBlock: + case SocketError.Interrupted: + case SocketError.TooManyOpenSockets: + case SocketError.NetworkUnreachable: + case SocketError.HostDown: + case SocketError.HostUnreachable: + case SocketError.ConnectionRefused: _retryCount++; _log.Warning("Retriable socket error in TcpListener: {0} - retrying accept operation in 10ms", saea.SocketError); @@ -290,9 +296,24 @@ private void HandleAccept(SocketAsyncEventArgs saea) Context.System.Scheduler.ScheduleTellOnce(TimeSpan.FromMilliseconds(10), Self, new RetryAccept(saea), ActorRefs.NoSender); break; + + // Fatal errors - the listener socket itself is broken + case SocketError.OperationAborted: + case SocketError.NotSocket: + case SocketError.Shutdown: + case SocketError.NetworkDown: + case SocketError.AccessDenied: + case SocketError.AddressNotAvailable: + case SocketError.InvalidArgument: + _failedCount++; + _log.Error("Fatal socket error in TcpListener: {0} - stopping listener", saea.SocketError); + Context.Stop(Self); + break; + default: + // Unknown error - treat it as a fatal error and stop listener _failedCount++; - _log.Error("Fatal socket error in TcpListener: {0}", saea.SocketError); + _log.Error("Unexpected socket error in TcpListener: {0} - stopping listener", saea.SocketError); Context.Stop(Self); break; } From d7ab35a59c2728168466ea074d085627077e9975 Mon Sep 17 00:00:00 2001 From: Petri Kero Date: Tue, 23 Dec 2025 09:00:34 +0200 Subject: [PATCH 3/3] Join code paths for known and unknown fatal errors. --- src/core/Akka/IO/TcpListener.cs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/core/Akka/IO/TcpListener.cs b/src/core/Akka/IO/TcpListener.cs index 4f0d757c4d0..12d035f9be1 100644 --- a/src/core/Akka/IO/TcpListener.cs +++ b/src/core/Akka/IO/TcpListener.cs @@ -298,22 +298,9 @@ private void HandleAccept(SocketAsyncEventArgs saea) break; // Fatal errors - the listener socket itself is broken - case SocketError.OperationAborted: - case SocketError.NotSocket: - case SocketError.Shutdown: - case SocketError.NetworkDown: - case SocketError.AccessDenied: - case SocketError.AddressNotAvailable: - case SocketError.InvalidArgument: - _failedCount++; - _log.Error("Fatal socket error in TcpListener: {0} - stopping listener", saea.SocketError); - Context.Stop(Self); - break; - default: - // Unknown error - treat it as a fatal error and stop listener _failedCount++; - _log.Error("Unexpected socket error in TcpListener: {0} - stopping listener", saea.SocketError); + _log.Error("Fatal socket error in TcpListener: {0} - stopping listener", saea.SocketError); Context.Stop(Self); break; }