Avoid errors from asynchronous (non-c++) clients #240

pull ryanofsky wants to merge 2 commits into bitcoin-core:master from ryanofsky:pr/promise changing 10 files +203 −65
  1. ryanofsky commented at 4:06 am on January 21, 2026: collaborator
    The PR avoids errors from non-C++ rust & python clients when they make asynchronous requests (https://github.com/bitcoin/bitcoin/issues/33923) and unclean disconnects (https://github.com/bitcoin/bitcoin/issues/34250). Neither of these errors are easily possible to trigger from libmultiprocess clients because of its blocking interface and RAII semantics, but they are fairly easy to trigger from rust and python and there is a test triggering both of them in https://github.com/bitcoin/bitcoin/pull/34284
  2. Allow simultaneous calls on same Context.thread
    If multiple IPC requests happen at the same time specifying same Context.thread
    to run the requests on, queue the requests to execute in the order they are
    received instead of raising a "thread busy" exception.
    
    This change has no effect on C++ clients using libmultiprocess as a client
    library, since the libmultiprocess client only makes blocking calls and creates
    a server thread for every client thread, so it's not possible for there to be
    multiple calls on the same server thread.
    
    But this change may be useful for rust and python clients as discussed
    https://github.com/bitcoin/bitcoin/issues/33923
    7d2818339a
  3. Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer
    This is a potential fix for https://github.com/bitcoin/bitcoin/issues/34250
    which reports that bitcoin node crashes if a rust stratrumv2 mining client
    calls BlockTemplate.waitNext() and disconnects without waiting for a response
    from the call, and if mempool fees increased so the call returns a non-null
    interface BlockTemplate pointer.
    
    The node would crash in this case while trying to call MakeProxyServer on the
    returned BlockTemplate pointer, which would fail because MakeProxyServer would
    try to use a reference to the Connection object that had been deleted as a as a
    result of the disconnect.
    
    The fix works by:
    
    - Adding a Connection::m_canceler member variable and using it to cancel any
      IPC response promises that are pending when the connection is destroyed.
    
    - Updating type-context.h PassField() function to use promise.attach() as
      described https://capnproto.org/cxxrpc.html#cancellation to detect
      cancellation and set a ServerContext::m_cancelled variable.
    
    - Updating ServerCall to check the ServerContext::m_cancelled status after any
      C++ server method returns, and throw an exception if it is set.
    
    - Updating type-context.h PassField() function to deal with the exception
      by catching and logging it, and to deal with cancelled status by not
      trying to fulfill the cancelled promise.
    92a2c5f662
  4. DrahtBot commented at 4:07 am on January 21, 2026: none

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

    Reviews

    See the guideline for information on the review process. A summary of reviews will appear here.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #218 (Better error and log messages by ryanofsky)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  5. ryanofsky force-pushed on Jan 22, 2026
  6. ryanofsky commented at 2:40 am on January 22, 2026: collaborator
    Updated ba865d9d7bffc391f66566ccea18f0a2b6be84e0 -> 92a2c5f66282c9f8e283366be221790056c80d22 (pr/promise.1 -> pr/promise.2, compare) fixing various ci errors (iwyu, compiler errors) https://github.com/bitcoin-core/libmultiprocess/actions/runs/21196838571

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin-core/libmultiprocess. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-01-27 07:30 UTC

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