diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-09-12 19:39:34 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2017-09-12 20:13:14 +0800 |
commit | f46adfac285741e943b97779d2053b22e66ce18d (patch) | |
tree | 626096a5edf82044e28eaddf55dfd1475cdeec5b /eth/downloader/peer.go | |
parent | 514b1587db0c7231bf7b49782b3257fe1125a54a (diff) | |
download | dexon-f46adfac285741e943b97779d2053b22e66ce18d.tar dexon-f46adfac285741e943b97779d2053b22e66ce18d.tar.gz dexon-f46adfac285741e943b97779d2053b22e66ce18d.tar.bz2 dexon-f46adfac285741e943b97779d2053b22e66ce18d.tar.lz dexon-f46adfac285741e943b97779d2053b22e66ce18d.tar.xz dexon-f46adfac285741e943b97779d2053b22e66ce18d.tar.zst dexon-f46adfac285741e943b97779d2053b22e66ce18d.zip |
eth/downloader: track peer drops and deassign state sync tasks
Diffstat (limited to 'eth/downloader/peer.go')
-rw-r--r-- | eth/downloader/peer.go | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index d0dc9a8aa..e638744ea 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -349,9 +349,10 @@ func (p *peerConnection) Lacks(hash common.Hash) bool { // peerSet represents the collection of active peer participating in the chain // download procedure. type peerSet struct { - peers map[string]*peerConnection - newPeerFeed event.Feed - lock sync.RWMutex + peers map[string]*peerConnection + newPeerFeed event.Feed + peerDropFeed event.Feed + lock sync.RWMutex } // newPeerSet creates a new peer set top track the active download sources. @@ -361,10 +362,16 @@ func newPeerSet() *peerSet { } } +// SubscribeNewPeers subscribes to peer arrival events. func (ps *peerSet) SubscribeNewPeers(ch chan<- *peerConnection) event.Subscription { return ps.newPeerFeed.Subscribe(ch) } +// SubscribePeerDrops subscribes to peer departure events. +func (ps *peerSet) SubscribePeerDrops(ch chan<- *peerConnection) event.Subscription { + return ps.peerDropFeed.Subscribe(ch) +} + // Reset iterates over the current peer set, and resets each of the known peers // to prepare for a next batch of block retrieval. func (ps *peerSet) Reset() { @@ -419,12 +426,15 @@ func (ps *peerSet) Register(p *peerConnection) error { // actions to/from that particular entity. func (ps *peerSet) Unregister(id string) error { ps.lock.Lock() - defer ps.lock.Unlock() - - if _, ok := ps.peers[id]; !ok { + p, ok := ps.peers[id] + if !ok { + defer ps.lock.Unlock() return errNotRegistered } delete(ps.peers, id) + ps.lock.Unlock() + + ps.peerDropFeed.Send(p) return nil } |