diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index 6ac58140a349bc9bd3be075ddc50b084eca4f4c5..13f3b11c9abb60a597ede3ca6ae9b953a008f7ce 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -1093,6 +1093,10 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv
 					throttled = true
 					break
 				}
+				// Short circuit if there is no more available task.
+				if pending() == 0 {
+					break
+				}
 				// Reserve a chunk of fetches for a peer. A nil can mean either that
 				// no more headers are available, or that the peer is known not to
 				// have them.