aboutsummaryrefslogtreecommitdiffstats
path: root/eth
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2016-05-31 19:48:52 +0800
committerPéter Szilágyi <peterke@gmail.com>2016-05-31 19:48:52 +0800
commit16a23ff74056aa306eb8a87272277bc8660f3252 (patch)
tree811c5baa8451f5a13e16c7fe033a20e67df12629 /eth
parent1d5d21726a49a1dcf06d0d1544e1bd93f4231632 (diff)
parent4496a44f68246bf128bb822c3f3a98f38adfdbdd (diff)
downloaddexon-16a23ff74056aa306eb8a87272277bc8660f3252.tar.gz
dexon-16a23ff74056aa306eb8a87272277bc8660f3252.tar.zst
dexon-16a23ff74056aa306eb8a87272277bc8660f3252.zip
Merge pull request #2637 from karalabe/downloader-always-cancel
eth/downloader: ensure cancel channel is closed post sync
Diffstat (limited to 'eth')
-rw-r--r--eth/downloader/downloader.go2
-rw-r--r--eth/downloader/downloader_test.go12
2 files changed, 13 insertions, 1 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index 8cb0d21f7..f6dbb4610 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -326,6 +326,8 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode
d.cancelCh = make(chan struct{})
d.cancelLock.Unlock()
+ defer d.cancel() // No matter what, we can't leave the cancel channel open
+
// Set the requested sync mode, unless it's forbidden
d.mode = mode
if d.mode == FastSync && d.noFast {
diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go
index 4ea8a8abe..1cf0e7cd3 100644
--- a/eth/downloader/downloader_test.go
+++ b/eth/downloader/downloader_test.go
@@ -188,7 +188,17 @@ func (dl *downloadTester) sync(id string, td *big.Int, mode SyncMode) error {
}
}
dl.lock.RUnlock()
- return dl.downloader.synchronise(id, hash, td, mode)
+
+ // Synchronise with the chosen peer and ensure proper cleanup afterwards
+ err := dl.downloader.synchronise(id, hash, td, mode)
+ select {
+ case <-dl.downloader.cancelCh:
+ // Ok, downloader fully cancelled after sync cycle
+ default:
+ // Downloader is still accepting packets, can block a peer up
+ panic("downloader active post sync cycle") // panic will be caught by tester
+ }
+ return err
}
// hasHeader checks if a header is present in the testers canonical chain.