From 7dcb9825c3a3afe1a287ad544a5ad0500c0027a7 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 12 Apr 2015 13:33:42 +0200 Subject: downloader: return an error for peer.fetch and return chunk to queue If a peer was somehow already fetching and somehow managed to end up in the `available` pool it should return it's work. --- eth/downloader/peer.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'eth/downloader/peer.go') diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 486c09e38..318da59b7 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -1,6 +1,7 @@ package downloader import ( + "errors" "math/big" "sync" @@ -31,10 +32,14 @@ func newPeer(id string, td *big.Int, hash common.Hash, getHashes hashFetcherFn, } // fetch a chunk using the peer -func (p *peer) fetch(chunk *chunk) { +func (p *peer) fetch(chunk *chunk) error { p.mu.Lock() defer p.mu.Unlock() + if p.state == workingState { + return errors.New("peer already fetching chunk") + } + // set working state p.state = workingState // convert the set to a fetchable slice @@ -45,4 +50,6 @@ func (p *peer) fetch(chunk *chunk) { return true }) p.getBlocks(hashes) + + return nil } -- cgit v1.2.3