#36097 mining: replace interrupt methods with cancellation arguments
| Reviewability | Reviews | Agreement | Size | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| #36097 mining: replace interrupt methods with cancellation arguments | CI failing | 0 | Strong | 2,133 + 43 tests | ||||||
|
|
|
|
| ||||||
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
Depends on: #bitcoin-core/libmultiprocess#342
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
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