diff options
author | obscuren <geffobscura@gmail.com> | 2015-04-19 01:29:30 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-04-19 01:30:29 +0800 |
commit | 7c5d50f627b223a8b0217f6ca684b4c7d1d877ef (patch) | |
tree | 451a842d00bbc60b34651f2cadd886250bf72469 /eth/downloader | |
parent | 78e37e98e77b467e6950922da4ea99ff146ab21f (diff) | |
download | go-tangerine-7c5d50f627b223a8b0217f6ca684b4c7d1d877ef.tar.gz go-tangerine-7c5d50f627b223a8b0217f6ca684b4c7d1d877ef.tar.zst go-tangerine-7c5d50f627b223a8b0217f6ca684b4c7d1d877ef.zip |
downloader: throw an error if there are no peers available for download
If all peers have been tried during the block download process and some
hashes are unfetchable (available peers > 0 and fetching == 0) throw an
error so the process can be aborted.
Diffstat (limited to 'eth/downloader')
-rw-r--r-- | eth/downloader/downloader.go | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 290e3b474..2b5dbe952 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -26,12 +26,13 @@ const ( ) var ( - errLowTd = errors.New("peer's TD is too low") - errBusy = errors.New("busy") - errUnknownPeer = errors.New("peer's unknown or unhealthy") - errBadPeer = errors.New("action from bad peer ignored") - errTimeout = errors.New("timeout") - errEmptyHashSet = errors.New("empty hash set by peer") + errLowTd = errors.New("peer's TD is too low") + errBusy = errors.New("busy") + errUnknownPeer = errors.New("peer's unknown or unhealthy") + errBadPeer = errors.New("action from bad peer ignored") + errTimeout = errors.New("timeout") + errEmptyHashSet = errors.New("empty hash set by peer") + errPeersUnavailable = errors.New("no peers available or all peers tried for block download process") ) type hashCheckFn func(common.Hash) bool @@ -293,6 +294,15 @@ out: d.queue.put(chunk.hashes) } } + + // make sure that we have peers available for fetching. If all peers have been tried + // and all failed throw an error + if len(availablePeers) > 0 && d.queue.fetchPool.Size() == 0 { + d.queue.reset() + + return errPeersUnavailable + } + } else if len(d.queue.fetching) == 0 { // When there are no more queue and no more `fetching`. We can // safely assume we're done. Another part of the process will check |