#36097 mining: replace interrupt methods with cancellation arguments

full analysis

https://github.com/bitcoin/bitcoin/pull/36097 · xyzconstant · +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.

Data

dossier JSON · extract JSON · model openrouter/google/gemini-3.8-flash, generated 2026-09-17T21:47, confidence high, input hash 76191f9896c36413