Skip to content

Commit a7d2265

Browse files
committed
eth/fetcher: don't drop on future blocks, just not propagate
1 parent 29d53b2 commit a7d2265

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

eth/fetcher/fetcher.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"math/rand"
88
"time"
99

10+
"github.com/ethereum/go-ethereum/core"
11+
1012
"github.com/ethereum/go-ethereum/common"
1113
"github.com/ethereum/go-ethereum/core/types"
1214
"github.com/ethereum/go-ethereum/logger"
@@ -104,6 +106,7 @@ type Fetcher struct {
104106
broadcastMeter metrics.Meter // Counter for metering the inbound propagations
105107
broadcastTimer metrics.Timer // Counter and timer for metering the block forwarding
106108
discardMeter metrics.Meter // Counter for metering the discarded blocks
109+
futureMeter metrics.Meter // Counter for metering future blocks
107110
}
108111

109112
// New creates a block fetcher to retrieve blocks based on hash announcements.
@@ -131,6 +134,7 @@ func New(getBlock blockRetrievalFn, validateBlock blockValidatorFn, broadcastBlo
131134
broadcastMeter: metrics.GetOrRegisterMeter("eth/sync/RemoteBroadcasts", metrics.DefaultRegistry),
132135
broadcastTimer: metrics.GetOrRegisterTimer("eth/sync/LocalBroadcasts", metrics.DefaultRegistry),
133136
discardMeter: metrics.GetOrRegisterMeter("eth/sync/DiscardedBlocks", metrics.DefaultRegistry),
137+
futureMeter: metrics.GetOrRegisterMeter("eth/sync/FutureBlocks", metrics.DefaultRegistry),
134138
}
135139
}
136140

@@ -416,14 +420,22 @@ func (f *Fetcher) insert(peer string, block *types.Block) {
416420
return
417421
}
418422
// 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
420435
glog.V(logger.Debug).Infof("Peer %s: block #%d [%x] verification failed: %v", peer, block.NumberU64(), hash[:4], err)
421436
f.dropPeer(peer)
422437
return
423438
}
424-
f.broadcastTimer.UpdateSince(block.ReceivedAt)
425-
go f.broadcastBlock(block, true)
426-
427439
// Run the actual import and log any issues
428440
if _, err := f.insertChain(types.Blocks{block}); err != nil {
429441
glog.V(logger.Warn).Infof("Peer %s: block #%d [%x] import failed: %v", peer, block.NumberU64(), hash[:4], err)

0 commit comments

Comments
 (0)