From 41feef2a84faaea9ce2fda5fbc148c996928e05c Mon Sep 17 00:00:00 2001 From: Marius van der Wijden Date: Thu, 19 Mar 2026 12:03:28 +0100 Subject: [PATCH] core: fix deadlock in parallel state processor --- core/parallel_state_processor.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/parallel_state_processor.go b/core/parallel_state_processor.go index cb82a674c6..866fd9302a 100644 --- a/core/parallel_state_processor.go +++ b/core/parallel_state_processor.go @@ -212,21 +212,18 @@ func (p *ParallelStateProcessor) resultHandler(block *types.Block, preTxReads ba for { select { case res := <-txResCh: + numTxComplete++ if execErr == nil { // short-circuit if invalid block was detected if res.err != nil { execErr = res.err - continue - } - - if err := gp.SubGas(res.receipt.CumulativeGasUsed); err != nil { + } else if err := gp.SubGas(res.receipt.CumulativeGasUsed); err != nil { execErr = err } else { results = append(results, res) accesses.Merge(res.stateReads) } } - numTxComplete++ if numTxComplete == len(block.Transactions()) { break loop } @@ -234,6 +231,8 @@ func (p *ParallelStateProcessor) resultHandler(block *types.Block, preTxReads ba } if execErr != nil { + // Drain stateRootCalcResCh so calcAndVerifyRoot goroutine can exit. + <-stateRootCalcResCh resCh <- &ProcessResultWithMetrics{ProcessResult: &ProcessResult{Error: execErr}} return }