|
7 | 7 | "math/rand"
|
8 | 8 | "time"
|
9 | 9 |
|
| 10 | + "github.com/ethereum/go-ethereum/core" |
| 11 | + |
10 | 12 | "github.com/ethereum/go-ethereum/common"
|
11 | 13 | "github.com/ethereum/go-ethereum/core/types"
|
12 | 14 | "github.com/ethereum/go-ethereum/logger"
|
@@ -104,6 +106,7 @@ type Fetcher struct {
|
104 | 106 | broadcastMeter metrics.Meter // Counter for metering the inbound propagations
|
105 | 107 | broadcastTimer metrics.Timer // Counter and timer for metering the block forwarding
|
106 | 108 | discardMeter metrics.Meter // Counter for metering the discarded blocks
|
| 109 | + futureMeter metrics.Meter // Counter for metering future blocks |
107 | 110 | }
|
108 | 111 |
|
109 | 112 | // New creates a block fetcher to retrieve blocks based on hash announcements.
|
@@ -131,6 +134,7 @@ func New(getBlock blockRetrievalFn, validateBlock blockValidatorFn, broadcastBlo
|
131 | 134 | broadcastMeter: metrics.GetOrRegisterMeter("eth/sync/RemoteBroadcasts", metrics.DefaultRegistry),
|
132 | 135 | broadcastTimer: metrics.GetOrRegisterTimer("eth/sync/LocalBroadcasts", metrics.DefaultRegistry),
|
133 | 136 | discardMeter: metrics.GetOrRegisterMeter("eth/sync/DiscardedBlocks", metrics.DefaultRegistry),
|
| 137 | + futureMeter: metrics.GetOrRegisterMeter("eth/sync/FutureBlocks", metrics.DefaultRegistry), |
134 | 138 | }
|
135 | 139 | }
|
136 | 140 |
|
@@ -416,14 +420,22 @@ func (f *Fetcher) insert(peer string, block *types.Block) {
|
416 | 420 | return
|
417 | 421 | }
|
418 | 422 | // Quickly validate the header and propagate the block if it passes
|
419 |
| - if err := f.validateBlock(block, parent); err != nil { |
| 423 | + switch err := f.validateBlock(block, parent); err { |
| 424 | + case nil: |
| 425 | + // All ok, quickly propagate to our peers |
| 426 | + f.broadcastTimer.UpdateSince(block.ReceivedAt) |
| 427 | + go f.broadcastBlock(block, true) |
| 428 | + |
| 429 | + case core.BlockFutureErr: |
| 430 | + f.futureMeter.Mark(1) |
| 431 | + // Weird future block, don't fail, but neither propagate |
| 432 | + |
| 433 | + default: |
| 434 | + // Something went very wrong, drop the peer |
420 | 435 | glog.V(logger.Debug).Infof("Peer %s: block #%d [%x] verification failed: %v", peer, block.NumberU64(), hash[:4], err)
|
421 | 436 | f.dropPeer(peer)
|
422 | 437 | return
|
423 | 438 | }
|
424 |
| - f.broadcastTimer.UpdateSince(block.ReceivedAt) |
425 |
| - go f.broadcastBlock(block, true) |
426 |
| - |
427 | 439 | // Run the actual import and log any issues
|
428 | 440 | if _, err := f.insertChain(types.Blocks{block}); err != nil {
|
429 | 441 | glog.V(logger.Warn).Infof("Peer %s: block #%d [%x] import failed: %v", peer, block.NumberU64(), hash[:4], err)
|
|
0 commit comments