Mutant created against commit 37912ec.
+0 -1 · c
This mutant deletes the original lines without replacement.
This description is AI generated, mistakes can be made.
Intent: The announced-while-reconciling filter outlives its round. Its entries pile up for as long as the connection lasts, and they keep filtering announcements in every later round. The case for high is that a peer can keep it growing by announcing our snapshot txs mid-round, but that is limited to real relayed txs, so medium.
Behaviour change: Original: each round starts with an empty filter. Mutant: any wtxid ever removed from a snapshot (peer INV/TX during reconciliation, or mempool removal via RemoveFromSets) is filtered out of HandleReconcilDiff/HandleSketchExtension announcements in every later round. The set also grows without bound per peer.
Trigger: Responder: an inbound recon peer sends REQTXRCNCL. We send a sketch, the snapshot holds tx T, and the peer sends INV(T) (TryRemovingFromSet inserts T). The round ends. T is evicted and later re-accepted, e.g. via reorg or rebroadcast, and re-added to the set. In the next round T is dropped from the announcement and the peer never learns of it through reconciliation. Also, on a long-lived connection every tx the peer announces mid-round stays in memory.
Spec violation: Header comment: 'we just remember those transactions, and filter them out when we announce data from the snapshot' (per snapshot) and ClearLocalSetSnapshot: 'To be called once the reconciliation flow has completed.'
Severity if undetected: medium
Why tests miss it: rg m_announced_while_reconciling/RemoveFromSets/TryRemovingFromSet in src/test and test/functional; read RemoveFromSetsKeepsExtensionConsistentTest (removal happens only in the last round), responder mempool_removal/interleaved tests (single affected round)
Plausibility: This is one line in a five-line reset list, and the field is easy to see as transient. Nothing in the diff stands out.
Equivalence risk: A stale entry only changes announcements if the same wtxid comes back in a later round. The memory growth, though, shows up on any long connection where the peer announces mid-round.
Commands and environment reported by the submitter
cmake -B build -DBUILD_GUI=OFF -DWITH_ZMQ=OFF -DENABLE_IPC=OFF && cmake --build build -j$(nproc)ctest --test-dir build -j$(nproc) && build/test/functional/test_runner.py -j$(nproc) --failfastmutant-harness operator: deletion; location: TxReconciliationState::ClearLocalSetSnapshot lines 236-243
Imported from mutant-harness 474b4f7.
Commands are shown as text and never executed by MutantHub.
0 comments
No comments yet
Discuss equivalence, reproduction difficulties, or a test that kills this mutant.