Update libmultiprocess subtree to be more stable with rust IPC client #34422

pull ryanofsky wants to merge 4 commits into bitcoin:master from ryanofsky:pr/subtree-8 changing 13 files +465 −89
  1. ryanofsky commented at 8:06 pm on January 27, 2026: contributor

    This is based on https://github.com/bitcoin-core/libmultiprocess/pull/240 so is currently a draft PR. It’s open to make sure the changes work together and there are no issues in CI.

    Includes:

    The latter change fixes issues with asynchronous requests (https://github.com/bitcoin/bitcoin/issues/33923) and unclean disconnects (https://github.com/bitcoin/bitcoin/issues/34250) that happen with the rust mining client. It also adds tests for these fixes which had some previous review in #34284 (that PR was closed to simplify dependencies between PRs).

    The changes can be verified by running test/lint/git-subtree-check.sh src/ipc/libmultiprocess as described in developer notes and lint instructions

  2. Squashed 'src/ipc/libmultiprocess/' changes from 1fc65008f7d..0174450ca2e
    0174450ca2e Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer
    ddb5f74196f Allow simultaneous calls on same Context.thread
    c4762c7b513 refactor: Add ProxyServer<Thread>::post() method
    3a69d4755af Merge bitcoin-core/libmultiprocess#241: doc: Bump version number v7 -> v8
    0ade1b40ac5 doc: Bump version number
    
    git-subtree-dir: src/ipc/libmultiprocess
    git-subtree-split: 0174450ca2e95a4bd1f22e4fd38d83b1d432ac1f
    ff6b558b03
  3. ipc, test: Add tests for unclean disconnect and thread busy behavior
    Upcoming libmultiprocess changes are expected to alter this behavior
    (https://github.com/bitcoin/bitcoin/issues/34250#issuecomment-3749243782),
    making test coverage useful for documenting current behavior and validating the
    intended changes.
    1fea3bae5c
  4. Merge commit 'ff6b558b03244b2db21ade73bc51bd902f0b07d9' into pr/subtree-8 60fac36260
  5. test: Update interface_ipc.py after fixes from bitcoin-core/libmultiprocess#240 f7e3dccc55
  6. DrahtBot commented at 8:06 pm on January 27, 2026: contributor

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

    Code Coverage & Benchmarks

    For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/34422.

    Reviews

    See the guideline for information on the review process. A summary of reviews will appear here.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #34568 (mining: Break compatibility with existing IPC mining clients by ryanofsky)
    • #34284 (ipc, test: Add tests for unclean disconnect and thread busy behavior by ryanofsky)
    • #34184 (mining: add cooldown to createNewBlock() immediately after IBD by Sjors)

    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.

    LLM Linter (✨ experimental)

    Possible typos and grammar issues:

    • requests_threads -> request_threads [comment refers to variable “request_threads”; using “requests_threads” is a typo that may confuse readers]

    2026-02-20 17:40:42

  7. DrahtBot added the label CI failed on Jan 27, 2026
  8. DrahtBot commented at 9:02 pm on January 27, 2026: contributor

    🚧 At least one of the CI tasks failed. Task lint: https://github.com/bitcoin/bitcoin/actions/runs/21412348994/job/61652239701 LLM reason (✨ experimental): Python lint errors (unused imports) detected by ruff caused the CI to fail.

    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.

  9. ryanofsky force-pushed on Jan 28, 2026
  10. ryanofsky commented at 1:28 am on January 28, 2026: contributor

    Updated 08576a1cd8db4d995b9b4c315e13c63de835210f -> 514857303df32b9e3bf69e5639186eedebb24999 (pr/subtree-8.1 -> pr/subtree-8.2, compare) based on https://github.com/bitcoin-core/libmultiprocess/pull/240 pr/promise.4 #34284 and pr/ipc-testasync.6 to fix CI lint and tsan errors https://github.com/bitcoin/bitcoin/actions/runs/21412348994

    Rebased 514857303df32b9e3bf69e5639186eedebb24999 -> 556eba0e5ca35efc896b48af2aa180ab7d961e54 (pr/subtree-8.2 -> pr/subtree-8.3, compare) based on https://github.com/bitcoin-core/libmultiprocess/pull/240 pr/promise.5 and #34284 and pr/ipc-testasync.6 to fix CI tsan error https://github.com/bitcoin/bitcoin/actions/runs/21421194207/job/61680781122?pr=34422

    Rebased 556eba0e5ca35efc896b48af2aa180ab7d961e54 -> ccd18318df58a9c19d8a683e7bb2f60b5bc5b95e (pr/subtree-8.3 -> pr/subtree-8.4, compare) on top of https://github.com/bitcoin-core/libmultiprocess/pull/240 pr/promise.10 to test latest changes to that PR

  11. DrahtBot added the label Needs rebase on Feb 7, 2026
  12. ryanofsky force-pushed on Feb 11, 2026
  13. DrahtBot removed the label CI failed on Feb 11, 2026
  14. DrahtBot removed the label Needs rebase on Feb 11, 2026
  15. ryanofsky force-pushed on Feb 18, 2026
  16. DrahtBot added the label CI failed on Feb 18, 2026
  17. fanquake commented at 5:01 pm on February 18, 2026: member

    https://github.com/bitcoin/bitcoin/actions/runs/22145238258/job/64020426758?pr=34422#step:11:3803:

     0 node0 stderr =================================================================
     1==25289==ERROR: LeakSanitizer: detected memory leaks
     2
     3Direct leak of 144 byte(s) in 1 object(s) allocated from:
     4    [#0](/bitcoin-bitcoin/0/) 0x6234b1fbf6b1 in operator new(unsigned long) (/home/admin/actions-runner/_work/_temp/build/bin/bitcoin-node+0x129a6b1) (BuildId: 5aa568da87c0a0ff1a7f751ab78d286ddd8c5aa3)
     5    [#1](/bitcoin-bitcoin/1/) 0x6234b247300e in std::__detail::_MakeUniq<node::(anonymous namespace)::BlockTemplateImpl>::__single_object std::make_unique<node::(anonymous namespace)::BlockTemplateImpl, node::BlockAssembler::Options const&, std::unique_ptr<node::CBlockTemplate, std::default_delete<node::CBlockTemplate>>, node::NodeContext&>(node::BlockAssembler::Options const&, std::unique_ptr<node::CBlockTemplate, std::default_delete<node::CBlockTemplate>>&&, node::NodeContext&) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:1070:30
     6    [#2](/bitcoin-bitcoin/2/) 0x6234b247300e in node::(anonymous namespace)::BlockTemplateImpl::waitNext(node::BlockWaitOptions) /home/admin/actions-runner/_work/_temp/src/node/interfaces.cpp:927:34
     7    [#3](/bitcoin-bitcoin/3/) 0x6234b2ebf961 in decltype(auto) mp::ProxyMethodTraits<ipc::capnp::messages::BlockTemplate::WaitNextParams, void>::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, node::BlockWaitOptions>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, node::BlockWaitOptions&&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy.h:289:16
     8    [#4](/bitcoin-bitcoin/4/) 0x6234b2ebf961 in decltype(auto) mp::ServerCall::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, node::BlockWaitOptions>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::TypeList<>, node::BlockWaitOptions&&) const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:465:16
     9    [#5](/bitcoin-bitcoin/5/) 0x6234b2ebe9cc in void mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, node::BlockWaitOptions>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::TypeList<>, node::BlockWaitOptions&&) const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:488:33
    10    [#6](/bitcoin-bitcoin/6/) 0x6234b2ebe686 in void mp::PassField<mp::Accessor<mp::mining_fields::Options, 17>, node::BlockWaitOptions, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>>(mp::Priority<0>, mp::TypeList<node::BlockWaitOptions>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:307:8
    11    [#7](/bitcoin-bitcoin/7/) 0x6234b2ebdfaa in decltype(auto) mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::TypeList<node::BlockWaitOptions>>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::TypeList<node::BlockWaitOptions>) const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:556:16
    12    [#8](/bitcoin-bitcoin/8/) 0x6234b2ebdfaa in std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)::operator()(mp::CancelMonitor&)::'lambda1'()::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/type-context.h:172:28
    13    [#9](/bitcoin-bitcoin/9/) 0x6234b2ebbd4a in kj::Maybe<kj::Exception> kj::runCatchingExceptions<std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)::operator()(mp::CancelMonitor&)::'lambda1'()>(mp::Accessor<mp::mining_fields::Context, 17>&&) /usr/include/kj/exception.h:371:5
    14    [#10](/bitcoin-bitcoin/10/) 0x6234b2ebabf3 in std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)::operator()(mp::CancelMonitor&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/type-context.h:172:28
    15    [#11](/bitcoin-bitcoin/11/) 0x6234b2eb8400 in kj::Promise<mp::Accessor<mp::mining_fields::Context, 17>> mp::ProxyServer<mp::Thread>::post<capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>, std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&&)::'lambda'()::operator()()::'lambda'()::operator()()::'lambda0'()::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-io.h:742:100
    16    [#12](/bitcoin-bitcoin/12/) 0x6234b2eb8400 in kj::Maybe<kj::Exception> kj::runCatchingExceptions<kj::Promise<mp::Accessor<mp::mining_fields::Context, 17>> mp::ProxyServer<mp::Thread>::post<capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>, std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&&)::'lambda'()::operator()()::'lambda'()::operator()()::'lambda0'()>(mp::Accessor<mp::mining_fields::Context, 17>&&) /usr/include/kj/exception.h:371:5
    17    [#13](/bitcoin-bitcoin/13/) 0x6234b2eb77e8 in kj::Promise<mp::Accessor<mp::mining_fields::Context, 17>> mp::ProxyServer<mp::Thread>::post<capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>, std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&&)::'lambda'()::operator()()::'lambda'()::operator()() /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-io.h:742:48
    18    [#14](/bitcoin-bitcoin/14/) 0x6234b2b3b21f in kj::Function<void ()>::operator()() /usr/include/kj/function.h:119:12
    19    [#15](/bitcoin-bitcoin/15/) 0x6234b2b3b21f in void mp::Unlock<mp::Lock, kj::Function<void ()>&>(mp::Lock&, kj::Function<void ()>&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/util.h:210:5
    20    [#16](/bitcoin-bitcoin/16/) 0x728f0baeadb3  (/lib/x86_64-linux-gnu/libstdc++.so.6+0xecdb3) (BuildId: 753c6c8608b61d4e67be8f0c890e03e0aa046b8b)
    21    [#17](/bitcoin-bitcoin/17/) 0x6234b1f78daa in asan_thread_start(void*) crtstuff.c
    22
    23Indirect leak of 336 byte(s) in 1 object(s) allocated from:
    24    [#0](/bitcoin-bitcoin/0/) 0x6234b1fbf6b1 in operator new(unsigned long) (/home/admin/actions-runner/_work/_temp/build/bin/bitcoin-node+0x129a6b1) (BuildId: 5aa568da87c0a0ff1a7f751ab78d286ddd8c5aa3)
    25    [#1](/bitcoin-bitcoin/1/) 0x6234b249325c in node::BlockAssembler::CreateNewBlock() /home/admin/actions-runner/_work/_temp/src/node/miner.cpp:128:26
    26    [#2](/bitcoin-bitcoin/2/) 0x6234b2498d2b in node::WaitAndCreateNewBlock(ChainstateManager&, node::KernelNotifications&, CTxMemPool*, std::unique_ptr<node::CBlockTemplate, std::default_delete<node::CBlockTemplate>> const&, node::BlockWaitOptions const&, node::BlockAssembler::Options const&, bool&) /home/admin/actions-runner/_work/_temp/src/node/miner.cpp:428:32
    27    [#3](/bitcoin-bitcoin/3/) 0x6234b2472fbd in node::(anonymous namespace)::BlockTemplateImpl::waitNext(node::BlockWaitOptions) /home/admin/actions-runner/_work/_temp/src/node/interfaces.cpp:926:29
    28    [#4](/bitcoin-bitcoin/4/) 0x6234b2ebf961 in decltype(auto) mp::ProxyMethodTraits<ipc::capnp::messages::BlockTemplate::WaitNextParams, void>::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, node::BlockWaitOptions>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, node::BlockWaitOptions&&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy.h:289:16
    29    [#5](/bitcoin-bitcoin/5/) 0x6234b2ebf961 in decltype(auto) mp::ServerCall::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, node::BlockWaitOptions>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::TypeList<>, node::BlockWaitOptions&&) const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:465:16
    30    [#6](/bitcoin-bitcoin/6/) 0x6234b2ebe9cc in void mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, node::BlockWaitOptions>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::TypeList<>, node::BlockWaitOptions&&) const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:488:33
    31    [#7](/bitcoin-bitcoin/7/) 0x6234b2ebe686 in void mp::PassField<mp::Accessor<mp::mining_fields::Options, 17>, node::BlockWaitOptions, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>>(mp::Priority<0>, mp::TypeList<node::BlockWaitOptions>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:307:8
    32    [#8](/bitcoin-bitcoin/8/) 0x6234b2ebdfaa in decltype(auto) mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>::invoke<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::TypeList<node::BlockWaitOptions>>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::TypeList<node::BlockWaitOptions>) const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-types.h:556:16
    33    [#9](/bitcoin-bitcoin/9/) 0x6234b2ebdfaa in std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)::operator()(mp::CancelMonitor&)::'lambda1'()::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/type-context.h:172:28
    34    [#10](/bitcoin-bitcoin/10/) 0x6234b2ebbd4a in kj::Maybe<kj::Exception> kj::runCatchingExceptions<std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)::operator()(mp::CancelMonitor&)::'lambda1'()>(mp::Accessor<mp::mining_fields::Context, 17>&&) /usr/include/kj/exception.h:371:5
    35    [#11](/bitcoin-bitcoin/11/) 0x6234b2ebabf3 in std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)::operator()(mp::CancelMonitor&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/type-context.h:172:28
    36    [#12](/bitcoin-bitcoin/12/) 0x6234b2eb8400 in kj::Promise<mp::Accessor<mp::mining_fields::Context, 17>> mp::ProxyServer<mp::Thread>::post<capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>, std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&&)::'lambda'()::operator()()::'lambda'()::operator()()::'lambda0'()::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-io.h:742:100
    37    [#13](/bitcoin-bitcoin/13/) 0x6234b2eb8400 in kj::Maybe<kj::Exception> kj::runCatchingExceptions<kj::Promise<mp::Accessor<mp::mining_fields::Context, 17>> mp::ProxyServer<mp::Thread>::post<capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>, std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&&)::'lambda'()::operator()()::'lambda'()::operator()()::'lambda0'()>(mp::Accessor<mp::mining_fields::Context, 17>&&) /usr/include/kj/exception.h:371:5
    38    [#14](/bitcoin-bitcoin/14/) 0x6234b2eb77e8 in kj::Promise<mp::Accessor<mp::mining_fields::Context, 17>> mp::ProxyServer<mp::Thread>::post<capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>, std::enable_if<std::is_same<decltype(mp::Accessor<mp::mining_fields::Context, 17>::get(fp1.call_context.getParams())), mp::Context::Reader>::value, kj::Promise<mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>::CallContext>>::type mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>>, mp::TypeList<node::BlockWaitOptions>>(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<node::BlockWaitOptions>&&)::'lambda'(mp::CancelMonitor&)>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::WaitNextParams, ipc::capnp::messages::BlockTemplate::WaitNextResults>>&&)::'lambda'()::operator()()::'lambda'()::operator()() /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/proxy-io.h:742:48
    39    [#15](/bitcoin-bitcoin/15/) 0x6234b2b3b21f in kj::Function<void ()>::operator()() /usr/include/kj/function.h:119:12
    40    [#16](/bitcoin-bitcoin/16/) 0x6234b2b3b21f in void mp::Unlock<mp::Lock, kj::Function<void ()>&>(mp::Lock&, kj::Function<void ()>&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/util.h:210:5
    41    [#17](/bitcoin-bitcoin/17/) 0x728f0baeadb3  (/lib/x86_64-linux-gnu/libstdc++.so.6+0xecdb3) (BuildId: 753c6c8608b61d4e67be8f0c890e03e0aa046b8b)
    42    [#18](/bitcoin-bitcoin/18/) 0x6234b1f78daa in asan_thread_start(void*) crtstuff.c
    43
    44Indirect leak of 144 byte(s) in 1 object(s) allocated from:
    45    [#0](/bitcoin-bitcoin/0/) 0x6234b1fbf6b1 in operator new(unsigned long) (/home/admin/actions-runner/_work/_temp/build/bin/bitcoin-node+0x129a6b1) (BuildId: 5aa568da87c0a0ff1a7f751ab78d286ddd8c5aa3)
    46    [#1](/bitcoin-bitcoin/1/) 0x6234b24a21e9 in std::__new_allocator<std::_Sp_counted_ptr_inplace<CTransaction const, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>>::allocate(unsigned long, void const*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/new_allocator.h:151:27
    47    [#2](/bitcoin-bitcoin/2/) 0x6234b24a21e9 in std::allocator<std::_Sp_counted_ptr_inplace<CTransaction const, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>>::allocate(unsigned long) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/allocator.h:198:32
    48    [#3](/bitcoin-bitcoin/3/) 0x6234b24a21e9 in std::allocator_traits<std::allocator<std::_Sp_counted_ptr_inplace<CTransaction const, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>>>::allocate(std::allocator<std::_Sp_counted_ptr_inplace<CTransaction const, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>>&, unsigned long) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/alloc_traits.h:482:20
    49    [#2](/bitcoin-bitcoin/2/) 0x6234b2308b66 in std::allocator<std::shared_ptr<CTransaction const>>::allocate(unsigned long) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/allocator.h:198:32
    50    [#3](/bitcoin-bitcoin/3/) 0x6234b2308b66 in std::allocator_traits<std::allocator<std::shared_ptr<CTransaction const>>>::allocate(std::allocator<std::shared_ptr<CTransaction const>>&, unsigned long) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/alloc_traits.h:482:20
    51    [#4](/bitcoin-bitcoin/4/) 0x6234b2308b66 in std::_Vector_base<std::shared_ptr<CTransaction const>, std::allocator<std::shared_ptr<CTransaction const>>>::_M_allocate(unsigned long) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_vector.h:381:20
    52    [#5](/bitcoin-bitcoin/5/) 0x6234b2308b66 in void std::vector<std::shared_ptr<CTransaction const>, std::allocator<std::shared_ptr<CTransaction const>>>::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<std::shared_ptr<CTransaction const>*, std::vector<std::shared_ptr<CTransaction const>, std::allocator<std::shared_ptr<CTransaction const>>>>) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/vector.tcc:459:33
    53
    54SUMMARY: AddressSanitizer: 1066 byte(s) leaked in 12 allocation(s). 
    
  18. ryanofsky commented at 10:46 pm on February 18, 2026: contributor

    Spent some time debugging the memory leak detected by ASAN in latest push: ccd18318df58a9c19d8a683e7bb2f60b5bc5b95e, https://github.com/bitcoin/bitcoin/actions/runs/22145238258/job/64020426758?pr=34422#step:11:3803

    The leak is caused by a known compiler bug in clang, not present in GCC: https://github.com/llvm/llvm-project/issues/12658

    It comes from this line throwing an exception inside a KJ_DEFER call:

    https://github.com/bitcoin/bitcoin/blob/ccd18318df58a9c19d8a683e7bb2f60b5bc5b95e/src/ipc/libmultiprocess/include/mp/proxy-types.h#L463

    Which causes the function return value (a ‘unique_ptr` in this case) to be leaked and never destroyed.

    And example of the bug can be seen with https://godbolt.org/z/Y5YcYsdYK. If this example is compiled with any version of clang, objects are leaked, and if compiled with any version of GCC, they are not leaked.

    Since the clang bug is unlikely to be fixed, I’ll need to rewrite the function to avoid using KJ_DEFER.

  19. Sjors commented at 9:43 am on February 19, 2026: member
    I assume https://github.com/bitcoin-core/libmultiprocess/pull/210 wouldn’t make a difference? If not, maybe the issue should be tracked in capnproto/capnproto.
  20. ryanofsky force-pushed on Feb 19, 2026
  21. ryanofsky commented at 12:44 pm on February 19, 2026: contributor

    Rebased ccd18318df58a9c19d8a683e7bb2f60b5bc5b95e -> 90c82a5fd562e64d515f81932aa9d942d818c86f (pr/subtree-8.4 -> pr/subtree-8.5, compare) on top of https://github.com/bitcoin-core/libmultiprocess/pull/240 pr/promise.12 to include recent fixes in that PR

    re: #34422 (comment)

    I assume bitcoin-core/libmultiprocess#210 wouldn’t make a difference? If not, maybe the issue should be tracked in capnproto/capnproto.

    I forgot about kj::defer but KJ_DEFER seems to be a simple wrapper around it so it will have the same underlying problem. I think it probably would be a good idea to open a capnproto documentation PR to warn about this problem, even if it it isn’t a capnproto bug. It was already somewhat risky to throw from a KJ_DEFER block because if there was another active exception, the program would terminate. But the clang bug makes the risky code not even work correctly.

  22. Sjors commented at 12:52 pm on February 19, 2026: member
    Two three sanitizers are unhappy now :-(
  23. ryanofsky commented at 12:56 pm on February 19, 2026: contributor

    Two sanitizers are unhappy now :-(

    Well, ok. Hopefuly I just did something stupid and this isn’t another compiler bug.

  24. in test/functional/interface_ipc.py:101 in 90c82a5fd5
     96+            waitoptions.timeout = timeout
     97+            waitoptions.feeThreshold = 1
     98+            with node.assert_debug_log(expected_msgs=["BlockTemplate.waitNext", "IPC server post request"]):
     99+                promise = template.waitNext(ctx, waitoptions)
    100+                await asyncio.sleep(0.1)
    101+            disconnected_log_check.enter_context(node.assert_debug_log(expected_msgs=["IPC server: socket disconnected", "canceled while executing"]))
    


    maflcko commented at 2:45 pm on February 19, 2026:

    Using a context that silently polls the debug log until a hidden timeout is hit, is brittle and confusing.

    This CI will fail here:

    0                           AssertionError: [node 0] Expected message(s) ['IPC server: socket disconnected', 'canceled while executing'] not found in log:
    1                                    - 2026-02-19T12:51:18.300546Z [capnp-loop] [ipc/capnp/protocol.cpp:53] [IpcLogFn] ipc: {bitcoin-node-25248/b-capnp-loop-25252} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages6MiningEEE
    2 node0 2026-02-19T12:51:18.300746Z [capnp-loop] [ipc/capnp/protocol.cpp:53] [IpcLogFn] ipc: {bitcoin-node-25248/b-capnp-loop-25252} IPC server: socket disconnected. 
    3 node0 2026-02-19T12:51:18.300774Z [capnp-loop] [ipc/capnp/protocol.cpp:53] [IpcLogFn] ipc: {bitcoin-node-25248/b-capnp-loop-25252} IPC server request [#14](/bitcoin-bitcoin/14/) canceled while executing. 
    4 node0 2026-02-19T12:51:18.300807Z [capnp-loop] [ipc/capnp/protocol.cpp:53] [IpcLogFn] ipc: {bitcoin-node-25248/b-capnp-loop-25252} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages4InitEEE 
    5 test  2026-02-19T12:51:18.301543Z TestFramework (DEBUG): Closing down network thread 
    

    For a quick and dirty fix, you can set timeout=2 (or whatever). However, my recommendation would be to wait on a “real” condition in the inner context. e.g

    0with assert_debug_log([disconnect_msg]):
    1  initiate_disconnect()
    2  self.wait_until(disconnect)
    

    ryanofsky commented at 5:26 pm on February 19, 2026:

    re: #34422 (review)

    Using a context that silently polls the debug log until a hidden timeout is hit, is brittle and confusing.

    Wow, thank you noticing this and identifying the problem! But I don’t think this is right.

    There is literally no timeout specified on this line of code, nor should there be. The assert_debug_log function did not take a timeout option when it was introduced in #14024 and tests should not need to hardcode timeout values every time they take an action that does not complete immediately.

    I think test framework should provide some default timeout controlling how long tests are allowed to wait idly before they are considered failed. Specifically, it would seem nice to replace the rpc_timeout variable with a generic failure_timeout variable, and also stop multiplying it by timeout_factor up front, instead applying the factor when RPC calls are made. This is probably better discussed elsewhere but I feel like the recent change in #34581 adding timeout=2 values everywhere is not the best long term approach.

    For now, though it is probably easiest to add timeout=2 here as you suggest to fix the silent conflict with #34581.

    For a quick and dirty fix, you can set timeout=2 (or whatever). However, my recommendation would be to wait on a “real” condition in the inner context. e.g

    0with assert_debug_log([disconnect_msg]):
    1  initiate_disconnect()
    2  self.wait_until(disconnect)
    

    This suggestion doesn’t actually make sense. The test is calling waitNext, then disconnecting the IPC client, then waiting for the server to detect that the IPC client has disconnected, then it is calling generate.

    The point of the disconnected_log_check is not to make sure something is logged, but to delay the generate call after until the server processes the client disconnect, to make the test deterministic and be sure it is checking the right thing.


    maflcko commented at 6:29 pm on February 19, 2026:

    There is literally no timeout specified on this line of code, nor should there be. The assert_debug_log function did not take a timeout option when it was introduced in #14024 and tests should not need to hardcode timeout values every time they take an action that does not complete immediately.

    I think back then the timeout was 0 and the function was synchronous and immediate without any loop/sleep/wait.

    I think test framework should provide some default timeout controlling how long tests are allowed to wait idly before they are considered failed. Specifically, it would seem nice to replace the rpc_timeout variable with a generic failure_timeout variable, and also stop multiplying it by timeout_factor up front, instead applying the factor when RPC calls are made. This is probably better discussed elsewhere but I feel like the recent change in #34581 adding timeout=2 values everywhere is not the best long term approach.

    24581 does not add timeout values everywhere. In fact, it removed many unneeded ones. The goal is to clearly differentiate between the two cases:

    1. The debug log is read and checked exactly once, immediately, without any loop/sleep/wait, and the result is documented to be reported back immediately by failing the test or continuing after the context is closed.
    2. The debug log is read continuously in a loop, until a specified timeout. The result is documented to be reported at or before the timeout by failing the test or continuing after the context is closed successfully.

    I think the two cases are sufficiently different, with the first case being preferable (if possible), to make the intention of context visible by just glancing over the line. Otherwise, this is going to lead to more of the issues that were fixed in #34571

    This suggestion doesn’t actually make sense. The test is calling waitNext, then disconnecting the IPC client, then waiting for the server to detect that the IPC client has disconnected, then it is calling generate.

    I see. It was mostly a general recommendation to prefer case (1). However, if the debug log truly is the only way to synchronise on, then case (2) is appropriate. Though, I think it should properly be documented as this case.


    ryanofsky commented at 7:30 pm on February 19, 2026:

    I think back then the timeout was 0 and the function was synchronous and immediate without any loop/sleep/wait.

    This is surprising, and thanks for the explanation. I was thinking a 0 timeout was not useful because the client doesn’t have control over when messages appear in the log file and always needs to wait for them to appear. But it seems like 0 does actually work in most cases, so maybe it is a good default.

    24581 does not add timeout values everywhere. In fact, it removed many unneeded ones. The goal is to clearly differentiate between the two cases:

    1. The debug log is read and checked exactly once, immediately, without any loop/sleep/wait, and the result is documented to be reported back immediately by failing the test or continuing after the context is closed.

    2. The debug log is read continuously in a loop, until a specified timeout. The result is documented to be reported at or before the timeout by failing the test or continuing after the context is closed successfully.

    I’m surprised case 1 works or is generally useful. In this PR and #34284, assert_debug_log is used to wait until events happen, not to check log file formatting. But I guess this PR is the outlier case.

    I still think the change implemented in #34581 adding manytimeout=2 arguments is not good. It would seem better to distinguish the two cases with a wait=False default argument and if wait=True is specified, have the test wait some fixed amount of time, like 60 seconds (multiplied by timeout factor), before failing. If tests want to specify some other amount of time to wait, that could be allowed, but it should rarely be necessary. I don’t think it should be necessary hardcode a specific timeout value in every call that is trying to wait.


    maflcko commented at 7:49 am on February 20, 2026:

    I still think the change implemented in #34581 adding manytimeout=2 arguments is not good. It would seem better to distinguish the two cases with a wait=False default argument and if wait=True is specified, have the test wait some fixed amount of time, like 60 seconds (multiplied by timeout factor), before failing. If tests want to specify some other amount of time to wait, that could be allowed, but it should rarely be necessary. I don’t think it should be necessary hardcode a specific timeout value in every call that is trying to wait.

    Maybe assert_debug_log could be ranamed to assert_debug_log_poll and a new assert_debug_log alias with the timeout arg removed could be added. This way, the assert_debug_log_poll can have a default timeout again.


    ryanofsky commented at 2:10 pm on February 20, 2026:

    Maybe assert_debug_log could be ranamed to assert_debug_log_poll and a new assert_debug_log alias with the timeout arg removed could be added. This way, the assert_debug_log_poll can have a default timeout again.

    This feels more awkward than just having one function, dropping the timeout parameter, and adding a wait=False|True|<number of seconds> parameter as suggested. Having two functions instead of one makes functionality less discoverable, and makes it likely more suboptimal tests will be written because you can’t see all the functionality provided in one place. Having two names to remember instead of one, and to not confuse with each other when reading and writing tests also adds unnecessary difficulty.

  25. ryanofsky force-pushed on Feb 19, 2026
  26. ryanofsky commented at 6:15 pm on February 19, 2026: contributor
    Rebased 90c82a5fd562e64d515f81932aa9d942d818c86f -> c51b2fd65447b10d3f2e0b3d909bfbf1aaef883c (pr/subtree-8.5 -> pr/subtree-8.6, compare) on top of #34284 pr/ipc-testasync.10 to fix silent conflict with #34581 causing test failures in sanitize CI jobs https://github.com/bitcoin/bitcoin/actions/runs/22181841677/job/64144928937?pr=34422#step:11:3606
  27. DrahtBot removed the label CI failed on Feb 19, 2026
  28. DrahtBot added the label Needs rebase on Feb 20, 2026
  29. ryanofsky force-pushed on Feb 20, 2026
  30. ryanofsky commented at 5:42 pm on February 20, 2026: contributor
    Rebased c51b2fd65447b10d3f2e0b3d909bfbf1aaef883c -> f7e3dccc554bf437d3aca75e0bdee4d439884661 (pr/subtree-8.6 -> pr/subtree-8.7, compare) due to conflict with #34568 on top of top of https://github.com/bitcoin-core/libmultiprocess/pull/240 pr/promise.14 and #34284 pr/ipc-testasync.11
  31. DrahtBot removed the label Needs rebase on Feb 20, 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-20 18:13 UTC

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