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