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.
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.
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.
l0rinc changes_requested
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.
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
vishalharkal15 force-pushed
on Feb 13, 2026
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
ismaelsadeeq
commented at 11:15 pm on February 13, 2026:
member
NACK
We do not even have a mempool fee estimation; this title of the PR is not correct and misleading.
This issue is unclear, and after first pass, I don’t think we have such an issue.
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.
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.
test: Fix linting errors in mempool_reorg_race_condition.py
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