core: fix deadlock in parallel state processor

This commit is contained in:
Marius van der Wijden 2026-03-19 12:03:28 +01:00
parent 931955cdcc
commit 41feef2a84

View file

@ -212,21 +212,18 @@ func (p *ParallelStateProcessor) resultHandler(block *types.Block, preTxReads ba
for { for {
select { select {
case res := <-txResCh: case res := <-txResCh:
numTxComplete++
if execErr == nil { if execErr == nil {
// short-circuit if invalid block was detected // short-circuit if invalid block was detected
if res.err != nil { if res.err != nil {
execErr = res.err execErr = res.err
continue } else if err := gp.SubGas(res.receipt.CumulativeGasUsed); err != nil {
}
if err := gp.SubGas(res.receipt.CumulativeGasUsed); err != nil {
execErr = err execErr = err
} else { } else {
results = append(results, res) results = append(results, res)
accesses.Merge(res.stateReads) accesses.Merge(res.stateReads)
} }
} }
numTxComplete++
if numTxComplete == len(block.Transactions()) { if numTxComplete == len(block.Transactions()) {
break loop break loop
} }
@ -234,6 +231,8 @@ func (p *ParallelStateProcessor) resultHandler(block *types.Block, preTxReads ba
} }
if execErr != nil { if execErr != nil {
// Drain stateRootCalcResCh so calcAndVerifyRoot goroutine can exit.
<-stateRootCalcResCh
resCh <- &ProcessResultWithMetrics{ProcessResult: &ProcessResult{Error: execErr}} resCh <- &ProcessResultWithMetrics{ProcessResult: &ProcessResult{Error: execErr}}
return return
} }