diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 8b181b8ad4..43f0e3db97 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() }