|
|
@ -7,12 +7,11 @@ import ( |
|
|
|
"math/rand" |
|
|
|
"math/rand" |
|
|
|
"time" |
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
|
|
"github.com/rcrowley/go-metrics" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
"github.com/ethereum/go-ethereum/core/types" |
|
|
|
"github.com/ethereum/go-ethereum/core/types" |
|
|
|
"github.com/ethereum/go-ethereum/logger" |
|
|
|
"github.com/ethereum/go-ethereum/logger" |
|
|
|
"github.com/ethereum/go-ethereum/logger/glog" |
|
|
|
"github.com/ethereum/go-ethereum/logger/glog" |
|
|
|
|
|
|
|
"github.com/rcrowley/go-metrics" |
|
|
|
"gopkg.in/karalabe/cookiejar.v2/collections/prque" |
|
|
|
"gopkg.in/karalabe/cookiejar.v2/collections/prque" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
@ -100,9 +99,11 @@ type Fetcher struct { |
|
|
|
importedHook func(*types.Block) // Method to call upon successful block import
|
|
|
|
importedHook func(*types.Block) // Method to call upon successful block import
|
|
|
|
|
|
|
|
|
|
|
|
// Runtime metrics
|
|
|
|
// Runtime metrics
|
|
|
|
announceStats metrics.Meter |
|
|
|
announceMeter metrics.Meter // Counter for metering the inbound announcements
|
|
|
|
broadcastStats metrics.Meter |
|
|
|
announceTimer metrics.Timer // Counter and timer for metering the announce forwarding
|
|
|
|
discardStats metrics.Meter |
|
|
|
broadcastMeter metrics.Meter // Counter for metering the inbound propagations
|
|
|
|
|
|
|
|
broadcastTimer metrics.Timer // Counter and timer for metering the block forwarding
|
|
|
|
|
|
|
|
discardMeter metrics.Meter // Counter for metering the discarded blocks
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// New creates a block fetcher to retrieve blocks based on hash announcements.
|
|
|
|
// New creates a block fetcher to retrieve blocks based on hash announcements.
|
|
|
@ -125,9 +126,11 @@ func New(getBlock blockRetrievalFn, validateBlock blockValidatorFn, broadcastBlo |
|
|
|
chainHeight: chainHeight, |
|
|
|
chainHeight: chainHeight, |
|
|
|
insertChain: insertChain, |
|
|
|
insertChain: insertChain, |
|
|
|
dropPeer: dropPeer, |
|
|
|
dropPeer: dropPeer, |
|
|
|
announceStats: metrics.GetOrRegisterMeter("eth/Announced Blocks", metrics.DefaultRegistry), |
|
|
|
announceMeter: metrics.GetOrRegisterMeter("eth/RemoteAnnounces", metrics.DefaultRegistry), |
|
|
|
broadcastStats: metrics.GetOrRegisterMeter("eth/Propagated Blocks", metrics.DefaultRegistry), |
|
|
|
announceTimer: metrics.GetOrRegisterTimer("eth/LocalAnnounces", metrics.DefaultRegistry), |
|
|
|
discardStats: metrics.GetOrRegisterMeter("eth/Discarded Blocks", metrics.DefaultRegistry), |
|
|
|
broadcastMeter: metrics.GetOrRegisterMeter("eth/RemoteBroadcasts", metrics.DefaultRegistry), |
|
|
|
|
|
|
|
broadcastTimer: metrics.GetOrRegisterTimer("eth/LocalBroadcasts", metrics.DefaultRegistry), |
|
|
|
|
|
|
|
discardMeter: metrics.GetOrRegisterMeter("eth/DiscardedBlocks", metrics.DefaultRegistry), |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -239,7 +242,7 @@ func (f *Fetcher) loop() { |
|
|
|
|
|
|
|
|
|
|
|
case notification := <-f.notify: |
|
|
|
case notification := <-f.notify: |
|
|
|
// A block was announced, make sure the peer isn't DOSing us
|
|
|
|
// A block was announced, make sure the peer isn't DOSing us
|
|
|
|
f.announceStats.Mark(1) |
|
|
|
f.announceMeter.Mark(1) |
|
|
|
|
|
|
|
|
|
|
|
count := f.announces[notification.origin] + 1 |
|
|
|
count := f.announces[notification.origin] + 1 |
|
|
|
if count > hashLimit { |
|
|
|
if count > hashLimit { |
|
|
@ -258,7 +261,7 @@ func (f *Fetcher) loop() { |
|
|
|
|
|
|
|
|
|
|
|
case op := <-f.inject: |
|
|
|
case op := <-f.inject: |
|
|
|
// A direct block insertion was requested, try and fill any pending gaps
|
|
|
|
// A direct block insertion was requested, try and fill any pending gaps
|
|
|
|
f.broadcastStats.Mark(1) |
|
|
|
f.broadcastMeter.Mark(1) |
|
|
|
f.enqueue(op.origin, op.block) |
|
|
|
f.enqueue(op.origin, op.block) |
|
|
|
|
|
|
|
|
|
|
|
case hash := <-f.done: |
|
|
|
case hash := <-f.done: |
|
|
@ -418,6 +421,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) { |
|
|
|
f.dropPeer(peer) |
|
|
|
f.dropPeer(peer) |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
f.broadcastTimer.UpdateSince(block.ReceivedAt) |
|
|
|
go f.broadcastBlock(block, true) |
|
|
|
go f.broadcastBlock(block, true) |
|
|
|
|
|
|
|
|
|
|
|
// Run the actual import and log any issues
|
|
|
|
// Run the actual import and log any issues
|
|
|
@ -426,6 +430,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
// If import succeeded, broadcast the block
|
|
|
|
// If import succeeded, broadcast the block
|
|
|
|
|
|
|
|
f.announceTimer.UpdateSince(block.ReceivedAt) |
|
|
|
go f.broadcastBlock(block, false) |
|
|
|
go f.broadcastBlock(block, false) |
|
|
|
|
|
|
|
|
|
|
|
// Invoke the testing hook if needed
|
|
|
|
// Invoke the testing hook if needed
|
|
|
|