test `wallet_assumeutxo.py` / wallet_backup.py is failing intermittently: wallet.cpp:543 RestoreWallet Assertion `fs::is_empty(wallet_path)' failed. #34354

issue maflcko opened this issue on January 20, 2026
  1. maflcko commented at 3:07 PM on January 20, 2026: member

    ISTM that the Windows, ucrt, test cross-built CI failure is unrelated, a restore wallet test case related to pruned blockchain in wallet_assumeutxo.py is failing.

    <details open> <summary>From the logs:</summary>

    2026-01-20T13:41:07.2385503Z 2026-01-20T13:41:04.152353Z TestFramework (INFO): Ensuring wallet can't be restored from a backup that was created before the pruneheight (pruned node)
    2026-01-20T13:41:07.2386535Z 
    2026-01-20T13:41:07.2386839Z 2026-01-20T13:41:06.479889Z TestFramework (ERROR): Unexpected exception
    2026-01-20T13:41:07.2387306Z 
    2026-01-20T13:41:07.2387503Z Traceback (most recent call last):
    2026-01-20T13:41:07.2387815Z 
    2026-01-20T13:41:07.2388269Z   File "D:\a\bitcoin\bitcoin\test\functional\test_framework\util.py", line 166, in try_rpc
    2026-01-20T13:41:07.2388901Z 
    2026-01-20T13:41:07.2389049Z     fun(*args, **kwds)
    2026-01-20T13:41:07.2389318Z 
    2026-01-20T13:41:07.2389432Z     ~~~^^^^^^^^^^^^^^^
    2026-01-20T13:41:07.2389660Z 
    2026-01-20T13:41:07.2390180Z   File "D:\a\bitcoin\bitcoin\test\functional\test_framework\coverage.py", line 50, in __call__
    2026-01-20T13:41:07.2390808Z 
    2026-01-20T13:41:07.2391156Z     return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
    2026-01-20T13:41:07.2391651Z 
    2026-01-20T13:41:07.2392093Z   File "D:\a\bitcoin\bitcoin\test\functional\test_framework\authproxy.py", line 156, in __call__
    2026-01-20T13:41:07.2392771Z 
    2026-01-20T13:41:07.2392996Z     raise JSONRPCException(response['error'], status)
    2026-01-20T13:41:07.2393424Z 
    2026-01-20T13:41:07.2395532Z test_framework.authproxy.JSONRPCException: filesystem error: cannot remove: The process cannot access the file because it is being used by another process [D:\a\_temp\test_runner_₿_🏃_20260120_132914\wallet_assumeutxo_56\node3\regtest\w2\wallet.dat] (-1)
    2026-01-20T13:41:07.2397271Z 
    2026-01-20T13:41:07.2397277Z 
    2026-01-20T13:41:07.2397281Z 
    2026-01-20T13:41:07.2397613Z During handling of the above exception, another exception occurred:
    2026-01-20T13:41:07.2398102Z 
    2026-01-20T13:41:07.2398107Z 
    2026-01-20T13:41:07.2398112Z 
    2026-01-20T13:41:07.2398334Z Traceback (most recent call last):
    2026-01-20T13:41:07.2398622Z 
    2026-01-20T13:41:07.2399135Z   File "D:\a\bitcoin\bitcoin\test\functional\test_framework\test_framework.py", line 142, in main
    2026-01-20T13:41:07.2399796Z 
    2026-01-20T13:41:07.2399922Z     self.run_test()
    2026-01-20T13:41:07.2400161Z 
    2026-01-20T13:41:07.2400286Z     ~~~~~~~~~~~~~^^
    2026-01-20T13:41:07.2400474Z 
    2026-01-20T13:41:07.2400948Z   File "D:\a\bitcoin\bitcoin/test/functional/wallet_assumeutxo.py", line 267, in run_test
    2026-01-20T13:41:07.2401587Z 
    2026-01-20T13:41:07.2401827Z     self.test_restore_wallet_pruneheight(n3)
    2026-01-20T13:41:07.2402338Z 
    2026-01-20T13:41:07.2402476Z     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^
    2026-01-20T13:41:07.2402806Z 
    2026-01-20T13:41:07.2403384Z   File "D:\a\bitcoin\bitcoin/test/functional/wallet_assumeutxo.py", line 99, in test_restore_wallet_pruneheight
    2026-01-20T13:41:07.2404151Z 
    2026-01-20T13:41:07.2404691Z     assert_raises_rpc_error(-4, error_message, n3.restorewallet, "w2", "backup_w2.dat")
    2026-01-20T13:41:07.2405294Z 
    2026-01-20T13:41:07.2405553Z     ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    2026-01-20T13:41:07.2405970Z 
    2026-01-20T13:41:07.2406496Z   File "D:\a\bitcoin\bitcoin\test\functional\test_framework\util.py", line 157, in assert_raises_rpc_error
    2026-01-20T13:41:07.2407238Z 
    2026-01-20T13:41:07.2407544Z     assert try_rpc(code, message, fun, *args, **kwds), "No exception raised"
    2026-01-20T13:41:07.2408097Z 
    2026-01-20T13:41:07.2408261Z            ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    2026-01-20T13:41:07.2408598Z 
    2026-01-20T13:41:07.2409048Z   File "D:\a\bitcoin\bitcoin\test\functional\test_framework\util.py", line 170, in try_rpc
    2026-01-20T13:41:07.2409645Z 
    2026-01-20T13:41:07.2410041Z     raise AssertionError("Unexpected JSONRPC error code %i" % e.error["code"])
    2026-01-20T13:41:07.2410583Z 
    2026-01-20T13:41:07.2410797Z AssertionError: Unexpected JSONRPC error code -1
    2026-01-20T13:41:07.2411215Z 
    2026-01-20T13:41:07.2411925Z 2026-01-20T13:41:06.484138Z TestFramework (INFO): Not stopping nodes as test failed. The dangling processes will be cleaned up later.
    2026-01-20T13:41:07.2412795Z 
    2026-01-20T13:41:07.2413676Z 2026-01-20T13:41:06.484270Z TestFramework (WARNING): Not cleaning up dir D:\a\_temp\test_runner_₿_🏃_20260120_132914\wallet_assumeutxo_56
    2026-01-20T13:41:07.2414525Z 
    2026-01-20T13:41:07.2415646Z 2026-01-20T13:41:06.484375Z TestFramework (ERROR): Test failed. Test logging available at D:\a\_temp\test_runner_₿_🏃_20260120_132914\wallet_assumeutxo_56/test_framework.log
    2026-01-20T13:41:07.2416737Z 
    
    2026-01-20T13:42:33.3464929Z wallet_assumeutxo.py                                                             | ✖ Failed  | 8 s
    2026-01-20T13:42:33.3465209Z 
    2026-01-20T13:42:33.3465460Z ALL                                                                              | ✖ Failed  | 2893 s (accumulated) 
    2026-01-20T13:42:33.3465784Z Runtime: 796 s
    
    

    </details>

    Originally posted by @rkrux in #33014 (comment)

  2. maflcko added the label Wallet on Jan 20, 2026
  3. maflcko added the label Windows on Jan 20, 2026
  4. maflcko added the label Tests on Jan 20, 2026
  5. maflcko added the label CI failed on Jan 20, 2026
  6. sedited referenced this in commit 5715748333 on Jan 21, 2026
  7. fjahr commented at 8:47 AM on January 22, 2026: contributor

    I proposed a fix here: #34377

  8. sedited closed this on Jan 22, 2026

  9. Fabcien referenced this in commit 691dc830c6 on Jan 22, 2026
  10. maflcko commented at 12:43 PM on January 23, 2026: member

    https://github.com/bitcoin/bitcoin/actions/runs/21285353740/job/61266529251?pr=34388#step:12:276:

    398/451 - wallet_assumeutxo.py failed, Duration: 8 s
    
    stdout:
    2026-01-23T12:31:24.007821Z TestFramework (INFO): PRNG seed is: 249974898428252399
    
    2026-01-23T12:31:24.037053Z TestFramework (INFO): Initializing test directory D:\a\_temp\test_runner_₿_🏃_20260123_122001\wallet_assumeutxo_56
    
    2026-01-23T12:31:25.327870Z TestFramework (INFO): -- Testing assumeutxo
    
    2026-01-23T12:31:25.328814Z TestFramework (INFO): Creating a UTXO snapshot at height 299
    
    2026-01-23T12:31:26.836907Z TestFramework (INFO): Loading snapshot into second node from D:\a\_temp\test_runner_₿_🏃_20260123_122001\wallet_assumeutxo_56\node0\regtest\utxos.dat
    
    2026-01-23T12:31:26.851777Z TestFramework (INFO): Backup from the snapshot height can be loaded during background sync
    
    2026-01-23T12:31:26.859014Z TestFramework (INFO): Backup from before the snapshot height can't be loaded during background sync
    
    2026-01-23T12:31:26.865502Z TestFramework (INFO): Backup from the snapshot height can be loaded during background sync (pruned node)
    
    2026-01-23T12:31:26.891211Z TestFramework (INFO): Backup from before the snapshot height can't be loaded during background sync (pruned node)
    
    2026-01-23T12:31:26.897530Z TestFramework (INFO): Test loading descriptors during background sync
    
    2026-01-23T12:31:26.919150Z TestFramework (INFO): Test that rescanning blocks from before the snapshot fails when blocks are not available from the background sync yet
    
    2026-01-23T12:31:26.919801Z TestFramework (INFO): Restarting node to stop at height 359
    
    2026-01-23T12:31:27.580649Z TestFramework (INFO): Restarted node before snapshot validation completed, reloading...
    
    2026-01-23T12:31:28.106292Z TestFramework (INFO): Ensuring wallet can be restored from a backup that was created before the snapshot height
    
    2026-01-23T12:31:28.164076Z TestFramework (INFO): Check balance of a wallet that is active during snapshot completion
    
    2026-01-23T12:31:29.773917Z TestFramework (INFO): Ensuring descriptors can be loaded after background sync
    
    2026-01-23T12:31:29.817454Z TestFramework (INFO): Ensuring wallet can't be restored from a backup that was created before the pruneheight (pruned node)
    
    2026-01-23T12:31:31.955307Z TestFramework (ERROR): Unexpected exception
    
    Traceback (most recent call last):
    
      File "D:\a\bitcoin\bitcoin\test\functional\test_framework\util.py", line 166, in try_rpc
    
        fun(*args, **kwds)
    
        ~~~^^^^^^^^^^^^^^^
    
      File "D:\a\bitcoin\bitcoin\test\functional\test_framework\coverage.py", line 50, in __call__
    
        return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
    
      File "D:\a\bitcoin\bitcoin\test\functional\test_framework\authproxy.py", line 156, in __call__
    
        raise JSONRPCException(response['error'], status)
    
    test_framework.authproxy.JSONRPCException: filesystem error: cannot remove: The process cannot access the file because it is being used by another process [D:\a\_temp\test_runner_₿_🏃_20260123_122001\wallet_assumeutxo_56\node3\regtest\w2_pruneheight\wallet.dat] (-1)
    
    
    
    During handling of the above exception, another exception occurred:
    
    
    
    Traceback (most recent call last):
    
      File "D:\a\bitcoin\bitcoin\test\functional\test_framework\test_framework.py", line 142, in main
    
        self.run_test()
    
        ~~~~~~~~~~~~~^^
    
      File "D:\a\bitcoin\bitcoin/test/functional/wallet_assumeutxo.py", line 267, in run_test
    
        self.test_restore_wallet_pruneheight(n3)
    
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^
    
      File "D:\a\bitcoin\bitcoin/test/functional/wallet_assumeutxo.py", line 99, in test_restore_wallet_pruneheight
    
        assert_raises_rpc_error(-4, error_message, n3.restorewallet, "w2_pruneheight", "backup_w2.dat")
    
        ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
      File "D:\a\bitcoin\bitcoin\test\functional\test_framework\util.py", line 157, in assert_raises_rpc_error
    
        assert try_rpc(code, message, fun, *args, **kwds), "No exception raised"
    
               ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
      File "D:\a\bitcoin\bitcoin\test\functional\test_framework\util.py", line 170, in try_rpc
    
        raise AssertionError(
    
            "Expected substring not found in error message:\nsubstring: '{}'\nerror message: '{}'.".format(
    
                message, e.error['message']))
    
    AssertionError: Expected substring not found in error message:
    
    substring: 'Wallet loading failed. Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of a pruned node)'
    
    error message: 'filesystem error: cannot remove: The process cannot access the file because it is being used by another process [D:\a\_temp\test_runner_₿_🏃_20260123_122001\wallet_assumeutxo_56\node3\regtest\w2_pruneheight\wallet.dat]'.
    
    2026-01-23T12:31:32.009883Z TestFramework (INFO): Not stopping nodes as test failed. The dangling processes will be cleaned up later.
    
    2026-01-23T12:31:32.010026Z TestFramework (WARNING): Not cleaning up dir D:\a\_temp\test_runner_₿_🏃_20260123_122001\wallet_assumeutxo_56
    
    2026-01-23T12:31:32.010132Z TestFramework (ERROR): Test failed. Test logging available at D:\a\_temp\test_runner_₿_🏃_20260123_122001\wallet_assumeutxo_56/test_framework.log
    
    2026-01-23T12:31:32.010359Z TestFramework (ERROR): 
    
    2026-01-23T12:31:32.010667Z TestFramework (ERROR): Hint: Call D:\a\bitcoin\bitcoin\test\functional\combine_logs.py 'D:\a\_temp\test_runner_₿_🏃_20260123_122001\wallet_assumeutxo_56' to consolidate all logs
    
    2026-01-23T12:31:32.010799Z TestFramework (ERROR): 
    
    2026-01-23T12:31:32.010875Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log.
    
    2026-01-23T12:31:32.010978Z TestFramework (ERROR): https://github.com/bitcoin/bitcoin/issues
    
    2026-01-23T12:31:32.011060Z TestFramework (ERROR): 
    
    
    
    stderr:
    [node 3] Cleaning up leftover process
    
    [node 2] Cleaning up leftover process
    
    [node 1] Cleaning up leftover process
    
    [node 0] Cleaning up leftover process
    
    
    
    Combine the logs and print the last 99999999 lines ...
    
    ============
    Combined log for D:\a\_temp/test_runner_₿_🏃_20260123_122001/wallet_assumeutxo_56:
    ============
    
  11. maflcko reopened this on Jan 23, 2026

  12. fjahr commented at 12:57 PM on January 23, 2026: contributor

    Seems like the problem is rather internal to the restorewallet, probably better if someone with who has a windows enviroment can try to reproduce it, I would need to set it up first...

  13. Sjors commented at 1:41 PM on January 30, 2026: member

    I ran this test a couple of times on a windows machine, but couldn't reproduce. I'll let it run in a loop for a while.... Update: still no failure after 400+ runs.

    Maybe there's some changes I can make to increase the likeliness of failure?

  14. Sjors commented at 3:31 PM on January 30, 2026: member

    The following (vibe coded) patch seems to reliably reproduce the issue on my Windows machine:

    diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp
    index e72455a3be..c23268d30a 100644
    --- a/src/wallet/sqlite.cpp
    +++ b/src/wallet/sqlite.cpp
    @@ -20,0 +21,5 @@
    +#ifdef WIN32
    +#include <windows.h>
    +#include <thread>
    +#endif
    +
    @@ -376,0 +382,23 @@ void SQLiteDatabase::Close()
    +
    +#ifdef WIN32
    +    // TEST: Immediately after closing SQLite, grab an exclusive lock on the file.
    +    // This simulates Windows not releasing the file handle immediately after sqlite3_close().
    +    // The lock is held for 200ms, causing fs::remove() to fail if called too soon.
    +    std::wstring full_path_w = (m_dir_path / fs::PathFromString(m_file_path)).wstring();
    +    HANDLE hFile = CreateFileW(
    +        full_path_w.c_str(),
    +        GENERIC_READ | GENERIC_WRITE,
    +        0,  // No sharing - exclusive access
    +        NULL,
    +        OPEN_EXISTING,
    +        FILE_ATTRIBUTE_NORMAL,
    +        NULL
    +    );
    +    if (hFile != INVALID_HANDLE_VALUE) {
    +        // Detach a thread to hold the lock, so Close() returns immediately
    +        std::thread([hFile]() {
    +            std::this_thread::sleep_for(std::chrono::milliseconds(200));
    +            CloseHandle(hFile);
    +        }).detach();
    +    }
    +#endif
    
  15. Sjors commented at 3:50 PM on January 30, 2026: member

    And here's a trivial albeit not elegant fix:

    diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
    index 64d7f191de..ba3c1d4c75 100644
    --- a/src/wallet/wallet.cpp
    +++ b/src/wallet/wallet.cpp
    @@ -538 +538,7 @@ std::shared_ptr<CWallet> RestoreWallet(WalletContext& context, const fs::path& b
    -        if (wallet_file_copied) fs::remove(wallet_file);
    +        if (wallet_file_copied) {
    +            // On Windows, and e.g. on network file systems for all platforms,
    +            // file handles may not be released immediately after closing, so
    +            // wait briefly before attempting removal.
    +            std::this_thread::sleep_for(std::chrono::seconds(1));
    +            fs::remove(wallet_file);
    +        }
    
  16. maflcko removed the label Windows on Feb 12, 2026
  17. maflcko removed the label Tests on Feb 12, 2026
  18. maflcko added this to the milestone 31.0 on Feb 12, 2026
  19. maflcko renamed this:
    Windows CI failure: restore wallet test case related to pruned blockchain in `wallet_assumeutxo.py` is failing.
    test `wallet_assumeutxo.py` is failing intermittently: wallet.cpp:543 RestoreWallet Assertion `fs::is_empty(wallet_path)' failed.
    on Feb 12, 2026
  20. maflcko commented at 3:06 PM on February 12, 2026: member

    The same error happens on Linux, hitting an internal assert:

     node3 stderr wallet/wallet.cpp:543 std::shared_ptr<CWallet> wallet::RestoreWallet(WalletContext &, const fs::path &, const std::string &, std::optional<bool>, DatabaseStatus &, bilingual_str &, std::vector<bilingual_str> &, bool, bool): Assertion `fs::is_empty(wallet_path)' failed. 
    

    To reproduce, saturate all CPU threads of the machine at 100%, then run cmd to reproduce:

    while ./bld-cmake/test/functional/wallet_assumeutxo.py ; do true ; done
    
     test  2026-02-12T15:02:36.624276Z TestFramework (ERROR): Unexpected exception 
                                       Traceback (most recent call last):
                                         File "/b-c/test/functional/test_framework/util.py", line 166, in try_rpc
                                           fun(*args, **kwds)
                                           ~~~^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/coverage.py", line 50, in __call__
                                           return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
                                         File "/b-c/test/functional/test_framework/authproxy.py", line 137, in __call__
                                           response, status = self._request('POST', self.__url.path, postdata.encode('utf-8'))
                                                              ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/authproxy.py", line 111, in _request
                                           return self._get_response()
                                                  ~~~~~~~~~~~~~~~~~~^^
                                         File "/b-c/test/functional/test_framework/authproxy.py", line 174, in _get_response
                                           http_response = self.__conn.getresponse()
                                         File "/usr/lib/python3.13/http/client.py", line 1450, in getresponse
                                           response.begin()
                                           ~~~~~~~~~~~~~~^^
                                         File "/usr/lib/python3.13/http/client.py", line 336, in begin
                                           version, status, reason = self._read_status()
                                                                     ~~~~~~~~~~~~~~~~~^^
                                         File "/usr/lib/python3.13/http/client.py", line 305, in _read_status
                                           raise RemoteDisconnected("Remote end closed connection without"
                                                                    " response")
                                       http.client.RemoteDisconnected: Remote end closed connection without response
                                       During handling of the above exception, another exception occurred:
                                       Traceback (most recent call last):
                                         File "/b-c/test/functional/test_framework/test_framework.py", line 142, in main
                                           self.run_test()
                                           ~~~~~~~~~~~~~^^
                                         File "/b-c/./bld-cmake/test/functional/wallet_assumeutxo.py", line 267, in run_test
                                           self.test_restore_wallet_pruneheight(n3)
                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^
                                         File "/b-c/./bld-cmake/test/functional/wallet_assumeutxo.py", line 99, in test_restore_wallet_pruneheight
                                           assert_raises_rpc_error(-4, error_message, n3.restorewallet, "w2_pruneheight", "backup_w2.dat")
                                           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/util.py", line 157, in assert_raises_rpc_error
                                           assert try_rpc(code, message, fun, *args, **kwds), "No exception raised"
                                                  ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/util.py", line 177, in try_rpc
                                           raise AssertionError("Unexpected exception raised: " + type(e).__name__)
                                       AssertionError: Unexpected exception raised: RemoteDisconnected
     test  2026-02-12T15:02:36.638897Z TestFramework (DEBUG): Closing down network thread 
     test  2026-02-12T15:02:36.689925Z TestFramework (INFO): Not stopping nodes as test failed. The dangling processes will be cleaned up later. 
     test  2026-02-12T15:02:36.690597Z TestFramework (WARNING): Not cleaning up dir /tmp/bitcoin_func_test_noubmcc_ 
     test  2026-02-12T15:02:36.690935Z TestFramework (ERROR): Test failed. Test logging available at /tmp/bitcoin_func_test_noubmcc_/test_framework.log 
     test  2026-02-12T15:02:36.691366Z TestFramework (ERROR): 
     test  2026-02-12T15:02:36.691757Z TestFramework (ERROR): Hint: Call /b-c/test/functional/combine_logs.py '/tmp/bitcoin_func_test_noubmcc_' to consolidate all logs 
     test  2026-02-12T15:02:36.691961Z TestFramework (ERROR): 
     test  2026-02-12T15:02:36.692121Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log. 
     test  2026-02-12T15:02:36.692375Z TestFramework (ERROR): https://github.com/bitcoin/bitcoin/issues 
     test  2026-02-12T15:02:36.692613Z TestFramework (ERROR): 
    
     node3 stderr wallet/wallet.cpp:543 std::shared_ptr<CWallet> wallet::RestoreWallet(WalletContext &, const fs::path &, const std::string &, std::optional<bool>, DatabaseStatus &, bilingual_str &, std::vector<bilingual_str> &, bool, bool): Assertion `fs::is_empty(wallet_path)' failed. 
    
  21. maflcko added the label Bug on Feb 12, 2026
  22. maflcko commented at 7:44 PM on February 12, 2026: member

    Not sure if this diff helps to reproduce it faster:

    diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
    index c7be6ab..aacb7b6 100644
    --- a/src/validationinterface.cpp
    +++ b/src/validationinterface.cpp
    @@ -14,2 +14,3 @@
     #include <primitives/transaction.h>
    +#include <random.h>
     #include <util/check.h>
    @@ -156,2 +157,4 @@ void ValidationSignals::SyncWithValidationInterfaceQueue()
     
    +static FastRandomContext g_rnd{};
    +
     // Use a macro instead of a function for conditional logging to prevent
    @@ -166,2 +169,3 @@ void ValidationSignals::SyncWithValidationInterfaceQueue()
                 LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
    +            if(g_rnd.randrange(2)<1)UninterruptibleSleep(15ms);\
                 event();                                           \
    
  23. fjahr commented at 9:47 PM on February 12, 2026: contributor

    To reproduce, saturate all CPU threads of the machine at 100%

    Oh, do you think that is what is actually happening in the CI? Then I guess every check we have that asserts that a file was deleted could run into this issue if the circumstances are right?

  24. maflcko commented at 9:57 PM on February 12, 2026: member

    Oh, do you think that is what is actually happening in the CI? Then I guess every check we have that asserts that a file was deleted could run into this issue if the circumstances are right?

    The assume that fails is in the line before the remove, so I think there is a logic error somewhere

  25. maflcko renamed this:
    test `wallet_assumeutxo.py` is failing intermittently: wallet.cpp:543 RestoreWallet Assertion `fs::is_empty(wallet_path)' failed.
    test `wallet_assumeutxo.py` / wallet_backup.py is failing intermittently: wallet.cpp:543 RestoreWallet Assertion `fs::is_empty(wallet_path)' failed.
    on Feb 17, 2026
  26. maflcko commented at 9:15 PM on February 17, 2026: member

    Same for wallet_backup.py:

     node3 2026-02-17T20:40:22.128215Z [scheduler] [wallet/wallet.h:943] [WalletLogPrintf] [restore_pruned] Releasing wallet restore_pruned.. 
     test  2026-02-17T20:40:22.340793Z TestFramework (ERROR): Unexpected exception 
                                       Traceback (most recent call last):
                                         File "/b-c/test/functional/test_framework/util.py", line 166, in try_rpc
                                           fun(*args, **kwds)
                                           ~~~^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/coverage.py", line 50, in __call__
                                           return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
                                         File "/b-c/test/functional/test_framework/authproxy.py", line 137, in __call__
                                           response, status = self._request('POST', self.__url.path, postdata.encode('utf-8'))
                                                              ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/authproxy.py", line 111, in _request
                                           return self._get_response()
                                                  ~~~~~~~~~~~~~~~~~~^^
                                         File "/b-c/test/functional/test_framework/authproxy.py", line 174, in _get_response
                                           http_response = self.__conn.getresponse()
                                         File "/usr/lib/python3.13/http/client.py", line 1450, in getresponse
                                           response.begin()
                                           ~~~~~~~~~~~~~~^^
                                         File "/usr/lib/python3.13/http/client.py", line 336, in begin
                                           version, status, reason = self._read_status()
                                                                     ~~~~~~~~~~~~~~~~~^^
                                         File "/usr/lib/python3.13/http/client.py", line 305, in _read_status
                                           raise RemoteDisconnected("Remote end closed connection without"
                                                                    " response")
                                       http.client.RemoteDisconnected: Remote end closed connection without response
                                       During handling of the above exception, another exception occurred:
                                       Traceback (most recent call last):
                                         File "/b-c/test/functional/test_framework/test_framework.py", line 142, in main
                                           self.run_test()
                                           ~~~~~~~~~~~~~^^
                                         File "/b-c/bld-cmake/test/functional/wallet_backup.py", line 292, in run_test
                                           self.test_pruned_wallet_backup()
                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
                                         File "/b-c/bld-cmake/test/functional/wallet_backup.py", line 212, in test_pruned_wallet_backup
                                           assert_raises_rpc_error(-4, error_message, node.restorewallet, "restore_pruned", backup_file)
                                           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/util.py", line 157, in assert_raises_rpc_error
                                           assert try_rpc(code, message, fun, *args, **kwds), "No exception raised"
                                                  ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         File "/b-c/test/functional/test_framework/util.py", line 177, in try_rpc
                                           raise AssertionError("Unexpected exception raised: " + type(e).__name__)
                                       AssertionError: Unexpected exception raised: RemoteDisconnected
     test  2026-02-17T20:40:22.344578Z TestFramework (DEBUG): Closing down network thread 
     test  2026-02-17T20:40:22.394821Z TestFramework (INFO): Not stopping nodes as test failed. The dangling processes will be cleaned up later. 
     test  2026-02-17T20:40:22.394967Z TestFramework (WARNING): Not cleaning up dir /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262 
     test  2026-02-17T20:40:22.395048Z TestFramework (ERROR): Test failed. Test logging available at /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262/test_framework.log 
     test  2026-02-17T20:40:22.395168Z TestFramework (ERROR): 
     test  2026-02-17T20:40:22.395280Z TestFramework (ERROR): Hint: Call /b-c/test/functional/combine_logs.py '/tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262' to consolidate all logs 
     test  2026-02-17T20:40:22.395334Z TestFramework (ERROR): 
     test  2026-02-17T20:40:22.395375Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log. 
     test  2026-02-17T20:40:22.395443Z TestFramework (ERROR): https://github.com/bitcoin/bitcoin/issues 
     test  2026-02-17T20:40:22.395497Z TestFramework (ERROR): 
    
     node3 stderr wallet/wallet.cpp:543 std::shared_ptr<CWallet> wallet::RestoreWallet(WalletContext &, const fs::path &, const std::string &, std::optional<bool>, DatabaseStatus &, bilingual_str &, std::vector<bilingual_str> &, bool, bool): Assertion `fs::is_empty(wallet_path)' failed. 
    
  27. achow101 commented at 7:49 PM on February 18, 2026: member

    There seem to be 2 different issues reported here.

    The first is filesystem error: cannot remove: The process cannot access the file because it is being used by another process which suggests that the wallet.dat file is still open by sqlite.

    The second is Assertion fs::is_empty(wallet_path)' failed. which is probably caused by wallet.dat-journal still existing.

    I have a theoretical fix for the second issue. I don't have one for the first.

  28. maflcko commented at 8:31 PM on February 18, 2026: member

    Nice. A fix for the second issue would be helpful, and I am happy to test it, since I can reproduce it relatively easily. edit: And sorry for mixing the two unrelated issues. I'll open a new issue for the remaining issue, as soon as one is fixed.

    I wonder why Antithesis has not yet found this. 🤔 cc @dergoegge

  29. maflcko commented at 6:51 PM on February 19, 2026: member

    Not sure if #34619 is going to fix this issue. If the journal was zero'd, the size should be small, but I don't see such small files after the test failure:

    # find '/tmp/test_runner_\342\202\277_\360\237\217\203_20260219_175359/wallet_assumeutxo_8651' \
      -type f -name 'wallet.dat-journal' -exec wc -c {} +
     25136 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node0/regtest/w/wallet.dat-journal
     25136 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node0/regtest/w2/wallet.dat-journal
     25136 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node1/regtest/w/wallet.dat-journal
     12824 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node1/regtest/w1/wallet.dat-journal
     25136 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node1/regtest/w2/wallet.dat-journal
     25136 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node2/regtest/w/wallet.dat-journal
     25136 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node3/regtest/w/wallet.dat-journal
     12824 /tmp/test_runner_₿_🏃_20260219_175359/wallet_assumeutxo_8651/node3/regtest/w2_pruneheight/wallet.dat-journal
    

    See https://drahtbot.space/temp_scratch/wallet_assumeutxo_8651.tar.zstd

    And:

    # find $'/tmp/test_runner_\342\202\277_\360\237\217\203_20260217_203305' \
      -type f -name 'wallet.dat-journal' -exec wc -c {} +
     25136 /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262/node0/regtest/wallets/default_wallet/wallet.dat-journal
     25136 /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262/node1/regtest/wallets/default_wallet/wallet.dat-journal
     25136 /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262/node2/regtest/wallets/default_wallet/wallet.dat-journal
     29240 /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262/node3/regtest/wallets/default_wallet/wallet.dat-journal
     29240 /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262/node3/regtest/wallets/pruned/wallet.dat-journal
     21032 /tmp/test_runner_₿_🏃_20260217_203305/wallet_backup_262/node3/regtest/wallets/restore_pruned/wallet.dat-journal
    
    

    https://drahtbot.space/temp_scratch/wallet_backup_262.tar.zstd

  30. achow101 commented at 7:25 PM on February 19, 2026: member

    If the journal was zero'd, the size should be small, but I don't see such small files after the test failure:

    SQLite doesn't always truncate or delete the journal file. It may only overwrite the header with 0's to invalidate the file. I believe it does this when the file is larger than the disk sector size. #34619 does handle that case though.

    Edit: Looking at the files provided, the journal files all have 0'd headers

  31. maflcko commented at 10:16 PM on February 19, 2026: member

    It is a bit odd, that it is only me that can reproduce this. Does this diff work to reproduce?

    diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
    index c7be6abc3a..aacb7b6563 100644
    --- a/src/validationinterface.cpp
    +++ b/src/validationinterface.cpp
    @@ -14,2 +14,3 @@
     #include <primitives/transaction.h>
    +#include <random.h>
     #include <util/check.h>
    @@ -156,2 +157,4 @@ void ValidationSignals::SyncWithValidationInterfaceQueue()
     
    +static FastRandomContext g_rnd{};
    +
     // Use a macro instead of a function for conditional logging to prevent
    @@ -166,2 +169,3 @@ void ValidationSignals::SyncWithValidationInterfaceQueue()
                 LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
    +            if(g_rnd.randrange(2)<1)UninterruptibleSleep(15ms);\
                 event();                                           \
    diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
    index 63dab29972..21629dd546 100644
    --- a/src/wallet/wallet.cpp
    +++ b/src/wallet/wallet.cpp
    @@ -74,2 +74,3 @@
     #include <algorithm>
    +#include <atomic>
     #include <cassert>
    @@ -77,2 +78,3 @@
     #include <exception>
    +#include <mutex>
     #include <optional>
    @@ -83,2 +85,7 @@
     
    +std::atomic<bool> g_debug_waiting{false};
    +std::atomic<bool> g_debug_continue{false};
    +std::mutex g_debug_mutex;
    +std::condition_variable g_debug_cv;
    +
     struct KeyOriginInfo;
    @@ -542,2 +549,3 @@ std::shared_ptr<CWallet> RestoreWallet(WalletContext& context, const fs::path& b
             if (created_parent_dir) {
    +        UninterruptibleSleep(1ms);
                 Assume(fs::is_empty(wallet_path));
    @@ -1530,2 +1538,7 @@ void CWallet::blockConnected(const ChainstateRole& role, const interfaces::Block
         }
    +    UninterruptibleSleep(20ms);
    +    if (g_debug_waiting) {
    +        g_debug_continue = true;
    +        g_debug_cv.notify_all();
    +    }
         assert(block.data);
    @@ -3199,2 +3212,10 @@ bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interf
     
    +    {
    +        g_debug_continue = false;
    +        g_debug_waiting = true;
    +        std::unique_lock<std::mutex> lock(g_debug_mutex);
    +        g_debug_cv.wait_for(lock, std::chrono::seconds(2), [] { return g_debug_continue.load(); });
    +        g_debug_waiting = false;
    +    }
    +
         // If rescan_required = true, rescan_height remains equal to 0
    

    With that patch, I can reproduce the crash, even with #34619

  32. achow101 commented at 12:34 AM on February 20, 2026: member

    Does this diff work to reproduce?

    Only for wallet_assumeutxo.py.

    I see what the problem is now. There is a race condition where the blocks that were generated and subsequently pruned are still in the validation interface queue, so when the wallet is being loaded for the restore, there are blockConnected signals that the wallet starts processing after AttachChain exits with the error about being pruned. Since AttachChain errors, we are expecting the wallet to be immediately destroyed once LoadExisting exits as the wallet shared_ptr goes out of scope. However, if it is still processing blockConnecteds slowly, the shared_ptr still exists so the database is still open, so we get both the windows issue (the database file is still open) and the assertion (the journal file hasn't been deleted as the database has not been closed).

    Adding a n3.syncwithvalidationinterfacequeue after self.generate fixes the issue in the test, but the race is still actually there and that needs to be fixed.

    Also I guess linux just lets us delete a file that is still open?

    The wallet_backup.py failure may be related to this, but the diff does not cause that to fail for me. However, it is a similar failure scenario in restoring a backup to a pruned node, right after a bunch of blocks were generated. Edit: It fails if I increase the number of generated blocks. Likewise it is fixed with a `syncwithvalidationinterfacequeue()', so I believe it's the same problem.

  33. maflcko commented at 3:53 PM on February 20, 2026: member

    For reference, the diff for wallet_backup would be:

    diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
    index 63dab29..1bcf597 100644
    --- a/src/wallet/wallet.cpp
    +++ b/src/wallet/wallet.cpp
    @@ -74,2 +74,3 @@
     #include <algorithm>
    +#include <atomic>
     #include <cassert>
    @@ -77,2 +78,3 @@
     #include <exception>
    +#include <mutex>
     #include <optional>
    @@ -83,2 +85,7 @@
     
    +std::atomic<bool> g_debug_waiting{false};
    +std::atomic<bool> g_debug_continue{false};
    +std::mutex g_debug_mutex;
    +std::condition_variable g_debug_cv;
    +
     struct KeyOriginInfo;
    @@ -542,2 +549,3 @@ std::shared_ptr<CWallet> RestoreWallet(WalletContext& context, const fs::path& b
             if (created_parent_dir) {
    +        UninterruptibleSleep(1ms);
                 Assume(fs::is_empty(wallet_path));
    @@ -1530,2 +1538,7 @@ void CWallet::blockConnected(const ChainstateRole& role, const interfaces::Block
         }
    +    if (g_debug_waiting) {
    +        g_debug_continue = true;
    +        g_debug_cv.notify_all();
    +    }
    +    UninterruptibleSleep(260ms);
         assert(block.data);
    @@ -3199,2 +3212,10 @@ bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interf
     
    +    {
    +        g_debug_continue = false;
    +        g_debug_waiting = true;
    +        std::unique_lock<std::mutex> lock(g_debug_mutex);
    +        g_debug_cv.wait_for(lock, std::chrono::seconds(2), [] { return g_debug_continue.load(); });
    +        g_debug_waiting = false;
    +    }
    +
         // If rescan_required = true, rescan_height remains equal to 0
    

    Then,

    while ( ./bld-cmake/test/functional/test_runner.py -j 12 --timeout-factor=4 $( printf "wallet_backup %.0s" {1..12} ) ) ; do echo >> /tmp/counter_ ; done
    

    Gives:

    TEST             | STATUS    | DURATION
    
    wallet_backup.py | ✓ Passed  | 186 s
    wallet_backup.py | ✓ Passed  | 189 s
    wallet_backup.py | ✓ Passed  | 190 s
    wallet_backup.py | ✖ Failed  | 189 s
    wallet_backup.py | ✖ Failed  | 190 s
    wallet_backup.py | ✖ Failed  | 191 s
    wallet_backup.py | ✖ Failed  | 191 s
    wallet_backup.py | ✖ Failed  | 191 s
    wallet_backup.py | ✖ Failed  | 192 s
    wallet_backup.py | ✖ Failed  | 192 s
    wallet_backup.py | ✖ Failed  | 192 s
    wallet_backup.py | ✖ Failed  | 192 s
    
    ALL              | ✖ Failed  | 2285 s (accumulated) 
    Runtime: 192 s
    
  34. achow101 commented at 11:02 PM on February 20, 2026: member

    #34642 resolves the issue for me with the previous reproducer.

  35. rkrux commented at 1:38 PM on February 27, 2026: contributor

    so when the wallet is being loaded for the restore, there are blockConnected signals that the wallet starts processing after AttachChain exits with the error about being pruned.

    Why would the blockConnected signals be there for the wallet (w2_pruneheight in the assumeutxo test) to process when the blocks were generated before the wallet was loaded/restored (or had subscribed to them)? Shouldn't such blocks have been processed during the wallet rescan if the prune issue had not been there?

    https://github.com/bitcoin/bitcoin/blob/3a8b4e89f6db024e82f897cb88b1cbd00a0941cf/test/functional/wallet_assumeutxo.py#L96-L100

    https://github.com/bitcoin/bitcoin/blob/3a8b4e89f6db024e82f897cb88b1cbd00a0941cf/src/wallet/wallet.cpp#L3192-L3198

  36. maflcko commented at 1:44 PM on February 27, 2026: member

    Why would the blockConnected signals be there for the wallet (w2_pruneheight in the assumeutxo test) to process when the blocks were generated before the wallet was loaded/restored (or had subscribed to them)?

    I think the events are waiting in the background scheduler thread and all of the events will be considered for the wallet: The subscribers are iterated when the event fires, not when the event is enqueued. (Otherwise, the event would have to be copied and queued for every subscriber individually)

  37. rkrux commented at 3:05 PM on February 27, 2026: contributor

    I think the events are waiting in the background scheduler thread and all of the events will be considered for the wallet: The subscribers are iterated when the event fires, not when the event is enqueued.

    Appears to be true based on my current code navigation, still doing more.

    One commonality in both these tests is that one other wallet is also loaded while the blocks were generated and this wallet was being restored. Had that other wallet not been loaded, these events would be processed quicker because there were no subscribers and the flakiness could be eliminated I guess? Also, test_restore_wallet_pruneheight creates 500 blocks where 200 would suffice, this can also help in reducing events to be processed.

    Nevertheless, the solution in PR #34642 seems to be in the right direction.

  38. sedited commented at 7:29 AM on March 2, 2026: contributor

    Is the failure here related to this?

    396/455 - wallet_assumeutxo.py failed, Duration: 2 s
    
    stdout:
    2026-02-28T16:12:48.637327Z TestFramework (INFO): PRNG seed is: 3704802399065086238
    2026-02-28T16:12:48.637849Z TestFramework (INFO): Initializing test directory /Users/runner/work/bitcoin/bitcoin/repo_archive/ci/scratch/test_runner/test_runner_₿_🏃_20260228_155759/wallet_assumeutxo_58
    2026-02-28T16:12:49.548117Z TestFramework (INFO): -- Testing assumeutxo
    2026-02-28T16:12:49.548768Z TestFramework (INFO): Creating a UTXO snapshot at height 299
    2026-02-28T16:12:49.895968Z TestFramework (INFO): Loading snapshot into second node from /Users/runner/work/bitcoin/bitcoin/repo_archive/ci/scratch/test_runner/test_runner_₿_🏃_20260228_155759/wallet_assumeutxo_58/node0/regtest/utxos.dat
    2026-02-28T16:12:49.911552Z TestFramework (INFO): Backup from the snapshot height can be loaded during background sync
    2026-02-28T16:12:49.915983Z TestFramework (INFO): Backup from before the snapshot height can't be loaded during background sync
    2026-02-28T16:12:49.919539Z TestFramework (INFO): Backup from the snapshot height can be loaded during background sync (pruned node)
    2026-02-28T16:12:49.940587Z TestFramework (INFO): Backup from before the snapshot height can't be loaded during background sync (pruned node)
    2026-02-28T16:12:49.944432Z TestFramework (INFO): Test loading descriptors during background sync
    2026-02-28T16:12:49.956406Z TestFramework (INFO): Test that rescanning blocks from before the snapshot fails when blocks are not available from the background sync yet
    2026-02-28T16:12:49.956860Z TestFramework (INFO): Restarting node to stop at height 359
    2026-02-28T16:12:50.947949Z TestFramework (INFO): Restarted node before snapshot validation completed, reloading...
    2026-02-28T16:12:51.316321Z TestFramework (INFO): Verify node state after restart during background sync
    2026-02-28T16:12:51.316847Z TestFramework (ERROR): Unexpected exception:
    Traceback (most recent call last):
      File "/Users/runner/work/bitcoin/bitcoin/repo_archive/test/functional/test_framework/test_framework.py", line 142, in main
        self.run_test()
        ~~~~~~~~~~~~~^^
      File "/Users/runner/work/bitcoin/bitcoin/repo_archive/ci/scratch/build-aarch64-apple-darwin24.6.0/test/functional/wallet_assumeutxo.py", line 251, in run_test
        assert_equal(chainstates[0]['blocks'], START_HEIGHT)
        ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/runner/work/bitcoin/bitcoin/repo_archive/test/functional/test_framework/util.py", line 80, in assert_equal
        raise AssertionError("not(%s)" % " == ".join(str(arg) for arg in (thing1, thing2) + args))
    AssertionError: not(211 == 199)
    2026-02-28T16:12:51.382295Z TestFramework (INFO): Not stopping nodes as test failed. The dangling processes will be cleaned up later.
    2026-02-28T16:12:51.382372Z TestFramework (WARNING): Not cleaning up dir /Users/runner/work/bitcoin/bitcoin/repo_archive/ci/scratch/test_runner/test_runner_₿_🏃_20260228_155759/wallet_assumeutxo_58
    2026-02-28T16:12:51.382410Z TestFramework (ERROR): Test failed. Test logging available at /Users/runner/work/bitcoin/bitcoin/repo_archive/ci/scratch/test_runner/test_runner_₿_🏃_20260228_155759/wallet_assumeutxo_58/test_framework.log
    2026-02-28T16:12:51.382488Z TestFramework (ERROR): 
    2026-02-28T16:12:51.382577Z TestFramework (ERROR): Hint: Call /Users/runner/work/bitcoin/bitcoin/repo_archive/test/functional/combine_logs.py '/Users/runner/work/bitcoin/bitcoin/repo_archive/ci/scratch/test_runner/test_runner_₿_🏃_20260228_155759/wallet_assumeutxo_58' to consolidate all logs
    2026-02-28T16:12:51.382609Z TestFramework (ERROR): 
    2026-02-28T16:12:51.382634Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log.
    2026-02-28T16:12:51.382680Z TestFramework (ERROR): https://github.com/bitcoin/bitcoin/issues
    2026-02-28T16:12:51.382703Z TestFramework (ERROR): 
    
    
    stderr:
    [node 3] Cleaning up leftover process
    [node 2] Cleaning up leftover process
    [node 1] Cleaning up leftover process
    [node 0] Cleaning up leftover process
    
  39. maflcko commented at 1:59 PM on March 2, 2026: member

    Is the failure here related to this?

    No, that just ignores the f"-stopatheight={PAUSE_HEIGHT}" and sync further. That is an unrelated issue.

  40. sedited closed this on Mar 2, 2026

  41. Fabcien referenced this in commit 2702711c3a on Mar 2, 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-05-03 15:12 UTC

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