downloader: free up peers from work when the downloader resets

This commit is contained in:
obscuren 2015-04-18 20:25:55 +02:00
parent 7c5d50f627
commit 6830ddb659
3 changed files with 22 additions and 5 deletions

View File

@ -297,8 +297,9 @@ out:
// make sure that we have peers available for fetching. If all peers have been tried // make sure that we have peers available for fetching. If all peers have been tried
// and all failed throw an error // and all failed throw an error
if len(availablePeers) > 0 && d.queue.fetchPool.Size() == 0 { if len(d.queue.fetching) == 0 {
d.queue.reset() d.queue.reset()
d.peers.reset()
return errPeersUnavailable return errPeersUnavailable
} }
@ -337,6 +338,7 @@ out:
d.queue.deliver(pid, nil) d.queue.deliver(pid, nil)
if peer := d.peers[pid]; peer != nil { if peer := d.peers[pid]; peer != nil {
peer.demote() peer.demote()
peer.reset()
} }
} }

View File

@ -20,6 +20,12 @@ type blockFetcherFn func([]common.Hash) error
// XXX make threadsafe!!!! // XXX make threadsafe!!!!
type peers map[string]*peer type peers map[string]*peer
func (p peers) reset() {
for _, peer := range p {
p.reset()
}
}
func (p peers) get(state int) []*peer { func (p peers) get(state int) []*peer {
var peers []*peer var peers []*peer
for _, peer := range p { for _, peer := range p {
@ -128,3 +134,7 @@ func (p *peer) demote() {
p.rep = 0 p.rep = 0
} }
} }
func (p *peer) reset() {
p.state = idleState
}

View File

@ -60,13 +60,18 @@ func (c *queue) get(p *peer, max int) *chunk {
return false return false
} }
hashes.Add(v) // Skip any hashes that have previously been requested from the peer
i++ if !p.requested.Has(v) {
hashes.Add(v)
i++
}
return true return true
}) })
// remove hashes that have previously been fetched // if no hashes can be requested return a nil chunk
hashes.Separate(p.requested) if hashes.Size() == 0 {
return nil
}
// remove the fetchable hashes from hash pool // remove the fetchable hashes from hash pool
c.hashPool.Separate(hashes) c.hashPool.Separate(hashes)