aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-04-19 01:29:30 +0800
committerobscuren <geffobscura@gmail.com>2015-04-19 01:30:29 +0800
commit7c5d50f627b223a8b0217f6ca684b4c7d1d877ef (patch)
tree451a842d00bbc60b34651f2cadd886250bf72469
parent78e37e98e77b467e6950922da4ea99ff146ab21f (diff)
downloaddexon-7c5d50f627b223a8b0217f6ca684b4c7d1d877ef.tar.gz
dexon-7c5d50f627b223a8b0217f6ca684b4c7d1d877ef.tar.zst
dexon-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.
-rw-r--r--eth/downloader/downloader.go22
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