#36097 mining: replace interrupt methods with cancellation arguments
https://github.com/bitcoin/bitcoin/pull/36097 · · +2175/-615 in 70 files, 2 commits · labels: Mining, CI failed · draft
Goal
- Allow multi-process mining clients to cancel blocking calls cleanly within requests
- Eliminate ad-hoc interrupt calls and protocol race conditions in external mining interfaces
This PR adds cancellation arguments (`CancelArg`) to blocking mining methods (`waitTipChanged`, `createNewBlock`, and `BlockTemplate::waitNext`), replacing and deprecating the existing `interrupt()` and `interruptWait()` methods. It leverages Cap'n Proto request cancellation support from libmultiprocess so clients can cancel in-flight blocking calls natively rather than issuing separate IPC interrupt calls.
Problem: Blocking mining interface calls over IPC currently require dedicated, out-of-band interrupt methods to abort in-flight requests, which adds API complexity and cannot easily cancel individual calls without canceling all concurrent calls.
Category: IPC / multiprocess (#7 of 20)
P3 · interface
- P2 because it adds native request cancellation across the IPC boundary
- Removes ad-hoc interrupt calls and simplifies multi-language client implementations
- Establishes a reusable pattern for future cancellable blocking IPC calls
P3 because it standardizes request cancellation across the IPC interface. Ryanofsky noted that using native Cap'n Proto cancellation allows clients across languages to abort blocking calls cleanly without having to issue separate IPC calls.
Membership: Implements native Cap'n Proto request cancellation over IPC using Proxy annotations and extra parameters.
Factors: security/stability 0, bug 0, performance 1, user value 2, leverage 2
Category: Mining (#5 of 13)
P3 · cleanup
- P3 because existing interrupt behavior already functions
- Improves interface ergonomics and stability for external template providers
- Does not affect critical consensus or mining correctness logic
P3 because it modernizes the mining block template assembly and notification interface for external consumers like Stratum v2 providers, replacing ad-hoc interrupt methods with call-scoped cancellation.
Membership: Modifies `interfaces::Mining` blocking methods to accept `CancelArg` and deprecates mining interrupt methods.
Factors: security/stability 0, bug 0, performance 0, user value 1, leverage 1
Reviewability: Stale: CI failing
- CI is failing
- Temporarily vendors an unmerged upstream commit from libmultiprocess
CI is failing on the current commit, and the first commit contains a temporary libmultiprocess subtree update pending upstream PR libmultiprocess#342.
Author status: active, force-pushed updates on 2026-09-11 tracking upstream changes in libmultiprocess
Agreement: Strong
- Strong support for native cancellation simplifying client and server interactions (ryanofsky)
- No objections raised
Strong concept and approach support from ryanofsky; no objections raised
ryanofsky welcomed the change as an end-to-end demonstration of native cancellation that simplifies client and server interactions.
- ryanofsky (2026-08-27): 'With that change rust, python, and c++ clients can now cancel blocking requests more simply and efficiently using cap'n protos native cancellation mechanism, instead of needing to make new IPC calls to cancel previous ones.'
Objections: none enumerated.
Support:
- ryanofsky: clients can cancel blocking requests more simply and efficiently using native cancellation instead of issuing new IPC calls
Participants: ryanofsky (support)
State derived from the lists: substantive support, no open objection (ryanofsky)
Review verdicts (DrahtBot): 0
Files
65 lines under test/bench/ci.
- src/ipc/libmultiprocess/test/mp/test/test.cpp +299/-7
- src/ipc/libmultiprocess/src/mp/util.cpp +216/-31
- src/ipc/libmultiprocess/test/mp/test/connect_tests.cpp +212/-0
- src/ipc/libmultiprocess/include/mp/proxy-types.h +132/-29
- src/ipc/libmultiprocess/src/mp/proxy.cpp +106/-47
- src/ipc/libmultiprocess/include/mp/proxy-io.h +102/-44
- src/ipc/libmultiprocess/src/mp/gen.cpp +94/-44
- src/ipc/libmultiprocess/test/mp/test/listen_tests.cpp +48/-77
- src/ipc/libmultiprocess/test/mp/test/foo-types.h +98/-0
- src/ipc/capnp/common-types.h +94/-0
- src/ipc/libmultiprocess/include/mp/util.h +67/-21
- src/ipc/libmultiprocess/test/mp/test/unixlistener.h +84/-0
- src/ipc/libmultiprocess/CMakeLists.txt +16/-62
- src/ipc/libmultiprocess/test/mp/test/foo.h +69/-1
- src/interfaces/types.h +51/-0
- src/ipc/libmultiprocess/cmake/compat_config.cmake +0/-42
- test/functional/interface_ipc_mining.py +19/-22
- src/ipc/libmultiprocess/include/mp/type-context.h +27/-13
- src/ipc/libmultiprocess/include/mp/type-number.h +24/-15
- src/ipc/libmultiprocess/ci/scripts/ci.sh +34/-1
- src/node/interfaces.cpp +20/-15
- src/ipc/libmultiprocess/.github/workflows/ci.yml +19/-14
- src/ipc/libmultiprocess/test/mp/test/spawn_tests.cpp +28/-5
- src/interfaces/mining.h +18/-14
- src/ipc/libmultiprocess/include/mp/type-chrono.h +25/-2
- src/ipc/libmultiprocess/test/mp/test/common.h +27/-0
- src/ipc/libmultiprocess/include/mp/type-struct.h +12/-12
- src/ipc/libmultiprocess/include/mp/type-interface.h +10/-10
- src/ipc/libmultiprocess/shell.nix +13/-6
- src/ipc/test/ipc_tests.cpp +18/-0
- src/test/miner_tests.cpp +18/-0
- src/ipc/test/ipc_test.h +17/-0
- src/ipc/capnp/mining.capnp +11/-5
- src/ipc/libmultiprocess/.clang-tidy +12/-2
- src/ipc/libmultiprocess/include/mp/proxy.h +8/-6
- src/ipc/libmultiprocess/test/mp/test/foo.capnp +14/-0
- src/ipc/libmultiprocess/.github/workflows/bitcoin-core-ci.yml +8/-5
- src/ipc/libmultiprocess/example/calculator.cpp +4/-9
- src/ipc/libmultiprocess/example/printer.cpp +4/-9
- src/ipc/libmultiprocess/example/example.cpp +7/-5
- src/ipc/libmultiprocess/include/mp/type-char.h +9/-3
- src/ipc/libmultiprocess/ci/scripts/run.sh +6/-4
- src/ipc/libmultiprocess/doc/versions.md +8/-2
- src/ipc/libmultiprocess/ci/configs/netbsd.bash +1/-7
- src/ipc/libmultiprocess/cmake/pthread_checks.cmake +8/-0
- src/ipc/libmultiprocess/include/mp/type-threadmap.h +4/-4
- src/ipc/libmultiprocess/ci/configs/newdeps.bash +6/-0
- src/ipc/libmultiprocess/doc/usage.md +6/-0
- src/ipc/libmultiprocess/include/mp/proxy.capnp +6/-0
- test/functional/test_framework/ipc_util.py +6/-0
- src/ipc/libmultiprocess/ci/configs/olddeps.bash +4/-1
- src/ipc/libmultiprocess/include/mp/type-data.h +2/-3
- src/ipc/libmultiprocess/ci/configs/sanitize.bash +2/-2
- src/ipc/libmultiprocess/ci/scripts/config.sh +2/-2
- src/ipc/libmultiprocess/doc/design.md +2/-2
- src/ipc/libmultiprocess/include/mp/type-string.h +3/-1
- src/ipc/libmultiprocess/ci/configs/default.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/freebsd.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/llvm.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/macos.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/openbsd.bash +1/-1
- src/ipc/libmultiprocess/cmake/TargetCapnpSources.cmake +1/-1
- src/ipc/libmultiprocess/doc/install.md +1/-1
- src/ipc/libmultiprocess/include/mp/type-function.h +1/-1
- src/ipc/libmultiprocess/include/mp/type-map.h +2/-0
- src/ipc/libmultiprocess/include/mp/version.h +1/-1
- src/ipc/libmultiprocess/ci/README.md +1/-0
- src/ipc/libmultiprocess/include/mp/config.h.in +1/-0
- src/ipc/libmultiprocess/test/CMakeLists.txt +1/-0
- src/ipc/test/ipc_test.capnp +1/-0
Card
This PR updates the mining IPC interface to accept cancellation arguments on blocking calls (such as waitNext and createNewBlock) and deprecates the dedicated interrupt methods. It leverages Cap'n Proto native request cancellation, simplifying client implementations such as Stratum v2 services by avoiding extra round-trip interrupt calls. Ryanofsky strongly endorsed the approach as a cleaner, more robust IPC pattern. Review of the Core code is possible now, though the PR includes a temporary subtree commit dependent on upstream libmultiprocess#342 and CI is currently failing.