From 7cf83cee5240f76bdf8ff4f1024643fd126e1018 Mon Sep 17 00:00:00 2001 From: Domino Valdano Date: Mon, 23 Apr 2018 00:01:21 -0700 Subject: [PATCH] eth/downloader: fix for Issue #16539 (#16546) --- eth/downloader/downloader.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 8b181b8ad4fb..43f0e3db977c 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -306,7 +306,7 @@ func (d *Downloader) UnregisterPeer(id string) error { d.cancelLock.RUnlock() if master { - d.Cancel() + d.cancel() } return nil } @@ -501,8 +501,10 @@ func (d *Downloader) spawnSync(fetchers []func() error) error { return err } -// Cancel cancels all of the operations and resets the queue. -func (d *Downloader) Cancel() { +// cancel aborts all of the operations and resets the queue. However, cancel does +// not wait for the running download goroutines to finish. This method should be +// used when cancelling the downloads from inside the downloader. +func (d *Downloader) cancel() { // Close the current cancel channel d.cancelLock.Lock() if d.cancelCh != nil { @@ -514,6 +516,12 @@ func (d *Downloader) Cancel() { } } d.cancelLock.Unlock() +} + +// Cancel aborts all of the operations and waits for all download goroutines to +// finish before returning. +func (d *Downloader) Cancel() { + d.cancel() d.cancelWg.Wait() }