diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index 38b66d9dd5f61cdbeda8060a398d5bd876452e98..5782d4cf5349f35e024ad78f39f6b032226b5ebe 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.