diff --git a/app/protocol/flows/v4/blockrelay/ibd_progress_reporter.go b/app/protocol/flows/v4/blockrelay/ibd_progress_reporter.go index acb8d8209..bd6d1d973 100644 --- a/app/protocol/flows/v4/blockrelay/ibd_progress_reporter.go +++ b/app/protocol/flows/v4/blockrelay/ibd_progress_reporter.go @@ -10,6 +10,10 @@ type ibdProgressReporter struct { } func newIBDProgressReporter(lowDAAScore uint64, highDAAScore uint64, objectName string) *ibdProgressReporter { + if highDAAScore <= lowDAAScore { + // Avoid a zero or negative diff + highDAAScore = lowDAAScore + 1 + } return &ibdProgressReporter{ lowDAAScore: lowDAAScore, highDAAScore: highDAAScore, @@ -23,7 +27,16 @@ func newIBDProgressReporter(lowDAAScore uint64, highDAAScore uint64, objectName func (ipr *ibdProgressReporter) reportProgress(processedDelta int, highestProcessedDAAScore uint64) { ipr.processed += processedDelta - relativeDAAScore := highestProcessedDAAScore - ipr.lowDAAScore + // Avoid exploding numbers in the percentage report, since the original `highDAAScore` might have been only a hint + if highestProcessedDAAScore > ipr.highDAAScore { + ipr.highDAAScore = highestProcessedDAAScore + 1 // + 1 for keeping it at 99% + ipr.totalDAAScoreDifference = ipr.highDAAScore - ipr.lowDAAScore + } + relativeDAAScore := uint64(0) + if highestProcessedDAAScore > ipr.lowDAAScore { + // Avoid a negative diff + relativeDAAScore = highestProcessedDAAScore - ipr.lowDAAScore + } progressPercent := int((float64(relativeDAAScore) / float64(ipr.totalDAAScoreDifference)) * 100) if progressPercent > ipr.lastReportedProgressPercent { log.Infof("IBD: Processed %d %s (%d%%)", ipr.processed, ipr.objectName, progressPercent) diff --git a/app/protocol/flows/v5/blockrelay/ibd_progress_reporter.go b/app/protocol/flows/v5/blockrelay/ibd_progress_reporter.go index 2e6c4f378..bd6d1d973 100644 --- a/app/protocol/flows/v5/blockrelay/ibd_progress_reporter.go +++ b/app/protocol/flows/v5/blockrelay/ibd_progress_reporter.go @@ -10,6 +10,10 @@ type ibdProgressReporter struct { } func newIBDProgressReporter(lowDAAScore uint64, highDAAScore uint64, objectName string) *ibdProgressReporter { + if highDAAScore <= lowDAAScore { + // Avoid a zero or negative diff + highDAAScore = lowDAAScore + 1 + } return &ibdProgressReporter{ lowDAAScore: lowDAAScore, highDAAScore: highDAAScore, @@ -28,7 +32,11 @@ func (ipr *ibdProgressReporter) reportProgress(processedDelta int, highestProces ipr.highDAAScore = highestProcessedDAAScore + 1 // + 1 for keeping it at 99% ipr.totalDAAScoreDifference = ipr.highDAAScore - ipr.lowDAAScore } - relativeDAAScore := highestProcessedDAAScore - ipr.lowDAAScore + relativeDAAScore := uint64(0) + if highestProcessedDAAScore > ipr.lowDAAScore { + // Avoid a negative diff + relativeDAAScore = highestProcessedDAAScore - ipr.lowDAAScore + } progressPercent := int((float64(relativeDAAScore) / float64(ipr.totalDAAScoreDifference)) * 100) if progressPercent > ipr.lastReportedProgressPercent { log.Infof("IBD: Processed %d %s (%d%%)", ipr.processed, ipr.objectName, progressPercent)