@@ -39,7 +39,6 @@ import (
39
39
"github.com/ethereum/go-ethereum/common/mclock"
40
40
"github.com/ethereum/go-ethereum/common/prque"
41
41
"github.com/ethereum/go-ethereum/consensus"
42
- "github.com/ethereum/go-ethereum/core/blockstm"
43
42
"github.com/ethereum/go-ethereum/core/rawdb"
44
43
"github.com/ethereum/go-ethereum/core/state"
45
44
"github.com/ethereum/go-ethereum/core/state/snapshot"
@@ -86,12 +85,15 @@ var (
86
85
blockImportTimer = metrics .NewRegisteredMeter ("chain/imports" , nil )
87
86
triedbCommitTimer = metrics .NewRegisteredTimer ("chain/triedb/commits" , nil )
88
87
89
- blockInsertTimer = metrics .NewRegisteredTimer ("chain/inserts" , nil )
90
- blockValidationTimer = metrics .NewRegisteredTimer ("chain/validation" , nil )
91
- blockExecutionTimer = metrics .NewRegisteredTimer ("chain/execution" , nil )
92
- blockWriteTimer = metrics .NewRegisteredTimer ("chain/write" , nil )
93
- blockExecutionParallelCounter = metrics .NewRegisteredCounter ("chain/execution/parallel" , nil )
94
- blockExecutionSerialCounter = metrics .NewRegisteredCounter ("chain/execution/serial" , nil )
88
+ blockInsertTimer = metrics .NewRegisteredTimer ("chain/inserts" , nil )
89
+ blockValidationTimer = metrics .NewRegisteredTimer ("chain/validation" , nil )
90
+ blockExecutionTimer = metrics .NewRegisteredTimer ("chain/execution" , nil )
91
+ blockWriteTimer = metrics .NewRegisteredTimer ("chain/write" , nil )
92
+ blockExecutionParallelCounter = metrics .NewRegisteredCounter ("chain/execution/parallel" , nil )
93
+ blockExecutionSerialCounter = metrics .NewRegisteredCounter ("chain/execution/serial" , nil )
94
+ blockExecutionParallelErrorCounter = metrics .NewRegisteredCounter ("chain/execution/parallel/error" , nil )
95
+ blockExecutionParallelTimer = metrics .NewRegisteredTimer ("chain/execution/parallel/timer" , nil )
96
+ blockExecutionSerialTimer = metrics .NewRegisteredTimer ("chain/execution/serial/timer" , nil )
95
97
96
98
blockReorgMeter = metrics .NewRegisteredMeter ("chain/reorg/executes" , nil )
97
99
blockReorgAddMeter = metrics .NewRegisteredMeter ("chain/reorg/add" , nil )
@@ -569,7 +571,7 @@ func NewParallelBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis
569
571
return bc , nil
570
572
}
571
573
572
- func (bc * BlockChain ) ProcessBlock (block * types.Block , parent * types.Header ) (_ types.Receipts , _ []* types.Log , _ uint64 , _ * state.StateDB , blockEndErr error ) {
574
+ func (bc * BlockChain ) ProcessBlock (block * types.Block , parent * types.Header ) (_ types.Receipts , _ []* types.Log , _ uint64 , _ * state.StateDB , vtime time. Duration , blockEndErr error ) {
573
575
// Process the block using processor and parallelProcessor at the same time, take the one which finishes first, cancel the other, and return the result
574
576
ctx , cancel := context .WithCancel (context .Background ())
575
577
defer cancel ()
@@ -597,6 +599,7 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
597
599
err error
598
600
statedb * state.StateDB
599
601
counter metrics.Counter
602
+ parallel bool
600
603
}
601
604
602
605
resultChan := make (chan Result , 2 )
@@ -606,44 +609,58 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
606
609
if bc .parallelProcessor != nil {
607
610
parallelStatedb , err := state .New (parent .Root , bc .stateCache , bc .snaps )
608
611
if err != nil {
609
- return nil , nil , 0 , nil , err
612
+ return nil , nil , 0 , nil , 0 , err
610
613
}
611
614
parallelStatedb .SetLogger (bc .logger )
612
615
613
616
processorCount ++
614
617
615
618
go func () {
616
619
parallelStatedb .StartPrefetcher ("chain" , nil )
620
+ pstart := time .Now ()
617
621
receipts , logs , usedGas , err := bc .parallelProcessor .Process (block , parallelStatedb , bc .vmConfig , ctx )
618
- resultChan <- Result {receipts , logs , usedGas , err , parallelStatedb , blockExecutionParallelCounter }
622
+ blockExecutionParallelTimer .UpdateSince (pstart )
623
+ if err == nil {
624
+ vstart := time .Now ()
625
+ err = bc .validator .ValidateState (block , parallelStatedb , receipts , usedGas , false )
626
+ vtime = time .Since (vstart )
627
+ }
628
+ resultChan <- Result {receipts , logs , usedGas , err , parallelStatedb , blockExecutionParallelCounter , true }
619
629
}()
620
630
}
621
631
622
632
if bc .processor != nil {
623
633
statedb , err := state .New (parent .Root , bc .stateCache , bc .snaps )
624
634
if err != nil {
625
- return nil , nil , 0 , nil , err
635
+ return nil , nil , 0 , nil , 0 , err
626
636
}
627
637
statedb .SetLogger (bc .logger )
628
638
629
639
processorCount ++
630
640
631
641
go func () {
632
642
statedb .StartPrefetcher ("chain" , nil )
643
+ pstart := time .Now ()
633
644
receipts , logs , usedGas , err := bc .processor .Process (block , statedb , bc .vmConfig , ctx )
634
- resultChan <- Result {receipts , logs , usedGas , err , statedb , blockExecutionSerialCounter }
645
+ blockExecutionSerialTimer .UpdateSince (pstart )
646
+ if err == nil {
647
+ vstart := time .Now ()
648
+ err = bc .validator .ValidateState (block , statedb , receipts , usedGas , false )
649
+ vtime = time .Since (vstart )
650
+ }
651
+ resultChan <- Result {receipts , logs , usedGas , err , statedb , blockExecutionSerialCounter , false }
635
652
}()
636
653
}
637
654
638
655
result := <- resultChan
639
656
640
- if _ , ok := result .err .(blockstm. ParallelExecFailedError ); ok {
657
+ if result . parallel && result .err != nil {
641
658
log .Warn ("Parallel state processor failed" , "err" , result .err )
642
-
659
+ blockExecutionParallelErrorCounter . Inc ( 1 )
643
660
// If the parallel processor failed, we will fallback to the serial processor if enabled
644
661
if processorCount == 2 {
645
- result .statedb .StopPrefetcher ()
646
662
result = <- resultChan
663
+ result .statedb .StopPrefetcher ()
647
664
processorCount --
648
665
}
649
666
}
@@ -658,7 +675,7 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
658
675
}()
659
676
}
660
677
661
- return result .receipts , result .logs , result .usedGas , result .statedb , result .err
678
+ return result .receipts , result .logs , result .usedGas , result .statedb , vtime , result .err
662
679
}
663
680
664
681
// empty returns an indicator whether the blockchain is empty.
@@ -2323,7 +2340,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error)
2323
2340
2324
2341
// Process block using the parent state as reference point
2325
2342
pstart := time .Now ()
2326
- receipts , logs , usedGas , statedb , err := bc .ProcessBlock (block , parent )
2343
+ receipts , logs , usedGas , statedb , vtime , err := bc .ProcessBlock (block , parent )
2327
2344
activeState = statedb
2328
2345
2329
2346
if err != nil {
@@ -2338,18 +2355,8 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error)
2338
2355
bc .stateSyncFeed .Send (StateSyncEvent {Data : data })
2339
2356
}
2340
2357
// BOR
2341
- ptime := time .Since (pstart )
2342
-
2343
- vstart := time .Now ()
2344
-
2345
- if err := bc .validator .ValidateState (block , statedb , receipts , usedGas , false ); err != nil {
2346
- bc .reportBlock (block , receipts , err )
2347
- followupInterrupt .Store (true )
2348
-
2349
- return it .index , err
2350
- }
2358
+ ptime := time .Since (pstart ) - vtime
2351
2359
2352
- vtime := time .Since (vstart )
2353
2360
proctime := time .Since (start ) // processing + validation
2354
2361
2355
2362
// Update the metrics touched during block processing and validation
0 commit comments