bugfix: truncate header sync percentage #935

pull arejula27 wants to merge 1 commits into bitcoin-core:master from arejula27:gui-ibd-fix-header-sync-percentage changing 1 files +4 −2
  1. arejula27 commented at 12:54 PM on March 28, 2026: none

    <!-- *** Please remove the following help text before submitting: *** Pull requests without a rationale and clear improvement may be closed immediately. GUI-related pull requests should be opened against https://github.com/bitcoin-core/gui first. See CONTRIBUTING.md -->

    <!-- Please provide clear motivation for your patch and explain how it improves Bitcoin Core user experience or Bitcoin Core developer experience significantly: * Any test improvements or new tests that improve coverage are always welcome. * All other changes should have accompanying unit tests (see `src/test/`) or functional tests (see `test/`). Contributors should note which tests cover modified code. If no tests exist for a region of modified code, new tests should accompany the change. * Bug fixes are most welcome when they come with steps to reproduce or an explanation of the potential issue as well as reasoning for the way the bug was fixed. * Features are welcome, but might be rejected due to design or scope issues. If a feature is based on a lot of dependencies, contributors should first consider building the system outside of Bitcoin Core, if possible. * Refactoring changes are only accepted if they are required for a feature or bug fix or otherwise improve developer experience significantly. For example, most "code style" refactoring changes require a thorough explanation why they are useful, what downsides they have and why they *significantly* improve developer experience or avoid serious programming bugs. Note that code style is often a subjective matter. Unless they are explicitly mentioned to be preferred in the [developer notes](/doc/developer-notes.md), stylistic code changes are usually rejected. -->

    During IBD, if LoadingBlocks() is true (e.g. during a chainstate rebuild after a crash), the node rejects incoming headers from peers. The GUI has headers loaded from the block index on disk, but bestHeaderDate becomes stale over time.

    After ~4 hours (HEADER_HEIGHT_DELTA_SYNC * nPowTargetSpacing), the time-based heuristic in modaloverlay.cpp considers headers as "not synced" and falls into the else branch, displaying "Unknown" for both blocks remaining and estimated time. Meanwhile, UpdateHeaderSyncLabel() computes a percentage that rounds up to 100.0%, creating a contradictory display: "Unknown. Syncing Headers (942188, 100.0%)". Please read issue #65 for more context.

    This patch truncates the percentage to one decimal place instead of rounding, so it only shows 100.0% when headers are truly up to date. The same fix is applied to UpdateHeaderPresyncLabel() for consistency.

    Fixes #65 .

    <!-- Bitcoin Core has a thorough review process and even the most trivial change needs to pass a lot of eyes and requires non-zero or even substantial time effort to review. There is a huge lack of active reviewers on the project, so patches often sit for a long time. -->

  2. DrahtBot commented at 12:54 PM on March 28, 2026: contributor

    <!--e57a25ab6845829454e8d69fc972939a-->

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    <!--021abf342d371248e50ceaed478a90ca-->

    Reviews

    See the guideline for information on the review process. A summary of reviews will appear here.

    <!--5faf32d7da4f0f540f40219e4f7537a3-->

  3. in src/qt/modaloverlay.cpp:171 in 13b1c9dc4c
     164 | @@ -163,12 +165,18 @@ void ModalOverlay::tipUpdate(int count, const QDateTime& blockDate, double nVeri
     165 |  
     166 |  void ModalOverlay::UpdateHeaderSyncLabel() {
     167 |      int est_headers_left = bestHeaderDate.secsTo(QDateTime::currentDateTime()) / Params().GetConsensus().nPowTargetSpacing;
     168 | -    ui->numberOfBlocksLeft->setText(tr("Unknown. Syncing Headers (%1, %2%)…").arg(bestHeaderHeight).arg(QString::number(100.0 / (bestHeaderHeight + est_headers_left) * bestHeaderHeight, 'f', 1)));
     169 | +    double pct = 100.0 * bestHeaderHeight / (bestHeaderHeight + est_headers_left);
     170 | +    // Truncate to one decimal place to avoid displaying 100.0% when headers are still missing
     171 | +    pct = std::floor(pct * 10.0) / 10.0;
     172 | +    ui->numberOfBlocksLeft->setText(tr("Unknown. Syncing Headers (%1, %2%)…").arg(bestHeaderHeight).arg(QString::number(pct, 'f', 1)));
    


    luke-jr commented at 6:54 PM on April 10, 2026:
        const int pct = bestHeaderHeight ? static_cast<int>(1000LL * bestHeaderHeight / (bestHeaderHeight + est_headers_left)) : 0;
        ui->numberOfBlocksLeft->setText(tr("Unknown. Syncing Headers (%1, %2%)…").arg(bestHeaderHeight).arg(QStringLiteral("%1.%2").arg(pct / 10).arg(pct % 10)));
    

    arejula27 commented at 5:35 PM on April 14, 2026:

    Good one, i guess it is more efficient as we do not work with floats, right?

  4. luke-jr referenced this in commit 823dccc962 on Apr 13, 2026
  5. gui: truncate header sync percentage to avoid showing 100% when headers are stale a3dac13371
  6. arejula27 force-pushed on Apr 14, 2026
  7. Sjors commented at 9:43 AM on May 8, 2026: member

    @hebasto can you add a bug label to this PR and other bug fixes? That makes it easier to track them (e.g. with RSS feed).

  8. sedited added the label Bug on May 11, 2026

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin-core/gui. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-05-18 05:20 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me