Page MenuHomePhabricator

[avalanche] Protect finalized txs from eviction for low fee
ClosedPublic

Authored by Fabien on Jun 10 2025, 13:43.

Details

Reviewers
PiRK
Group Reviewers
Restricted Project
Commits
rABCaeb249698088: [avalanche] Protect finalized txs from eviction for low fee
Summary

When the mempool is full we start evicting the txs with the lowest fees. The finalized txs should never be removed that way to prevent from any status change.

Depends on D18234.

Test Plan
./test/functional/test_runner.py abc_p2p_avalanche_transaction_finalization

Diff Detail

Repository
rABC Bitcoin ABC
Branch
avalanche_preconsensus_dont_trim_finalized_txs
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 33598
Build 66675: Build Diffbuild-debug · lint-circular-dependencies · build-clang-tidy · build-without-wallet · build-clang · build-diff
Build 66674: arc lint + arc unit

Event Timeline

Fabien requested review of this revision.Jun 10 2025, 13:43
Fabien planned changes to this revision.Jun 10 2025, 13:45

Tail of the build log:

[398/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/logging.cpp.o
[399/584] Building CXX object src/CMakeFiles/server.dir/node/ui_interface.cpp.o
[400/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/coins.cpp.o
[401/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/setup_common.cpp.o
[402/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/mining.cpp.o
[403/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/transaction_utils.cpp.o
[404/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/txmempool.cpp.o
[405/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/str.cpp.o
[406/584] Building CXX object src/CMakeFiles/server.dir/txdb.cpp.o
[407/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/random.cpp.o
[408/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/wallet.cpp.o
[409/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/coincontrol.cpp.o
[410/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/context.cpp.o
[411/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/crypter.cpp.o
[412/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/coinselection.cpp.o
[413/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/db.cpp.o
[414/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/fees.cpp.o
[415/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/interfaces.cpp.o
[416/584] Building C object src/secp256k1/CMakeFiles/ecmult-bench.dir/src/bench_ecmult.c.o
[417/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/net.cpp.o
[418/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/load.cpp.o
[419/584] Linking C executable src/secp256k1/ecmult-bench
[420/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpcwallet.cpp.o
[421/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/backup.cpp.o
[422/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/encrypt.cpp.o
[423/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/signmessage.cpp.o
[424/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/salvage.cpp.o
[425/584] Building CXX object src/CMakeFiles/server.dir/rpc/mempool.cpp.o
[426/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/sqlite.cpp.o
[427/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/transaction.cpp.o
[428/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/wallet.cpp.o
[429/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletdb.cpp.o
[430/584] Building CXX object src/CMakeFiles/bitcoin-cli.dir/bitcoin-cli.cpp.o
[431/584] Building CXX object src/CMakeFiles/server.dir/txmempool.cpp.o
[432/584] Building CXX object src/CMakeFiles/server.dir/rpc/misc.cpp.o
[433/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/scriptpubkeyman.cpp.o
[434/584] Linking CXX executable src/bitcoin-cli
[435/584] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/dns.cpp.o
[436/584] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/db.cpp.o
[437/584] Building CXX object src/test/CMakeFiles/testutil.dir/util/validation.cpp.o
[438/584] Building CXX object src/iguana/CMakeFiles/iguana.dir/iguana.cpp.o
[439/584] Building CXX object src/iguana/CMakeFiles/iguana.dir/iguana_formatter.cpp.o
[440/584] Building CXX object src/iguana/CMakeFiles/iguana.dir/iguana_interpreter.cpp.o
[441/584] Linking CXX executable src/iguana/iguana
[442/584] Building CXX object src/wallet/CMakeFiles/wallet-tool.dir/wallettool.cpp.o
[443/584] Building CXX object src/CMakeFiles/server.dir/rpc/mining.cpp.o
[444/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/bdb.cpp.o
[445/584] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/options.cpp.o
[446/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletutil.cpp.o
[447/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/receive.cpp.o
[448/584] Building CXX object src/CMakeFiles/server.dir/rpc/avalanche.cpp.o
[449/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/util.cpp.o
[450/584] Building CXX object src/seeder/CMakeFiles/bitcoin-seeder.dir/main.cpp.o
[451/584] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/bitcoin.cpp.o
[452/584] Building CXX object src/wallet/CMakeFiles/wallet.dir/spend.cpp.o
[453/584] Linking CXX static library src/wallet/libwallet.a
[454/584] Building CXX object src/CMakeFiles/server.dir/rpc/blockchain.cpp.o
[455/584] Building CXX object src/CMakeFiles/server.dir/validation.cpp.o
ninja: build stopped: cannot make progress due to previous errors.
Build build-clang failed with exit code 1

Tail of the build log:

[397/582] Building CXX object src/CMakeFiles/bitcoin-tx.dir/bitcoin-tx.cpp.o
[398/582] Building CXX object src/CMakeFiles/bitcoind.dir/bitcoind.cpp.o
[399/582] Linking CXX executable src/bitcoin-tx
[400/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockindex.cpp.o
[401/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/coins.cpp.o
[402/582] Building CXX object src/CMakeFiles/server.dir/rpc/server_util.cpp.o
[403/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/logging.cpp.o
[404/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/str.cpp.o
[405/582] Building CXX object src/CMakeFiles/bitcoin-wallet.dir/bitcoin-wallet.cpp.o
[406/582] Building CXX object src/CMakeFiles/server.dir/wallet/init.cpp.o
[407/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/random.cpp.o
[408/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockfilter.cpp.o
[409/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/transaction_utils.cpp.o
[410/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/net.cpp.o
[411/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/bdb.cpp.o
[412/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/context.cpp.o
[413/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/mining.cpp.o
[414/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/coincontrol.cpp.o
[415/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/coinselection.cpp.o
[416/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/validation.cpp.o
[417/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/txmempool.cpp.o
[418/582] Building CXX object src/CMakeFiles/server.dir/txmempool.cpp.o
[419/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/db.cpp.o
[420/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/crypter.cpp.o
[421/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/setup_common.cpp.o
[422/582] Building CXX object src/CMakeFiles/server.dir/rpc/mining.cpp.o
[423/582] Building CXX object src/test/CMakeFiles/testutil.dir/util/wallet.cpp.o
[424/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/load.cpp.o
[425/582] Building CXX object src/CMakeFiles/server.dir/rpc/avalanche.cpp.o
[426/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/fees.cpp.o
[427/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/receive.cpp.o
[428/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/util.cpp.o
[429/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/signmessage.cpp.o
[430/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/encrypt.cpp.o
[431/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/salvage.cpp.o
[432/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/interfaces.cpp.o
[433/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/scriptpubkeyman.cpp.o
[434/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/sqlite.cpp.o
[435/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/backup.cpp.o
[436/582] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/dns.cpp.o
[437/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/transaction.cpp.o
[438/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpcwallet.cpp.o
[439/582] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/db.cpp.o
[440/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletutil.cpp.o
[441/582] Building CXX object src/iguana/CMakeFiles/iguana.dir/iguana_formatter.cpp.o
[442/582] Building CXX object src/iguana/CMakeFiles/iguana.dir/iguana_interpreter.cpp.o
[443/582] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/options.cpp.o
[444/582] Building CXX object src/iguana/CMakeFiles/iguana.dir/iguana.cpp.o
[445/582] Linking CXX executable src/iguana/iguana
[446/582] Building CXX object src/seeder/CMakeFiles/bitcoin-seeder.dir/main.cpp.o
[447/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/spend.cpp.o
[448/582] Building CXX object src/CMakeFiles/server.dir/rpc/blockchain.cpp.o
[449/582] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/bitcoin.cpp.o
[450/582] Building CXX object src/wallet/CMakeFiles/wallet-tool.dir/wallettool.cpp.o
[451/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletdb.cpp.o
[452/582] Building CXX object src/wallet/CMakeFiles/wallet.dir/wallet.cpp.o
[453/582] Linking CXX static library src/wallet/libwallet.a
[454/582] Building CXX object src/CMakeFiles/server.dir/validation.cpp.o
ninja: build stopped: cannot make progress due to previous errors.
Build build-clang-tidy failed with exit code 1

Failed tests logs:

====== Bitcoin ABC functional tests: abc_p2p_avalanche_cooldown.py ======

------- Stdout: -------
2025-06-10T14:03:50.237000Z TestFramework (INFO): Initializing test directory /work/abc-ci-builds/build-debug/test/tmp/test_runner_₿₵_🏃_20250610_140103_15043/abc_p2p_avalanche_cooldown_56
2025-06-10T14:03:54.653000Z TestFramework (INFO): First poll is legit
2025-06-10T14:03:54.708000Z TestFramework (INFO): Subsequent polls are spams for type {CInv().typemap[inv[1]]}
2025-06-10T14:03:54.860000Z TestFramework (INFO): Subsequent polls are spams for type {CInv().typemap[inv[1]]}
2025-06-10T14:03:55.012000Z TestFramework (INFO): Subsequent polls are spams for type {CInv().typemap[inv[1]]}
2025-06-10T14:03:55.164000Z TestFramework (INFO): Subsequent polls are spams for unknown type
2025-06-10T14:03:59.820000Z TestFramework (INFO): First poll is legit for type Block
2025-06-10T14:03:59.875000Z TestFramework (INFO): Subsequent polls are legit
2025-06-10T14:04:00.444000Z TestFramework (INFO): First poll is legit for type avalanche proof
2025-06-10T14:04:00.499000Z TestFramework (INFO): Subsequent polls are legit
2025-06-10T14:04:01.066000Z TestFramework (INFO): First poll is legit for type TX
2025-06-10T14:04:01.217000Z TestFramework (ERROR): Assertion failed
Traceback (most recent call last):
  File "/work/test/functional/test_framework/test_framework.py", line 152, in main
    self._run_test_internal()
  File "/work/test/functional/test_framework/test_framework.py", line 142, in _run_test_internal
    self.run_test()
  File "/work/test/functional/abc_p2p_avalanche_cooldown.py", line 139, in run_test
    check_poll(inv=inv, expect_response=True)
  File "/work/test/functional/abc_p2p_avalanche_cooldown.py", line 80, in check_poll
    response = poll_node.wait_for_avaresponse()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/avatools.py", line 239, in wait_for_avaresponse
    self.wait_until(lambda: len(self.avaresponses) > 0, timeout=timeout)
  File "/work/test/functional/test_framework/p2p.py", line 582, in wait_until
    wait_until_helper(
  File "/work/test/functional/test_framework/util.py", line 302, in wait_until_helper
    if predicate():
       ^^^^^^^^^^^
  File "/work/test/functional/test_framework/p2p.py", line 579, in test_function
    assert self.is_connected
AssertionError
2025-06-10T14:04:01.269000Z TestFramework (INFO): Stopping nodes
[node 0] Cleaning up leftover process
------- Stderr: -------
Traceback (most recent call last):
  File "/work/test/functional/abc_p2p_avalanche_cooldown.py", line 167, in <module>
    AvalancheCooldownTest().main()
  File "/work/test/functional/test_framework/test_framework.py", line 175, in main
    exit_code = self.shutdown()
                ^^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/test_framework.py", line 404, in shutdown
    self.stop_nodes()
  File "/work/test/functional/test_framework/test_framework.py", line 659, in stop_nodes
    node.stop_node(wait=wait, wait_until_stopped=False)
  File "/work/test/functional/test_framework/test_node.py", line 537, in stop_node
    self.stop(wait=wait)
  File "/work/test/functional/test_framework/coverage.py", line 46, in __call__
    return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/authproxy.py", line 146, in __call__
    response, status = self._request(
                       ^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/authproxy.py", line 114, in _request
    self.__conn.request(method, path, postdata, headers)
  File "/usr/lib/python3.11/http/client.py", line 1282, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1328, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1277, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1076, in _send_output
    self.send(chunk)
  File "/usr/lib/python3.11/http/client.py", line 998, in send
    self.sock.sendall(data)
BrokenPipeError: [Errno 32] Broken pipe
====== Bitcoin ABC functional tests: abc_p2p_avalanche_transaction_voting.py ======

------- Stdout: -------
2025-06-10T14:01:07.397000Z TestFramework (INFO): Initializing test directory /work/abc-ci-builds/build-debug/test/tmp/test_runner_₿₵_🏃_20250610_140103_15043/abc_p2p_avalanche_transaction_voting_4
2025-06-10T14:01:10.908000Z TestFramework (INFO): Check the votes are unknown while the quorum is not established
2025-06-10T14:01:10.917000Z TestFramework (INFO): Check the votes on valid mempool transactions
2025-06-10T14:01:13.654000Z TestFramework (ERROR): Assertion failed
Traceback (most recent call last):
  File "/work/test/functional/test_framework/test_framework.py", line 152, in main
    self._run_test_internal()
  File "/work/test/functional/test_framework/test_framework.py", line 142, in _run_test_internal
    self.run_test()
  File "/work/test/functional/abc_p2p_avalanche_transaction_voting.py", line 101, in run_test
    assert_response(
  File "/work/test/functional/test_framework/avatools.py", line 526, in assert_response
    response = poll_node.wait_for_avaresponse()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/avatools.py", line 239, in wait_for_avaresponse
    self.wait_until(lambda: len(self.avaresponses) > 0, timeout=timeout)
  File "/work/test/functional/test_framework/p2p.py", line 582, in wait_until
    wait_until_helper(
  File "/work/test/functional/test_framework/util.py", line 302, in wait_until_helper
    if predicate():
       ^^^^^^^^^^^
  File "/work/test/functional/test_framework/p2p.py", line 579, in test_function
    assert self.is_connected
AssertionError
2025-06-10T14:01:13.706000Z TestFramework (INFO): Stopping nodes
[node 0] Cleaning up leftover process
------- Stderr: -------
Traceback (most recent call last):
  File "/work/test/functional/abc_p2p_avalanche_transaction_voting.py", line 616, in <module>
    AvalancheTransactionVotingTest().main()
  File "/work/test/functional/test_framework/test_framework.py", line 175, in main
    exit_code = self.shutdown()
                ^^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/test_framework.py", line 404, in shutdown
    self.stop_nodes()
  File "/work/test/functional/test_framework/test_framework.py", line 659, in stop_nodes
    node.stop_node(wait=wait, wait_until_stopped=False)
  File "/work/test/functional/test_framework/test_node.py", line 537, in stop_node
    self.stop(wait=wait)
  File "/work/test/functional/test_framework/coverage.py", line 46, in __call__
    return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/authproxy.py", line 146, in __call__
    response, status = self._request(
                       ^^^^^^^^^^^^^^
  File "/work/test/functional/test_framework/authproxy.py", line 114, in _request
    self.__conn.request(method, path, postdata, headers)
  File "/usr/lib/python3.11/http/client.py", line 1282, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1328, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1277, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1076, in _send_output
    self.send(chunk)
  File "/usr/lib/python3.11/http/client.py", line 998, in send
    self.sock.sendall(data)
BrokenPipeError: [Errno 32] Broken pipe

Each failure log is accessible here:
Bitcoin ABC functional tests: abc_p2p_avalanche_cooldown.py
Bitcoin ABC functional tests: abc_p2p_avalanche_transaction_voting.py

Avoid a potentially invalid iterator when converting from reverse to forward

This revision is now accepted and ready to land.Jun 11 2025, 10:10