From 07c8ebb0b73bec1a5aafef305fc58859afb21b61 Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Thu, 26 Mar 2026 20:09:31 +1000 Subject: [PATCH 1/4] fix: prevent pipeline errors from killing the Reactor subscription The pipeline used doOnNext to chain handlers, but onErrorContinue does not work reliably with doOnNext (a known Reactor limitation). When a StackOverflowError escaped a handler, it could intermittently terminate the Reactor subscription, causing the node to stop processing all subsequent incoming packets. Wrap each handler invocation in a try-catch within the pipeline so errors are contained at the handler level and never propagate to Reactor. Also add catch(Throwable) to HandshakeMessagePacketHandler for defense-in-depth, matching the existing pattern in MessagePacketHandler. --- .../beacon/discovery/pipeline/PipelineImpl.java | 10 +++++++++- .../handler/HandshakeMessagePacketHandler.java | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java index c22005ff9..70ccc2bab 100644 --- a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java +++ b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java @@ -29,7 +29,15 @@ public class PipelineImpl implements Pipeline { public synchronized Pipeline build() { started.set(true); for (EnvelopeHandler handler : envelopeHandlers) { - pipeline = pipeline.doOnNext(handler::handle); + pipeline = + pipeline.doOnNext( + envelope -> { + try { + handler.handle(envelope); + } catch (Throwable t) { + LOG.debug("Error in pipeline handler {}: {}", handler.getClass().getSimpleName(), t.getMessage()); + } + }); } Flux.from(pipeline) .onErrorContinue( diff --git a/src/main/java/org/ethereum/beacon/discovery/pipeline/handler/HandshakeMessagePacketHandler.java b/src/main/java/org/ethereum/beacon/discovery/pipeline/handler/HandshakeMessagePacketHandler.java index b25f127b4..328cf23f2 100644 --- a/src/main/java/org/ethereum/beacon/discovery/pipeline/handler/HandshakeMessagePacketHandler.java +++ b/src/main/java/org/ethereum/beacon/discovery/pipeline/handler/HandshakeMessagePacketHandler.java @@ -151,6 +151,13 @@ public void handle(Envelope envelope) { packet, session.getNodeRecord(), session.getState()), ex); markHandshakeAsFailed(envelope, session); + } catch (Throwable t) { + LOG.warn( + "Unexpected error while processing handshake [{}] from node {}", + packet, + session.getNodeRecord(), + t); + markHandshakeAsFailed(envelope, session); } } From ea85d507b163bdae66f1c030e97e8146a3e6982d Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Thu, 26 Mar 2026 20:24:10 +1000 Subject: [PATCH 2/4] chore: spotless apply --- .../org/ethereum/beacon/discovery/pipeline/PipelineImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java index 70ccc2bab..522400e1f 100644 --- a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java +++ b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java @@ -35,7 +35,10 @@ public synchronized Pipeline build() { try { handler.handle(envelope); } catch (Throwable t) { - LOG.debug("Error in pipeline handler {}: {}", handler.getClass().getSimpleName(), t.getMessage()); + LOG.debug( + "Error in pipeline handler {}: {}", + handler.getClass().getSimpleName(), + t.getMessage()); } }); } From d9b39efb70e9e2b96ce6a3fd775960df4b4f95e9 Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Wed, 1 Apr 2026 09:58:24 +1000 Subject: [PATCH 3/4] review: Change logging message --- .../org/ethereum/beacon/discovery/pipeline/PipelineImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java index 522400e1f..bc5da7357 100644 --- a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java +++ b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java @@ -36,9 +36,9 @@ public synchronized Pipeline build() { handler.handle(envelope); } catch (Throwable t) { LOG.debug( - "Error in pipeline handler {}: {}", + "Unexpected error in pipeline handler {}", handler.getClass().getSimpleName(), - t.getMessage()); + t); } }); } From bc34525658afdf01ccb5e054ef413a9ec2f677e9 Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Wed, 1 Apr 2026 10:08:46 +1000 Subject: [PATCH 4/4] review: Change logging level to WARN --- .../org/ethereum/beacon/discovery/pipeline/PipelineImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java index bc5da7357..3c9aff23b 100644 --- a/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java +++ b/src/main/java/org/ethereum/beacon/discovery/pipeline/PipelineImpl.java @@ -35,7 +35,7 @@ public synchronized Pipeline build() { try { handler.handle(envelope); } catch (Throwable t) { - LOG.debug( + LOG.warn( "Unexpected error in pipeline handler {}", handler.getClass().getSimpleName(), t);