From 1cbde9a5efb7ef146f1bef07550b88bd3f64295a Mon Sep 17 00:00:00 2001
From: ledgerwatch <akhounov@gmail.com>
Date: Sun, 17 Oct 2021 19:13:34 +0100
Subject: [PATCH] More robust preverification of headers and remove kludge for
 header download (#2833)

* Update header_algos.go

* Update stage_headers.go

* Update header_algos.go
---
 eth/stagedsync/stage_headers.go             |  9 -------
 turbo/stages/headerdownload/header_algos.go | 28 ++++++++++++---------
 2 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/eth/stagedsync/stage_headers.go b/eth/stagedsync/stage_headers.go
index 0869908257..447eb74ba6 100644
--- a/eth/stagedsync/stage_headers.go
+++ b/eth/stagedsync/stage_headers.go
@@ -119,7 +119,6 @@ func HeadersForward(
 	var peer []byte
 	stopped := false
 	prevProgress := headerProgress
-	noProgressCount := 0 // How many time the progress was printed without actual progress
 Loop:
 	for !stopped {
 		currentTime := uint64(time.Now().Unix())
@@ -163,9 +162,6 @@ Loop:
 		if len(announces) > 0 {
 			cfg.announceNewHashes(ctx, announces)
 		}
-		if s.BlockNumber > 0 && noProgressCount >= 5 {
-			break
-		}
 		if headerInserter.BestHeaderChanged() { // We do not break unless there best header changed
 			if !initialCycle {
 				// if this is not an initial cycle, we need to react quickly when new headers are coming in
@@ -185,11 +181,6 @@ Loop:
 			stopped = true
 		case <-logEvery.C:
 			progress := cfg.hd.Progress()
-			if prevProgress == progress {
-				noProgressCount++
-			} else {
-				noProgressCount = 0 // Reset, there was progress
-			}
 			logProgressHeaders(logPrefix, prevProgress, progress)
 			prevProgress = progress
 		case <-timer.C:
diff --git a/turbo/stages/headerdownload/header_algos.go b/turbo/stages/headerdownload/header_algos.go
index 7bca72b6cb..7c1dfe24d5 100644
--- a/turbo/stages/headerdownload/header_algos.go
+++ b/turbo/stages/headerdownload/header_algos.go
@@ -159,7 +159,7 @@ func (hd *HeaderDownload) removeUpwards(toRemove []*Link) {
 
 func (hd *HeaderDownload) markPreverified(link *Link) {
 	// Go through all parent links that are not preveried and mark them too
-	for link != nil && !link.preverified {
+	for link != nil && !link.persisted {
 		link.preverified = true
 		link = hd.links[link.header.ParentHash]
 	}
@@ -237,10 +237,8 @@ func (hd *HeaderDownload) extendDown(segment *ChainSegment, start, end int) (boo
 				prevLink.next = append(prevLink.next, link)
 			}
 			prevLink = link
-			if !anchorPreverified {
-				if _, ok := hd.preverifiedHashes[link.hash]; ok {
-					hd.markPreverified(link)
-				}
+			if _, ok := hd.preverifiedHashes[link.hash]; ok {
+				hd.markPreverified(link)
 			}
 		}
 		prevLink.next = anchor.links
@@ -288,10 +286,8 @@ func (hd *HeaderDownload) connect(segment *ChainSegment, start, end int) ([]Pena
 		link := hd.addHeaderAsLink(segment.Headers[i], false /* persisted */)
 		prevLink.next = append(prevLink.next, link)
 		prevLink = link
-		if !anchorPreverified {
-			if _, ok := hd.preverifiedHashes[link.hash]; ok {
-				hd.markPreverified(link)
-			}
+		if _, ok := hd.preverifiedHashes[link.hash]; ok {
+			hd.markPreverified(link)
 		}
 	}
 	prevLink.next = anchor.links
@@ -560,9 +556,6 @@ func (hd *HeaderDownload) RequestSkeleton() *HeaderRequest {
 	hd.lock.RLock()
 	defer hd.lock.RUnlock()
 	log.Trace("Request skeleton", "anchors", len(hd.anchors), "top seen height", hd.topSeenHeight, "highestInDb", hd.highestInDb)
-	if len(hd.anchors) > 16 {
-		return nil // Need to be below anchor threshold to produce skeleton request
-	}
 	stride := uint64(8 * 192)
 	if hd.topSeenHeight < hd.highestInDb+stride {
 		return nil
@@ -571,6 +564,17 @@ func (hd *HeaderDownload) RequestSkeleton() *HeaderRequest {
 	if length > 192 {
 		length = 192
 	}
+	queryRange := hd.highestInDb + length*stride
+	// Count anchors within the range of the skeleton query
+	anchorsWithinRange := 0
+	for _, anchor := range hd.anchors {
+		if anchor.blockHeight < queryRange {
+			anchorsWithinRange++
+		}
+	}
+	if anchorsWithinRange > 16 {
+		return nil // Need to be below anchor threshold to produce skeleton request
+	}
 	return &HeaderRequest{Number: hd.highestInDb + stride, Length: length, Skip: stride, Reverse: false}
 }
 
-- 
GitLab