From 7c5d50f627b223a8b0217f6ca684b4c7d1d877ef Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Sat, 18 Apr 2015 19:29:30 +0200
Subject: [PATCH] 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.
---
 eth/downloader/downloader.go | 22 ++++++++++++++++------
 1 file 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
-- 
GitLab