Fix race condition in mempool fee estimation during block reorg #34585

pull vishalharkal15 wants to merge 3 commits into bitcoin:master from vishalharkal15:fix-mempool-race-condition-34584 changing 3 files +136 −0
  1. vishalharkal15 commented at 6:22 pm on February 13, 2026: none

    Fixes #34584

    This commit addresses a critical race condition between mempool trimming (LimitMempoolSize) and transaction validation that could lead to stale UTXO cache usage and consensus divergence.

    Changes:

    • Add cache flush after LimitMempoolSize() in MaybeUpdateMempoolForReorg()
    • Reset m_view backend after CleanupTemporaryCoins() in single tx acceptance
    • Add explicit CleanupTemporaryCoins() after package mempool trimming
    • Ensure proper backend reset in CleanupTemporaryCoins() itself

    The fix ensures that after any mempool state change, the cached coin view is properly synchronized to prevent validation using stale data. This prevents false ‘mempool full’ rejections and maintains mempool consistency across nodes during chain reorganizations.

  2. DrahtBot commented at 6:22 pm on February 13, 2026: contributor

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

    Reviews

    See the guideline for information on the review process.

    Type Reviewers
    Concept NACK ismaelsadeeq, l0rinc, yuvicc

    If your review is incorrectly listed, please copy-paste <!–meta-tag:bot-skip–> into the comment that the bot should ignore.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #29700 (kernel, refactor: return error status on all fatal errors by ryanofsky)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  3. l0rinc changes_requested
  4. l0rinc commented at 6:30 pm on February 13, 2026: contributor
    You’re modifying validation code without any reproducers. Add a test to prove the problem so that if we revert the fix it fails for the right reasons, recreating the mentioned rejection. It also helps the reviewers debug the problem locally before and after the fix.
  5. Fix race condition in mempool fee estimation during block reorg
    Fixes #34584
    
    This commit addresses a critical race condition between mempool
    trimming (LimitMempoolSize) and transaction validation that could
    lead to stale UTXO cache usage and consensus divergence.
    
    Changes:
    - Add cache flush after LimitMempoolSize() in MaybeUpdateMempoolForReorg()
    - Reset m_view backend after CleanupTemporaryCoins() in single tx acceptance
    - Add explicit CleanupTemporaryCoins() after package mempool trimming
    - Ensure proper backend reset in CleanupTemporaryCoins() itself
    
    The fix ensures that after any mempool state change, the cached coin
    view is properly synchronized to prevent validation using stale data.
    This prevents false 'mempool full' rejections and maintains mempool
    consistency across nodes during chain reorganizations.
    dca622c12d
  6. vishalharkal15 force-pushed on Feb 13, 2026
  7. Add test case to reproduce mempool race condition during reorg
    This test specifically reproduces issue #34584 where a race condition
    occurs during block reorganization when:
    1. Transactions are re-added to mempool after a reorg
    2. Mempool size limiting evicts some transactions
    3. The cached UTXO view retains stale references
    
    The test verifies that subsequent transaction validation works correctly
    and doesn't access stale cache data. Without the fix in validation.cpp,
    this test would fail or cause assertions.
    
    This helps reviewers verify the bug exists and understand the fix.
    dbff2b5e77
  8. ismaelsadeeq commented at 11:15 pm on February 13, 2026: member

    NACK

    1. We do not even have a mempool fee estimation; this title of the PR is not correct and misleading.
    2. This issue is unclear, and after first pass, I don’t think we have such an issue.
    3. The reproducer does not work; the test passes on master.

    Thank you for wanting to contribute to this project, but this is not the right approach to this. If you post an issue, you might want to have a reliable reproducer before opening a PR.

    If you genuinely want to contribute, meaningfully check out https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md.

  9. DrahtBot added the label CI failed on Feb 14, 2026
  10. DrahtBot commented at 1:56 pm on February 14, 2026: contributor

    🚧 At least one of the CI tasks failed. Task lint: https://github.com/bitcoin/bitcoin/actions/runs/22000245145/job/63621831123 LLM reason (✨ experimental): Trailing whitespace detected by lint check, causing CI failure.

    Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:

    • Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.

    • A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.

    • An intermittent issue.

    Leave a comment here, if you need help tracking down a confusing failure.

  11. test: Fix linting errors in mempool_reorg_race_condition.py
    - Remove trailing whitespace from blank lines
    - Remove unused block_hash variable
    c7b5d66b0d
  12. vishalharkal15 requested review from l0rinc on Feb 14, 2026
  13. l0rinc commented at 7:19 pm on February 14, 2026: contributor
    pretty cool what LLMs can do NACK, the author obviously doesn’t understand the change
  14. yuvicc commented at 5:15 am on February 16, 2026: contributor

    Definitely a NACK, the CI fails as well.

    AI Slop has increased a lot.

  15. fanquake closed this on Feb 16, 2026


github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-02-17 06:13 UTC

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