From 5c59d9553218891cd33831aae607668a0b5bf022 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Sun, 19 Apr 2015 01:39:37 +0200
Subject: [PATCH] downloader: defer peer reset after download

---
 eth/downloader/downloader.go | 11 +++++++----
 eth/downloader/peer.go       |  1 +
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index 2d417dcf5..6768c3e67 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -205,13 +205,13 @@ func (d *Downloader) startFetchingHashes(p *peer, hash common.Hash, ignoreInitia
 	// Get the first batch of hashes
 	p.getHashes(hash)
 
-	failureResponse := time.NewTimer(hashTtl)
+	failureResponseTimer := time.NewTimer(hashTtl)
 
 out:
 	for {
 		select {
 		case hashes := <-d.hashCh:
-			failureResponse.Reset(hashTtl)
+			failureResponseTimer.Reset(hashTtl)
 
 			var done bool // determines whether we're done fetching hashes (i.e. common hash found)
 			hashSet := set.New()
@@ -239,7 +239,7 @@ out:
 			} else { // we're done
 				break out
 			}
-		case <-failureResponse.C:
+		case <-failureResponseTimer.C:
 			glog.V(logger.Debug).Infof("Peer (%s) didn't respond in time for hash request\n", p.id)
 			// TODO instead of reseting the queue select a new peer from which we can start downloading hashes.
 			// 1. check for peer's best hash to be included in the current hash set;
@@ -258,6 +258,10 @@ func (d *Downloader) startFetchingBlocks(p *peer) error {
 	glog.V(logger.Detail).Infoln("Downloading", d.queue.hashPool.Size(), "block(s)")
 	atomic.StoreInt32(&d.downloadingBlocks, 1)
 	defer atomic.StoreInt32(&d.downloadingBlocks, 0)
+	// Defer the peer reset. This will empty the peer requested set
+	// and makes sure there are no lingering peers with an incorrect
+	// state
+	defer d.peers.reset()
 
 	start := time.Now()
 
@@ -302,7 +306,6 @@ out:
 				// and all failed throw an error
 				if len(d.queue.fetching) == 0 {
 					d.queue.reset()
-					d.peers.reset()
 
 					return fmt.Errorf("%v avaialable = %d. total = %d", errPeersUnavailable, len(availablePeers), len(d.peers))
 				}
diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go
index 88ede16f9..7065ca105 100644
--- a/eth/downloader/peer.go
+++ b/eth/downloader/peer.go
@@ -137,4 +137,5 @@ func (p *peer) demote() {
 
 func (p *peer) reset() {
 	p.state = idleState
+	p.requested.Clear()
 }
-- 
GitLab