#36097 mining: replace interrupt methods with cancellation arguments

ReviewabilityReviewsAgreementSize
#36097 xyzconstant mining: replace interrupt methods with cancellation argumentsCI failing0Strong2,133 + 43 tests
  • Simplify canceling in-flight blocking mining requests over IPC
  • Eliminate extra round-trips and awkward out-of-band interrupt coordination for mining clients
  • CI is failing; check whether the failure is from this PR before deep review
  • No review verdicts recorded
  • Substantive support with no open objections
  • Direct cancellation simplifies both clients and servers over issuing separate interrupt calls (ryanofsky)
  • 2,133 lines added or modified outside tests
  • 43 lines added or modified in tests
  • 616 lines removed in total
  • 70 files, 2 commits
IPC / multiprocess#7 of 18
P2 · new feature
  • P2 because it integrates native request cancellation into libmultiprocess and the interface layer
  • Allows IPC clients to cancel in-flight blocking calls directly without coordinating extra calls
  • Ranking pass: Moved up: it changes mining IPC call mechanics (cancellation via promises) per agreed RFC #33575, affecting external consumers' interface stability more than the other P2s.
Mining#10 of 17
P3 · cleanup
  • P3 because it improves interface ergonomics and avoids round-trips for callers like Stratum v2
  • Working interrupt mechanisms already exist, making this cleanup reasonably deferrable
Reviewability: ReadyStalePaused
Agreement: StrongPositivePositive w/ caveatsNeutralMildDisputedBlockedCrickets
Reviews: current code-review ACKs, then (+stale ACKs) and -NACKs; greener = more ACKs.
Size: lines added or modified outside tests, then in tests; greener = smaller.

Goal

Add cancellation arguments (`CancelArg`) to blocking mining interface methods (`waitTipChanged`, `createNewBlock`, and `BlockTemplate::waitNext`), deprecating `interrupt()` and `interruptWait()`. Using Cap'n Proto request cancellation via annotations in `mining.capnp`, in-flight IPC calls can be canceled directly by dropping the request promise rather than issuing separate interrupt calls.

Problem: Canceling in-flight blocking mining interface calls over IPC requires separate, out-of-band interrupt calls that add API complexity and extra round-trips, making targeted cancellation of individual requests cumbersome.

Evidence of importance:

  • PR description: 'The blocking methods (waitTipChanged, createNewBlock, and BlockTemplate::waitNext) currently rely on interrupt()/interruptWait() to cancel them when they are in progress (#33676, #34184). With request cancellation support in libmultiprocess (bitcoin-core/libmultiprocess#342), this is no longer needed.'
  • PR description: 'Additional note: this is the Bitcoin Core side of approach 4 in #33575.'

Scope: Contains a temporary commit updating the `src/ipc/libmultiprocess` subtree to include unmerged changes from libmultiprocess PR #342.

Risk of a mistake: medium (other, tests). Mistakes in IPC request cancellation or callback lifecycle management could trigger use-after-free conditions or leave mining calls permanently blocked.

Changed since the previous assessment: Rebased and updated against newer libmultiprocess subtree commits.

Reviewability

Ready · CI failing

CI is red; check whether the failure is the PR's before a deep review.

Waiting on (from the thread read):

  • reviewer: review of updated PR after matching upstream libmultiprocess changes 2026-09-11
  • reviewer: review of the updated PR matching upstream libmultiprocess changes 2026-09-11

Agreement

Strong

substantive support, no open objection (ryanofsky)

Thread notes: Author updated the PR to match upstream libmultiprocess changes in c:5640367936; no objections or suggestions have been raised. / Re-read confirmed ryanofsky's comment contains no objections or suggestions. Author pushed an update (c:5640367936) tracking upstream libmultiprocess changes.

Objections, suggestions, and questions: none recorded.

Support:

  • ryanofsky (member) (2026-08-27) [read: src/node/interfaces.cpp]: clients can cancel blocking requests more simply and efficiently using native cancellation instead of issuing new IPC calls, simplifying both clients and servers

Participants:

  • ryanofsky (member, support, 1 statements 2026-08-27 to 2026-08-27): praised the approach, noting clients can cancel blocking requests more simply and efficiently using native cancellation instead of new IPC calls

Dependencies

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/test/ipc_tests.cpp +19/-1
  • src/ipc/libmultiprocess/shell.nix +13/-6
  • 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

The short text the ranking pass compares across PRs.

This PR replaces dedicated out-of-band interrupt methods on the mining IPC interface with cancellation arguments on blocking calls (waitTipChanged, createNewBlock, and waitNext). It allows IPC clients such as Stratum v2 services to cancel in-flight blocking requests natively by dropping Cap'n Proto promises. The change implements the design agreed upon in RFC #33575. It depends on upstream libmultiprocess#342, included here as a temporary subtree commit.

Data

dossier JSON · extract JSON · model ledger, generated 2026-10-10T01:21, confidence high, input hash 52a7fd8f9a3c27e7
thread read through 2026-09-11 (2 statements), head a4e7b2ed87
labels: Mining, CI failed · draft

Categories

IPC / multiprocess

P2 · new feature (ranking pass: Moved up: it changes mining IPC call mechanics (cancellation via promises) per agreed RFC #33575, affecting external consumers' interface stability more than the other P2s.)

Integrates native Cap'n Proto request cancellation into libmultiprocess and the interface layer. This allows IPC clients to cancel in-flight blocking calls simply by dropping request promises instead of coordinating separate out-of-band interrupt calls.

Membership: Touches src/ipc/libmultiprocess, capnp interface definitions, and interfaces:: types to support native IPC request cancellation.

Factors: security/stability 0, bug 0, performance 1, user value 1, leverage 2

Mining

P3 · cleanup

Replaces out-of-band interrupt() and interruptWait() calls with cancellation arguments on blocking mining interface methods (waitTipChanged, createNewBlock, waitNext). While improving interface ergonomics and eliminating extra round-trips for external consumers like Stratum v2 providers, the change is reasonably deferrable as working interrupt mechanisms already exist.

Membership: Carries the Mining label and modifies blocking methods in src/interfaces/mining.h and src/ipc/capnp/mining.capnp.

Factors: security/stability 0, bug 0, performance 1, user value 1, leverage 2