Skip to content

fix(engine): propagate fatal errors from payload validation in on_downloaded_block#23072

Closed
mediocregopher wants to merge 2 commits intomainfrom
mediocregopher/payload-err-propagate
Closed

fix(engine): propagate fatal errors from payload validation in on_downloaded_block#23072
mediocregopher wants to merge 2 commits intomainfrom
mediocregopher/payload-err-propagate

Conversation

@mediocregopher
Copy link
Member

Motivation

Previously, InsertPayloadError::Payload errors were silently dropped in on_downloaded_block, while InsertPayloadError::Block errors were properly handled. This meant fatal errors (e.g. provider errors) wrapped in NewPayloadError::Other would be ignored, leaving the engine tree task alive but unable to execute blocks — causing the node to stall indefinitely instead of exiting.

This can occur when validate_block_with_state fails during EVM environment construction (evm_env_for), which converts provider errors like InsufficientChangesets into NewPayloadError::other(). Since downloaded blocks are fire-and-forget (no CL request/response loop to retry), the silently dropped error means nothing triggers another download attempt and the node sits idle permanently.

Fix

Now NewPayloadError::Other is propagated as InsertBlockFatalError to trigger a node exit, while NewPayloadError::Eth (validation errors) is logged and treated as non-fatal.

…nloaded_block

Previously, InsertPayloadError::Payload errors were silently dropped
in on_downloaded_block, while InsertPayloadError::Block errors were
properly handled. This meant fatal errors (e.g. provider errors)
wrapped in NewPayloadError::Other would be ignored, leaving the engine
tree task alive but unable to execute blocks — causing the node to
stall indefinitely instead of exiting.

This can occur when validate_block_with_state fails during EVM
environment construction (evm_env_for), which converts provider errors
like InsufficientChangesets into NewPayloadError::other(). Since
downloaded blocks are fire-and-forget (no CL request/response loop to
retry), the silently dropped error means nothing triggers another
download attempt and the node sits idle permanently.

Now NewPayloadError::Other is propagated as InsertBlockFatalError to
trigger a node exit, while NewPayloadError::Eth (validation errors)
is logged and treated as non-fatal.
@mediocregopher mediocregopher self-assigned this Mar 17, 2026
@mediocregopher mediocregopher added C-bug An unexpected or incorrect behavior A-engine Related to the engine implementation labels Mar 17, 2026
@github-project-automation github-project-automation bot moved this to Backlog in Reth Tracker Mar 17, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 17, 2026

✅ Changelog found on PR.

Edit changelog

@mediocregopher mediocregopher marked this pull request as ready for review March 17, 2026 14:09
@mediocregopher mediocregopher requested a review from gakonst as a code owner March 17, 2026 14:09
@github-project-automation github-project-automation bot moved this from Backlog to In Progress in Reth Tracker Mar 17, 2026
@mediocregopher mediocregopher marked this pull request as draft March 17, 2026 14:47
@github-project-automation github-project-automation bot moved this from In Progress to Done in Reth Tracker Mar 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-engine Related to the engine implementation C-bug An unexpected or incorrect behavior

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants