Commit 6830ddb6 authored by obscuren's avatar obscuren

downloader: free up peers from work when the downloader resets

parent 7c5d50f6
...@@ -297,8 +297,9 @@ out: ...@@ -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: ...@@ -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()
} }
} }
......
...@@ -20,6 +20,12 @@ type blockFetcherFn func([]common.Hash) error ...@@ -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() { ...@@ -128,3 +134,7 @@ func (p *peer) demote() {
p.rep = 0 p.rep = 0
} }
} }
func (p *peer) reset() {
p.state = idleState
}
...@@ -60,13 +60,18 @@ func (c *queue) get(p *peer, max int) *chunk { ...@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment