Update libmultiprocess subtree to fix race conditions on disconnects #34804

pull ryanofsky wants to merge 2 commits into bitcoin:master from ryanofsky:pr/subtree-9 changing 28 files +1049 −167
  1. DrahtBot commented at 2:48 pm on March 11, 2026: contributor

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

    Reviews

    See the guideline for information on the review process.

    Type Reviewers
    ACK Sjors, ismaelsadeeq

    If your review is incorrectly listed, please copy-paste <!–meta-tag:bot-skip–> into the comment that the bot should ignore.

  2. ryanofsky force-pushed on Mar 12, 2026
  3. ryanofsky commented at 11:47 am on March 12, 2026: contributor
    Rebased af35175f1ef5860761095e2d59a4a64406a1d4d3 -> 6fd7194d8167176d96858097236eb3f9658fd124 (pr/subtree-9.1 -> pr/subtree-9.2, compare) adding new test from updated https://github.com/bitcoin-core/libmultiprocess/pull/250
  4. dergoegge commented at 12:02 pm on March 12, 2026: member
    Tested this PR with Antithesis and the bugs it previously found seem to no longer reproduce.
  5. fanquake commented at 2:21 pm on March 12, 2026: member

    https://github.com/bitcoin/bitcoin/actions/runs/23000375935/job/66791524592?pr=34804#step:11:3292

      0WARNING: ThreadSanitizer: data race (pid=21189)
      1  Write of size 8 at 0x7208000030c8 by thread T2:
      2    [#0](/bitcoin-bitcoin/0/) operator delete(void*, unsigned long) <null> (bitcoin-node+0x1f093c) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
      3    [#1](/bitcoin-bitcoin/1/) kj::_::HeapDisposer<mp::ProxyServer<mp::ThreadMap>>::disposeImpl(void*) const /home/admin/actions-runner/_work/_temp/depends/x86_64-pc-linux-gnu/include/kj/memory.h:557:60 (bitcoin-node+0x8291a5) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
      4    [#2](/bitcoin-bitcoin/2/) kj::Disposer::Dispose_<capnp::Capability::Server, true>::dispose(capnp::Capability::Server*, kj::Disposer const&) <null> (bitcoin-node+0xe2dc91) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
      5    [#3](/bitcoin-bitcoin/3/) void kj::Disposer::dispose<capnp::Capability::Server>(capnp::Capability::Server*) const <null> (bitcoin-node+0xe2dbe5) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
      6    [#4](/bitcoin-bitcoin/4/) kj::Own<capnp::Capability::Server, std::nullptr_t>::dispose() <null> (bitcoin-node+0xe5ed6e) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
      7    [#5](/bitcoin-bitcoin/5/) kj::Own<capnp::Capability::Server, std::nullptr_t>::~Own() <null> (bitcoin-node+0xe2a695) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
      8    [#6](/bitcoin-bitcoin/6/) kj::Maybe<kj::Own<capnp::Capability::Server, std::nullptr_t>>::~Maybe() <null> (bitcoin-node+0xe2d395) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
      9    [#7](/bitcoin-bitcoin/7/) capnp::LocalClient::~LocalClient() <null> (bitcoin-node+0xe615f8) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     10    [#8](/bitcoin-bitcoin/8/) capnp::LocalClient::~LocalClient() <null> (bitcoin-node+0xe616f9) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     11    [#9](/bitcoin-bitcoin/9/) non-virtual thunk to capnp::LocalClient::~LocalClient() <null> (bitcoin-node+0xe617c9) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     12    [#10](/bitcoin-bitcoin/10/) kj::Refcounted::disposeImpl(void*) const <null> (bitcoin-node+0x122a954) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     13    [#11](/bitcoin-bitcoin/11/) kj::Disposer::Dispose_<capnp::ClientHook, true>::dispose(capnp::ClientHook*, kj::Disposer const&) <null> (bitcoin-node+0xe35971) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     14    [#12](/bitcoin-bitcoin/12/) void kj::Disposer::dispose<capnp::ClientHook>(capnp::ClientHook*) const <null> (bitcoin-node+0xe358c5) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     15    [#13](/bitcoin-bitcoin/13/) kj::Own<capnp::ClientHook, std::nullptr_t>::dispose() <null> (bitcoin-node+0xe3586e) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     16    [#14](/bitcoin-bitcoin/14/) kj::Own<capnp::ClientHook, std::nullptr_t>::~Own() <null> (bitcoin-node+0xe29585) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     17    [#15](/bitcoin-bitcoin/15/) capnp::_::(anonymous namespace)::RpcConnectionState::Export::~Export() rpc.c++ (bitcoin-node+0xe860dc) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     18    [#16](/bitcoin-bitcoin/16/) capnp::_::(anonymous namespace)::RpcConnectionState::releaseExport(unsigned int, unsigned int) rpc.c++ (bitcoin-node+0xe8e639) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     19    [#17](/bitcoin-bitcoin/17/) capnp::_::(anonymous namespace)::RpcConnectionState::releaseExports(kj::ArrayPtr<unsigned int>) rpc.c++ (bitcoin-node+0xe9bff5) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     20    [#18](/bitcoin-bitcoin/18/) capnp::_::(anonymous namespace)::RpcConnectionState::handleFinish(capnp::rpc::Finish::Reader const&)::'lambda'()::operator()() const rpc.c++ (bitcoin-node+0xee7e95) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     21    [#19](/bitcoin-bitcoin/19/) kj::_::Deferred<capnp::_::(anonymous namespace)::RpcConnectionState::handleFinish(capnp::rpc::Finish::Reader const&)::'lambda'()>::run() rpc.c++ (bitcoin-node+0xee7c9a) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     22    [#20](/bitcoin-bitcoin/20/) kj::_::Deferred<capnp::_::(anonymous namespace)::RpcConnectionState::handleFinish(capnp::rpc::Finish::Reader const&)::'lambda'()>::~Deferred() rpc.c++ (bitcoin-node+0xee6769) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     23    [#21](/bitcoin-bitcoin/21/) capnp::_::(anonymous namespace)::RpcConnectionState::handleFinish(capnp::rpc::Finish::Reader const&) rpc.c++ (bitcoin-node+0xe8d59d) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     24    [#22](/bitcoin-bitcoin/22/) capnp::_::(anonymous namespace)::RpcConnectionState::handleMessage(kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>) rpc.c++ (bitcoin-node+0xe8a593) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     25    [#23](/bitcoin-bitcoin/23/) capnp::_::(anonymous namespace)::RpcConnectionState::messageLoop()::'lambda'(kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>&&)::operator()(kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>&&) const rpc.c++ (bitcoin-node+0xe8a1eb) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     26    [#24](/bitcoin-bitcoin/24/) bool kj::_::MaybeVoidCaller<kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>, bool>::apply<capnp::_::(anonymous namespace)::RpcConnectionState::messageLoop()::'lambda'(kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>&&)>(capnp::_::(anonymous namespace)::RpcConnectionState::messageLoop()::'lambda'(kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>&&)&, kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>&&) rpc.c++ (bitcoin-node+0xeefc35) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     27    [#25](/bitcoin-bitcoin/25/) kj::_::TransformPromiseNode<bool, kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>, capnp::_::(anonymous namespace)::RpcConnectionState::messageLoop()::'lambda'(kj::Maybe<kj::Own<capnp::IncomingRpcMessage, std::nullptr_t>>&&), capnp::_::(anonymous namespace)::RpcConnectionState::messageLoop()::'lambda'(kj::Exception&&)>::getImpl(kj::_::ExceptionOrValue&) rpc.c++ (bitcoin-node+0xeef841) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     28    [#26](/bitcoin-bitcoin/26/) kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0::operator()() const async.c++ (bitcoin-node+0x10716f3) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     29    [#27](/bitcoin-bitcoin/27/) kj::Maybe<kj::Exception> kj::runCatchingExceptions<kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0>(kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0&&) async.c++ (bitcoin-node+0x1061bb7) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     30    [#28](/bitcoin-bitcoin/28/) kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&) <null> (bitcoin-node+0x1061aab) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     31    [#29](/bitcoin-bitcoin/29/) kj::_::TransformPromiseNodeBase::getDepResult(kj::_::ExceptionOrValue&) <null> (bitcoin-node+0x1061e62) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     32    [#30](/bitcoin-bitcoin/30/) kj::_::TransformPromiseNode<kj::_::Void, bool, capnp::_::(anonymous namespace)::RpcConnectionState::messageLoop()::'lambda'(bool), kj::_::PropagateException>::getImpl(kj::_::ExceptionOrValue&) rpc.c++ (bitcoin-node+0xef1bd3) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     33    [#31](/bitcoin-bitcoin/31/) kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0::operator()() const async.c++ (bitcoin-node+0x10716f3) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     34    [#32](/bitcoin-bitcoin/32/) kj::Maybe<kj::Exception> kj::runCatchingExceptions<kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0>(kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0&&) async.c++ (bitcoin-node+0x1061bb7) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     35    [#33](/bitcoin-bitcoin/33/) kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&) <null> (bitcoin-node+0x1061aab) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     36    [#34](/bitcoin-bitcoin/34/) kj::TaskSet::Task::fire() <null> (bitcoin-node+0x108bf23) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     37    [#35](/bitcoin-bitcoin/35/) non-virtual thunk to kj::TaskSet::Task::fire() <null> (bitcoin-node+0x108c459) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     38    [#36](/bitcoin-bitcoin/36/) kj::EventLoop::turn() <null> (bitcoin-node+0x105c635) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     39    [#37](/bitcoin-bitcoin/37/) kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation)::$_2::operator()() const async.c++ (bitcoin-node+0x1070484) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     40    [#38](/bitcoin-bitcoin/38/) void kj::WaitScope::runOnStackPool<kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation)::$_2>(kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation)::$_2&&) async.c++ (bitcoin-node+0x105e5a7) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     41    [#39](/bitcoin-bitcoin/39/) kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation) <null> (bitcoin-node+0x105e121) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     42    [#40](/bitcoin-bitcoin/40/) kj::Promise<unsigned long>::wait(kj::WaitScope&, kj::SourceLocation) /home/admin/actions-runner/_work/_temp/depends/x86_64-pc-linux-gnu/include/kj/async-inl.h:1359:3 (bitcoin-node+0xe17187) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     43    [#41](/bitcoin-bitcoin/41/) mp::EventLoop::loop() /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/src/mp/proxy.cpp:244:68 (bitcoin-node+0xe11d71) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     44    [#42](/bitcoin-bitcoin/42/) ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/capnp/protocol.cpp:136:21 (bitcoin-node+0x819606) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     45    [#43](/bitcoin-bitcoin/43/) std::__1::__invoke_result_impl<void, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>::type std::__1::__invoke[abi:dee220100]<ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>(ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()&&) /cxx_build/include/c++/v1/__type_traits/invoke.h:90:27 (bitcoin-node+0x819606)
     46    [#44](/bitcoin-bitcoin/44/) void std::__1::__thread_execute[abi:dee220100]<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'(), 0ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>&, std::__1::__integer_sequence<unsigned long, 0ul>) /cxx_build/include/c++/v1/__thread/thread.h:161:3 (bitcoin-node+0x819606)
     47    [#45](/bitcoin-bitcoin/45/) void* std::__1::__thread_proxy[abi:dee220100]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>>(void*) /cxx_build/include/c++/v1/__thread/thread.h:169:3 (bitcoin-node+0x819606)
     48
     49  Previous read of size 8 at 0x7208000030c8 by thread T11 (mutexes: write M0):
     50    [#0](/bitcoin-bitcoin/0/) mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/src/mp/proxy.cpp:421:19 (bitcoin-node+0xe15c65) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     51    [#1](/bitcoin-bitcoin/1/) std::__1::__invoke_result_impl<void, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>::type std::__1::__invoke[abi:dee220100]<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>(mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0&&) /cxx_build/include/c++/v1/__type_traits/invoke.h:90:27 (bitcoin-node+0xe15c65)
     52    [#2](/bitcoin-bitcoin/2/) void std::__1::__thread_execute[abi:dee220100]<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0, 0ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>&, std::__1::__integer_sequence<unsigned long, 0ul>) /cxx_build/include/c++/v1/__thread/thread.h:161:3 (bitcoin-node+0xe15c65)
     53    [#3](/bitcoin-bitcoin/3/) void* std::__1::__thread_proxy[abi:dee220100]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>>(void*) /cxx_build/include/c++/v1/__thread/thread.h:169:3 (bitcoin-node+0xe15c65)
     54
     55  Mutex M0 (0x721c00023000) created at:
     56    [#0](/bitcoin-bitcoin/0/) pthread_mutex_lock <null> (bitcoin-node+0x16c03b) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     57    [#1](/bitcoin-bitcoin/1/) __libcpp_mutex_lock /llvm-project/libcxx/include/__thread/support/pthread.h:95:10 (libc++.so.1+0x8e019) (BuildId: 73e2cbaab3a26ac81ab0ad8de91c2952a3321d81)
     58    [#2](/bitcoin-bitcoin/2/) std::__1::mutex::lock() /llvm-project/libcxx/src/mutex.cpp:30:12 (libc++.so.1+0x8e019)
     59    [#3](/bitcoin-bitcoin/3/) std::__1::unique_lock<std::__1::mutex>::unique_lock[abi:dee220100](std::__1::mutex&) /cxx_build/include/c++/v1/__mutex/unique_lock.h:44:11 (bitcoin-node+0xe15c19) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     60    [#4](/bitcoin-bitcoin/4/) mp::Lock::Lock(mp::Mutex&) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/include/mp/util.h:173:45 (bitcoin-node+0xe15c19)
     61    [#5](/bitcoin-bitcoin/5/) mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/src/mp/proxy.cpp:419:14 (bitcoin-node+0xe15c19)
     62    [#6](/bitcoin-bitcoin/6/) std::__1::__invoke_result_impl<void, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>::type std::__1::__invoke[abi:dee220100]<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>(mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0&&) /cxx_build/include/c++/v1/__type_traits/invoke.h:90:27 (bitcoin-node+0xe15c19)
     63    [#7](/bitcoin-bitcoin/7/) void std::__1::__thread_execute[abi:dee220100]<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0, 0ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>&, std::__1::__integer_sequence<unsigned long, 0ul>) /cxx_build/include/c++/v1/__thread/thread.h:161:3 (bitcoin-node+0xe15c19)
     64    [#8](/bitcoin-bitcoin/8/) void* std::__1::__thread_proxy[abi:dee220100]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>>(void*) /cxx_build/include/c++/v1/__thread/thread.h:169:3 (bitcoin-node+0xe15c19)
     65
     66  Thread T2 'b-capnp-loop' (tid=21201, running) created by main thread at:
     67    [#0](/bitcoin-bitcoin/0/) pthread_create <null> (bitcoin-node+0x16a32e) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     68    [#1](/bitcoin-bitcoin/1/) std::__1::__libcpp_thread_create[abi:dee220100](unsigned long*, void* (*)(void*), void*) /cxx_build/include/c++/v1/__thread/support/pthread.h:182:10 (bitcoin-node+0x819145) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     69    [#2](/bitcoin-bitcoin/2/) std::__1::thread::thread[abi:dee220100]<ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'(), 0>(ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()&&) /cxx_build/include/c++/v1/__thread/thread.h:218:16 (bitcoin-node+0x819145)
     70    [#3](/bitcoin-bitcoin/3/) ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*) /home/admin/actions-runner/_work/_temp/src/ipc/capnp/protocol.cpp:127:25 (bitcoin-node+0x819145)
     71    [#4](/bitcoin-bitcoin/4/) ipc::capnp::(anonymous namespace)::CapnpProtocol::listen(int, char const*, interfaces::Init&) /home/admin/actions-runner/_work/_temp/src/ipc/capnp/protocol.cpp:87:9 (bitcoin-node+0x8184dd) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     72    [#5](/bitcoin-bitcoin/5/) ipc::(anonymous namespace)::IpcImpl::listenAddress(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&) /home/admin/actions-runner/_work/_temp/src/ipc/interfaces.cpp:111:21 (bitcoin-node+0x8148a0) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     73    [#6](/bitcoin-bitcoin/6/) AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*) /home/admin/actions-runner/_work/_temp/src/init.cpp:1505:22 (bitcoin-node+0x2102a7) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     74    [#7](/bitcoin-bitcoin/7/) AppInit(node::NodeContext&) /home/admin/actions-runner/_work/_temp/src/bitcoind.cpp:242:43 (bitcoin-node+0x1f1e86) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     75    [#8](/bitcoin-bitcoin/8/) main /home/admin/actions-runner/_work/_temp/src/bitcoind.cpp:283:10 (bitcoin-node+0x1f1e86)
     76
     77  Thread T11 (tid=21259, running) created by thread T2 at:
     78    [#0](/bitcoin-bitcoin/0/) pthread_create <null> (bitcoin-node+0x16a32e) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     79    [#1](/bitcoin-bitcoin/1/) std::__1::__libcpp_thread_create[abi:dee220100](unsigned long*, void* (*)(void*), void*) /cxx_build/include/c++/v1/__thread/support/pthread.h:182:10 (bitcoin-node+0xe14411) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     80    [#2](/bitcoin-bitcoin/2/) std::__1::thread::thread[abi:dee220100]<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0, 0>(mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0&&) /cxx_build/include/c++/v1/__thread/thread.h:218:16 (bitcoin-node+0xe14411)
     81    [#3](/bitcoin-bitcoin/3/) mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>) /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/src/mp/proxy.cpp:416:17 (bitcoin-node+0xe14411)
     82    [#4](/bitcoin-bitcoin/4/) mp::ThreadMap::Server::dispatchCallInternal(unsigned short, capnp::CallContext<capnp::AnyPointer, capnp::AnyPointer>) /home/admin/actions-runner/_work/_temp/build/src/ipc/libmultiprocess/include/mp/proxy.capnp.c++:602:9 (bitcoin-node+0xe0ea48) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     83    [#5](/bitcoin-bitcoin/5/) mp::ThreadMap::Server::dispatchCall(unsigned long, unsigned short, capnp::CallContext<capnp::AnyPointer, capnp::AnyPointer>) /home/admin/actions-runner/_work/_temp/build/src/ipc/libmultiprocess/include/mp/proxy.capnp.c++:591:14 (bitcoin-node+0xe0ea48)
     84    [#6](/bitcoin-bitcoin/6/) virtual thunk to mp::ThreadMap::Server::dispatchCall(unsigned long, unsigned short, capnp::CallContext<capnp::AnyPointer, capnp::AnyPointer>) /home/admin/actions-runner/_work/_temp/build/src/ipc/libmultiprocess/include/mp/proxy.capnp.c++ (bitcoin-node+0xe0ea48)
     85    [#7](/bitcoin-bitcoin/7/) capnp::LocalClient::callInternal(unsigned long, unsigned short, capnp::CallContextHook&) <null> (bitcoin-node+0xe6abed) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     86    [#8](/bitcoin-bitcoin/8/) capnp::LocalClient::call(unsigned long, unsigned short, kj::Own<capnp::CallContextHook, std::nullptr_t>&&, capnp::Capability::Client::CallHints)::'lambda'()::operator()() const <null> (bitcoin-node+0xe6a63d) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     87    [#9](/bitcoin-bitcoin/9/) kj::Promise<void> kj::_::MaybeVoidCaller<kj::_::Void, kj::Promise<void>>::apply<capnp::LocalClient::call(unsigned long, unsigned short, kj::Own<capnp::CallContextHook, std::nullptr_t>&&, capnp::Capability::Client::CallHints)::'lambda'()>(capnp::LocalClient::call(unsigned long, unsigned short, kj::Own<capnp::CallContextHook, std::nullptr_t>&&, capnp::Capability::Client::CallHints)::'lambda'()&, kj::_::Void&&) <null> (bitcoin-node+0xe72851) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     88    [#10](/bitcoin-bitcoin/10/) kj::_::TransformPromiseNode<kj::Promise<void>, kj::_::Void, capnp::LocalClient::call(unsigned long, unsigned short, kj::Own<capnp::CallContextHook, std::nullptr_t>&&, capnp::Capability::Client::CallHints)::'lambda'(), kj::_::PropagateException>::getImpl(kj::_::ExceptionOrValue&) <null> (bitcoin-node+0xe72451) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     89    [#11](/bitcoin-bitcoin/11/) kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0::operator()() const async.c++ (bitcoin-node+0x10716f3) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     90    [#12](/bitcoin-bitcoin/12/) kj::Maybe<kj::Exception> kj::runCatchingExceptions<kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0>(kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_0&&) async.c++ (bitcoin-node+0x1061bb7) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     91    [#13](/bitcoin-bitcoin/13/) kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&) <null> (bitcoin-node+0x1061aab) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     92    [#14](/bitcoin-bitcoin/14/) kj::_::ChainPromiseNode::fire() <null> (bitcoin-node+0x1063ac4) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     93    [#15](/bitcoin-bitcoin/15/) non-virtual thunk to kj::_::ChainPromiseNode::fire() <null> (bitcoin-node+0x10644d9) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     94    [#16](/bitcoin-bitcoin/16/) kj::EventLoop::turn() <null> (bitcoin-node+0x105c635) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     95    [#17](/bitcoin-bitcoin/17/) kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation)::$_2::operator()() const async.c++ (bitcoin-node+0x1070484) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     96    [#18](/bitcoin-bitcoin/18/) void kj::WaitScope::runOnStackPool<kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation)::$_2>(kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation)::$_2&&) async.c++ (bitcoin-node+0x105e5a7) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     97    [#19](/bitcoin-bitcoin/19/) kj::_::waitImpl(kj::Own<kj::_::PromiseNode, kj::_::PromiseDisposer>&&, kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation) <null> (bitcoin-node+0x105e121) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     98    [#20](/bitcoin-bitcoin/20/) kj::Promise<unsigned long>::wait(kj::WaitScope&, kj::SourceLocation) /home/admin/actions-runner/_work/_temp/depends/x86_64-pc-linux-gnu/include/kj/async-inl.h:1359:3 (bitcoin-node+0xe17187) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
     99    [#21](/bitcoin-bitcoin/21/) mp::EventLoop::loop() /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/src/mp/proxy.cpp:244:68 (bitcoin-node+0xe11d71) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
    100    [#22](/bitcoin-bitcoin/22/) ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/capnp/protocol.cpp:136:21 (bitcoin-node+0x819606) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604)
    101    [#23](/bitcoin-bitcoin/23/) std::__1::__invoke_result_impl<void, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>::type std::__1::__invoke[abi:dee220100]<ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>(ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()&&) /cxx_build/include/c++/v1/__type_traits/invoke.h:90:27 (bitcoin-node+0x819606)
    102    [#24](/bitcoin-bitcoin/24/) void std::__1::__thread_execute[abi:dee220100]<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'(), 0ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>&, std::__1::__integer_sequence<unsigned long, 0ul>) /cxx_build/include/c++/v1/__thread/thread.h:161:3 (bitcoin-node+0x819606)
    103    [#25](/bitcoin-bitcoin/25/) void* std::__1::__thread_proxy[abi:dee220100]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, ipc::capnp::(anonymous namespace)::CapnpProtocol::startLoop(char const*)::'lambda'()>>(void*) /cxx_build/include/c++/v1/__thread/thread.h:169:3 (bitcoin-node+0x819606)
    104
    105SUMMARY: ThreadSanitizer: data race (/home/admin/actions-runner/_work/_temp/build/bin/bitcoin-node+0x1f093c) (BuildId: 777a2f17a2bf7616985ece2bd101be9be19e9604) in operator delete(void*, unsigned long)
    

    https://github.com/bitcoin/bitcoin/actions/runs/23000375935/job/66791524507?pr=34804#step:11:3525

     0==27808==ERROR: AddressSanitizer: heap-use-after-free on address 0x760561bf2468 at pc 0x646e8a5014c9 bp 0x75d55a31c930 sp 0x75d55a31c928
     1READ of size 8 at 0x760561bf2468 thread T11
     2    [#0](/bitcoin-bitcoin/0/) 0x646e8a5014c8 in mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const /home/admin/actions-runner/_work/_temp/src/ipc/libmultiprocess/src/mp/proxy.cpp:421:19
     3    [#1](/bitcoin-bitcoin/1/) 0x646e8a5014c8 in void std::__invoke_impl<void, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>(std::__invoke_other, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0&&) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:61:14
     4    [#2](/bitcoin-bitcoin/2/) 0x646e8a5014c8 in std::__invoke_result<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>::type std::__invoke<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>(mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0&&) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:96:14
     5    [#3](/bitcoin-bitcoin/3/) 0x646e8a5014c8 in void std::thread::_Invoker<std::tuple<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>>::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_thread.h:292:13
     6    [#4](/bitcoin-bitcoin/4/) 0x646e8a5014c8 in std::thread::_Invoker<std::tuple<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>>::operator()() /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_thread.h:299:11
     7    [#5](/bitcoin-bitcoin/5/) 0x646e8a5014c8 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>>>::_M_run() /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_thread.h:244:13
     8    [#6](/bitcoin-bitcoin/6/) 0x79d563033db3  (/lib/x86_64-linux-gnu/libstdc++.so.6+0xecdb3) (BuildId: 753c6c8608b61d4e67be8f0c890e03e0aa046b8b)
     9    [#7](/bitcoin-bitcoin/7/) 0x646e8902e85a in asan_thread_start(void*) crtstuff.c
    10    [#8](/bitcoin-bitcoin/8/) 0x79d562ca5aa3  (/lib/x86_64-linux-gnu/libc.so.6+0x9caa3) (BuildId: 8e9fd827446c24067541ac5390e6f527fb5947bb)
    11    [#9](/bitcoin-bitcoin/9/) 0x79d562d32c6b  (/lib/x86_64-linux-gnu/libc.so.6+0x129c6b) (BuildId: 8e9fd827446c24067541ac5390e6f527fb5947bb)
    12
    130x760561bf2468 is located 8 bytes inside of 32-byte region [0x760561bf2460,0x760561bf2480)
    14freed by thread T2 (b-capnp-loop) here:
    15    [#0](/bitcoin-bitcoin/0/) 0x646e89075f66 in operator delete(void*, unsigned long) (/home/admin/actions-runner/_work/_temp/build/bin/bitcoin-node+0x1408f66) (BuildId: 89995cb68dd51cd207c97d4b8e372df7e8c677d2)
    16    [#1](/bitcoin-bitcoin/1/) 0x79d5635559d9  (/lib/x86_64-linux-gnu/libcapnp-rpc-1.0.1.so+0x489d9) (BuildId: 44717f0ad52d0e372420b8de2d7701bfba298f14)
    17    [#2](/bitcoin-bitcoin/2/) 0x79d563586a13  (/lib/x86_64-linux-gnu/libcapnp-rpc-1.0.1.so+0x79a13) (BuildId: 44717f0ad52d0e372420b8de2d7701bfba298f14)
    18    [#3](/bitcoin-bitcoin/3/) 0x79d5635872b6  (/lib/x86_64-linux-gnu/libcapnp-rpc-1.0.1.so+0x7a2b6) (BuildId: 44717f0ad52d0e372420b8de2d7701bfba298f14)
    19    [#4](/bitcoin-bitcoin/4/) 0x79d56358a505  (/lib/x86_64-linux-gnu/libcapnp-rpc-1.0.1.so+0x7d505) (BuildId: 44717f0ad52d0e372420b8de2d7701bfba298f14)
    20    [#5](/bitcoin-bitcoin/5/) 0x79d56359d42b  (/lib/x86_64-linux-gnu/libcapnp-rpc-1.0.1.so+0x9042b) (BuildId: 44717f0ad52d0e372420b8de2d7701bfba298f14)
    21    [#6](/bitcoin-bitcoin/6/) 0x79d5633e961c in kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&) (/lib/x86_64-linux-gnu/libkj-async-1.0.1.so+0x3e61c) (BuildId: 356b68ed6bfbcc99793859e96d335850186ca5da)
    22    [#7](/bitcoin-bitcoin/7/) 0x79d5633e9694 in kj::_::TransformPromiseNodeBase::getDepResult(kj::_::ExceptionOrValue&) (/lib/x86_64-linux-gnu/libkj-async-1.0.1.so+0x3e694) (BuildId: 356b68ed6bfbcc99793859e96d335850186ca5da)
    23    [#8](/bitcoin-bitcoin/8/) 0x79d56359ae20  (/lib/x86_64-linux-gnu/libcapnp-rpc-1.0.1.so+0x8de20) (BuildId: 44717f0ad52d0e372420b8de2d7701bfba298f14)
    24    [#9](/bitcoin-bitcoin/9/) 0x79d5633e961c in kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&) (/lib/x86_64-linux-gnu/libkj-async-1.0.1.so+0x3e61c) (BuildId: 356b68ed6bfbcc99793859e96d335850186ca5da)
    25    [#10](/bitcoin-bitcoin/10/) 0x79d5633e52e6  (/lib/x86_64-linux-gnu/libkj-async-1.0.1.so+0x3a2e6) (BuildId: 356b68ed6bfbcc99793859e96d335850186ca5da)
    26  Stack after return:      f5
    27  Stack use after scope:   f8
    28  Global redzone:          f9
    29  Global init order:       f6
    30  Poisoned by user:        f7
    31  Container overflow:      fc
    32  Array cookie:            ac
    33  Intra object redzone:    bb
    34  ASan internal:           fe
    35  Left alloca redzone:     ca
    36  Right alloca redzone:    cb
    37==27808==ABORTING 
    
  6. DrahtBot added the label CI failed on Mar 12, 2026
  7. ryanofsky commented at 4:40 pm on March 12, 2026: contributor
    Thanks fanquake looks like both of these errors are caused by the new hooks added for testng, so not very surprising. The tests were automatically generated and pretty close to being right but have a number of issues and I’m rewriting them.
  8. ryanofsky force-pushed on Mar 12, 2026
  9. ryanofsky commented at 6:11 pm on March 12, 2026: contributor
    Rebased 6fd7194d8167176d96858097236eb3f9658fd124 -> 6350dc920899d0b3b44022f4671e37c4f0386bfb (pr/subtree-9.2 -> pr/subtree-9.3, compare) based on https://github.com/bitcoin-core/libmultiprocess/pull/249 pr/disraces.3
  10. DrahtBot removed the label CI failed on Mar 12, 2026
  11. Sjors commented at 2:06 pm on March 13, 2026: member

    I think you need a functional test adjustment. Based on local TSan testing this seems to do the trick:

     0diff --git a/test/functional/interface_ipc.py b/test/functional/interface_ipc.py
     1index 16ec03079b..b10aeb8667 100755
     2--- a/test/functional/interface_ipc.py
     3+++ b/test/functional/interface_ipc.py
     4@@ -110,17 +110,17 @@ class IPCInterfaceTest(BitcoinTestFramework):
     5             with node.assert_debug_log(expected_msgs=["BlockTemplate.waitNext", "IPC server post request"], timeout=2):
     6                 promise = template.waitNext(ctx, waitoptions)
     7                 await asyncio.sleep(0.1)
     8-            disconnected_log_check.enter_context(node.assert_debug_log(expected_msgs=["IPC server: socket disconnected", "canceled while executing"], timeout=2))
     9+            disconnected_log_check.enter_context(node.assert_debug_log(expected_msgs=["IPC server: socket disconnected", "canceled "], timeout=2))
    10             del promise
    11
    12         asyncio.run(capnp.run(async_routine()))
    13
    14-        # Wait for socket disconnected log message, then generate a block to
    15-        # cause the waitNext() call to return a new template. Look for a
    16-        # canceled IPC log message after waitNext returns.
    17-        with node.assert_debug_log(expected_msgs=["interrupted (canceled)"], timeout=2):
    18-            disconnected_log_check.close()
    19-            self.generate(node, 1)
    20+        disconnected_log_check.close()
    21+        self.generate(node, 1)
    22
    23     def run_thread_busy_test(self):
    24         """Test behavior when sending multiple calls to the same server thread
    
  12. fanquake added this to the milestone 31.0 on Mar 19, 2026
  13. ismaelsadeeq commented at 3:23 pm on March 25, 2026: member
    Concept ACK
  14. ryanofsky force-pushed on Mar 26, 2026
  15. ryanofsky commented at 1:54 pm on March 26, 2026: contributor

    Rebased 6350dc920899d0b3b44022f4671e37c4f0386bfb -> ea973241293c4c480987f7c164a069afa1747bdc (pr/subtree-9.3 -> pr/subtree-9.4, compare) on updated base https://github.com/bitcoin-core/libmultiprocess/pull/249 pr/disraces.7

    Rebased ea973241293c4c480987f7c164a069afa1747bdc -> 16d6ab5eca3207c372861b52c64c7fb36c166c9d (pr/subtree-9.4 -> pr/subtree-9.5, compare) after https://github.com/bitcoin-core/libmultiprocess/pull/249 merge

  16. DrahtBot added the label CI failed on Mar 26, 2026
  17. Squashed 'src/ipc/libmultiprocess/' changes from 1868a84451f..70f632bda8f
    70f632bda8f Merge bitcoin-core/libmultiprocess#265: ci: set LC_ALL in shell scripts
    8e8e564259a Merge bitcoin-core/libmultiprocess#249: fixes for race conditions on disconnects
    05d34cc2ec3 ci: set LC_ALL in shell scripts
    e606fd84a8c Merge bitcoin-core/libmultiprocess#264: ci: reduce nproc multipliers
    ff0eed1bf18 refactor: Use loop variable in type-context.h
    ff1d8ba172a refactor: Move type-context.h getParams() call closer to use
    1dbc59a4aa3 race fix: m_on_cancel called after request finishes
    1643d05ba07 test: m_on_cancel called after request finishes
    f5509a31fcc race fix: getParams() called after request cancel
    4a60c39f24a test: getParams() called after request cancel
    f11ec29ed20 race fix: worker thread destroyed before it is initialized
    a1d643348f4 test: worker thread destroyed before it is initialized
    336023382c4 ci: reduce nproc multipliers
    b090beb9651 Merge bitcoin-core/libmultiprocess#256: ci: cache gnu32 nix store
    be8622816da ci: cache gnu32 nix store
    975270b619c Merge bitcoin-core/libmultiprocess#263: ci: bump timeout factor to 40
    09f10e5a598 ci: bump timeout factor to 40
    db8f76ad290 Merge bitcoin-core/libmultiprocess#253: ci: run some Bitcoin Core CI jobs
    55a9b557b19 ci: set Bitcoin Core CI test repetition
    fb0fc84d556 ci: add TSan job with instrumented libc++
    0f29c38725b ci: add Bitcoin Core IPC tests (ASan + macOS)
    3f64320315d Merge bitcoin-core/libmultiprocess#262: ci: enable clang-tidy in macOS job, use nullptr
    cd9f8bdc9f0 Merge bitcoin-core/libmultiprocess#258: log: add socket connected info message and demote destroy logs to debug
    b5d6258a42f Merge bitcoin-core/libmultiprocess#255: fix: use unsigned char cast and sizeof in LogEscape escape sequence
    d94688e2c32 Merge bitcoin-core/libmultiprocess#251: Improved CustomBuildField for std::optional in IPC/libmultiprocess
    a9499fad755 mp: use nullptr with pthread_threadid_np
    f499e37850f ci: enable clang-tidy in macOS job
    98f1352159d log: add socket connected info message and demote destroy logs to debug
    554a481ea73 fix: use unsigned char cast and sizeof in LogEscape escape sequence
    1977b9f3f65 Use std::forward in CustomBuildField for std::optional to allow move semantics, resolves FIXME
    22bec918c97 Merge bitcoin-core/libmultiprocess#247: type-map: Work around LLVM 22 "out of bounds index" error
    8a5e3ae6ed2 Merge bitcoin-core/libmultiprocess#242: proxy-types: add CustomHasField hook to map Cap'n Proto values to null C++ values
    e8d35246918 Merge bitcoin-core/libmultiprocess#246: doc: Bump version 8 > 9
    97d877053b6 proxy-types: add CustomHasField hook for nullable decode paths
    8c2f10252c9 refactor: add missing includes to mp/type-data.h
    b1638aceb40 doc: Bump version 8 > 9
    f61af487217 type-map: Work around LLVM 22 "out of bounds index" error
    
    git-subtree-dir: src/ipc/libmultiprocess
    git-subtree-split: 70f632bda8f80449b6240f98da768206a535a04e
    2478a15ef9
  18. Merge commit '2478a15ef966cc93d47dd0f461a44be39bc51534' into pr/subtree-9 613a548648
  19. ryanofsky referenced this in commit 70f632bda8 on Mar 27, 2026
  20. ryanofsky force-pushed on Mar 27, 2026
  21. ryanofsky marked this as ready for review on Mar 27, 2026
  22. DrahtBot removed the label CI failed on Mar 27, 2026
  23. Sjors commented at 7:42 pm on March 27, 2026: member
    ACK 16d6ab5eca3207c372861b52c64c7fb36c166c9d
  24. DrahtBot requested review from ismaelsadeeq on Mar 27, 2026
  25. ryanofsky force-pushed on Mar 30, 2026
  26. ryanofsky commented at 1:29 am on March 30, 2026: contributor
    Rebased 16d6ab5eca3207c372861b52c64c7fb36c166c9d -> 613a548648880314e78c3045d0ded12e29a4f036 (pr/subtree-9.5 -> pr/subtree-9.6, compare) onto an earlier commit with no changes, to allow the same branch to be merged into 31.x in another PR (#34952)
  27. Sjors commented at 6:51 am on March 30, 2026: member
    Good catch. @maflcko could we tweak @DrahtBot to comment on subtree update pull request with something like: this subtree update is applied after the 30.x branch-off, if you intend to backport this to earlier realeases, consider rebasing on … or earlier.
  28. Sjors referenced this in commit 35411ae38f on Mar 30, 2026
  29. Sjors commented at 7:28 am on March 30, 2026: member
    ACK 613a548648880314e78c3045d0ded12e29a4f036
  30. ismaelsadeeq commented at 10:35 am on March 30, 2026: member

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

    ACK 613a548648880314e78c3045d0ded12e29a4f036

     0> git remote add --fetch  libmultiprocess https://github.com/bitcoin-core/libmultiprocess.git
     1> 
     2>  test/lint/git-subtree-check.sh src/ipc/libmultiprocess
     3src/ipc/libmultiprocess in HEAD currently refers to tree ba44c03037cc8cc6ec9ddda616dda5e261e0ca60
     4src/ipc/libmultiprocess in HEAD was last updated in commit 2478a15ef966cc93d47dd0f461a44be39bc51534 (tree ba44c03037cc8cc6ec9ddda616dda5e261e0ca60)
     5GOOD
     6
     7> test/lint/git-subtree-check.sh -r src/ipc/libmultiprocess
     8
     9src/ipc/libmultiprocess in HEAD currently refers to tree ba44c03037cc8cc6ec9ddda616dda5e261e0ca60
    10src/ipc/libmultiprocess in HEAD was last updated in commit 2478a15ef966cc93d47dd0f461a44be39bc51534 (tree ba44c03037cc8cc6ec9ddda616dda5e261e0ca60)
    11src/ipc/libmultiprocess in HEAD was last updated to upstream commit 70f632bda8f80449b6240f98da768206a535a04e (tree ba44c03037cc8cc6ec9ddda616dda5e261e0ca60)
    12GOOD
    
  31. fanquake merged this on Mar 30, 2026
  32. fanquake closed this on Mar 30, 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-04-08 03:13 UTC

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