eth/downloader: revert to demotion, use harsher penalty

pull/915/head
Péter Szilágyi 10 years ago
parent 685862d2ce
commit ebbd8b0743
  1. 12
      eth/downloader/downloader.go
  2. 15
      eth/downloader/peer.go

@ -335,7 +335,7 @@ out:
// Deliver the received chunk of blocks, but drop the peer if invalid // Deliver the received chunk of blocks, but drop the peer if invalid
if err := d.queue.Deliver(blockPack.peerId, blockPack.blocks); err != nil { if err := d.queue.Deliver(blockPack.peerId, blockPack.blocks); err != nil {
glog.V(logger.Debug).Infof("Failed delivery for peer %s: %v\n", blockPack.peerId, err) glog.V(logger.Debug).Infof("Failed delivery for peer %s: %v\n", blockPack.peerId, err)
d.peers.Unregister(blockPack.peerId) peer.Demote()
break break
} }
if glog.V(logger.Debug) { if glog.V(logger.Debug) {
@ -358,7 +358,9 @@ out:
// 1) Time for them to respond; // 1) Time for them to respond;
// 2) Measure their speed; // 2) Measure their speed;
// 3) Amount and availability. // 3) Amount and availability.
d.peers.Unregister(pid) if peer := d.peers.Peer(pid); peer != nil {
peer.Demote()
}
} }
// After removing bad peers make sure we actually have sufficient peer left to keep downloading // After removing bad peers make sure we actually have sufficient peer left to keep downloading
if d.peers.Peers() == 0 { if d.peers.Peers() == 0 {
@ -372,9 +374,13 @@ out:
if d.queue.Throttle() { if d.queue.Throttle() {
continue continue
} }
// Send a download request to all idle peers // Send a download request to all idle peers, until throttled
idlePeers := d.peers.IdlePeers() idlePeers := d.peers.IdlePeers()
for _, peer := range idlePeers { for _, peer := range idlePeers {
// Short circuit if throttling activated since above
if d.queue.Throttle() {
break
}
// Get a possible chunk. If nil is returned no chunk // Get a possible chunk. If nil is returned no chunk
// could be returned due to no hashes available. // could be returned due to no hashes available.
request := d.queue.Reserve(peer, maxBlockFetch) request := d.queue.Reserve(peer, maxBlockFetch)

@ -86,10 +86,8 @@ func (p *peer) Demote() {
for { for {
// Calculate the new reputation value // Calculate the new reputation value
prev := atomic.LoadInt32(&p.rep) prev := atomic.LoadInt32(&p.rep)
next := prev - 2 next := prev / 2
if next < 0 {
next = 0
}
// Try to update the old value // Try to update the old value
if atomic.CompareAndSwapInt32(&p.rep, prev, next) { if atomic.CompareAndSwapInt32(&p.rep, prev, next) {
return return
@ -177,7 +175,7 @@ func (ps *peerSet) AllPeers() []*peer {
} }
// IdlePeers retrieves a flat list of all the currently idle peers within the // IdlePeers retrieves a flat list of all the currently idle peers within the
// active peer set. // active peer set, ordered by their reputation.
func (ps *peerSet) IdlePeers() []*peer { func (ps *peerSet) IdlePeers() []*peer {
ps.lock.RLock() ps.lock.RLock()
defer ps.lock.RUnlock() defer ps.lock.RUnlock()
@ -188,5 +186,12 @@ func (ps *peerSet) IdlePeers() []*peer {
list = append(list, p) list = append(list, p)
} }
} }
for i := 0; i < len(list); i++ {
for j := i + 1; j < len(list); j++ {
if atomic.LoadInt32(&list[i].rep) < atomic.LoadInt32(&list[j].rep) {
list[i], list[j] = list[j], list[i]
}
}
}
return list return list
} }

Loading…
Cancel
Save