[POC] Full Libevent removal #34411

pull fanquake wants to merge 40 commits into bitcoin:master from fanquake:full_libevent_removal changing 55 files +2997 −1489
  1. fanquake commented at 12:35 pm on January 26, 2026: member

    This builds on all the work being done by pinheadmz and fjahr (#32061, #34342, #34158), to demo a libevent-less bitcoind.

    One thing we could decide to change, or not, is the libevent logging catergory. Other than that, any remaining references to libevent, should be in documentation/code comments.

  2. DrahtBot commented at 12:35 pm on January 26, 2026: contributor

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

    Code Coverage & Benchmarks

    For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/34411.

    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:

    • #34495 (Replace boost signals with minimal compatible implementation by theuni)
    • #34486 (net: Reduce local network activity when networkactive=0 by willcl-ark)
    • #34158 (torcontrol: Remove libevent usage by fjahr)
    • #34143 (build: Prevent system header fallback and include path pollution by hebasto)
    • #33689 (http: replace WorkQueue and single threads handling for ThreadPool by furszy)
    • #32297 (bitcoin-cli: Add -ipcconnect option by ryanofsky)
    • #32061 (Replace libevent with our own HTTP and socket-handling implementation by pinheadmz)
    • #31929 (http: Make server shutdown more robust by hodlinator)
    • #31723 (qa: Facilitate debugging bitcoind inside functional tests by hodlinator)
    • #31425 (RFC: Riscv bare metal CI job by sedited)
    • #26812 (test: add end-to-end tests for CConnman and PeerManager by vasild)
    • #26022 (Add util::ResultPtr class by ryanofsky)
    • #25665 (refactor: Add util::Result failure types and ability to merge result values by ryanofsky)
    • #21283 (Implement BIP 370 PSBTv2 by achow101)

    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.

    LLM Linter (✨ experimental)

    Possible typos and grammar issues:

    • Unrecoverbale -> Unrecoverable [spelling error in comment makes the word invalid]

    Possible places where named args for integral literals may be used (e.g. func(x, /*named_arg=*/0) in C++, and func(x, named_arg=0) in Python):

    • [LookupHost(m_host, 256, true)] in src/bitcoin-cli.cpp
    • [Lookup(i->first, i->second, false)] in src/httpserver.cpp
    • [Lookup(“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaam2dqd.onion”, 0, false)] in src/test/httpserver_tests.cpp
    • [Lookup(“0.0.0.0”, 0, false)] in src/test/httpserver_tests.cpp

    Possible places where comparison-specific test macros should replace generic comparisons:

    • [src/test/httpserver_tests.cpp] BOOST_CHECK_THROW(req.LoadControlData(reader), std::runtime_error) -> Use BOOST_CHECK_EXCEPTION(req.LoadControlData(reader), std::runtime_error, HasReason(“HTTP request line too short” or the exact expected message))
    • [src/test/httpserver_tests.cpp] BOOST_CHECK_THROW(req.LoadControlData(reader), std::runtime_error) -> Use BOOST_CHECK_EXCEPTION(req.LoadControlData(reader), std::runtime_error, HasReason(“HTTP request line malformed”))
    • [src/test/httpserver_tests.cpp] BOOST_CHECK_THROW(req.LoadControlData(reader), std::runtime_error) -> Use BOOST_CHECK_EXCEPTION(req.LoadControlData(reader), std::runtime_error, HasReason(“HTTP request line malformed”))
    • [src/test/httpserver_tests.cpp] BOOST_CHECK_THROW(req.LoadControlData(reader), std::runtime_error) -> Use BOOST_CHECK_EXCEPTION(req.LoadControlData(reader), std::runtime_error, HasReason(“HTTP request line malformed”))
    • [src/test/httpserver_tests.cpp] BOOST_CHECK_THROW(req.LoadHeaders(reader), std::runtime_error) -> Use BOOST_CHECK_EXCEPTION(req.LoadHeaders(reader), std::runtime_error, HasReason(“HTTP header missing colon (:)”))
    • [src/test/httpserver_tests.cpp] BOOST_CHECK_THROW(req.LoadBody(reader), std::runtime_error) -> Use BOOST_CHECK_EXCEPTION(req.LoadBody(reader), std::runtime_error, HasReason(“Cannot parse chunk length value”))
    • [src/test/httpserver_tests.cpp] BOOST_CHECK_THROW(req.LoadBody(reader), std::runtime_error) -> Use BOOST_CHECK_EXCEPTION(req.LoadBody(reader), std::runtime_error, HasReason(“Improperly terminated chunk”))

    No bare Python equality assertions needing replacement were found in the modified test/functional/ files.

    2026-02-09 10:24:25

  3. fanquake force-pushed on Jan 26, 2026
  4. DrahtBot added the label CI failed on Jan 26, 2026
  5. pinheadmz commented at 4:05 pm on January 26, 2026: member
    nit: Pull request description should be replaced by the lyrics of Taylor Swift’s “We Are Never Ever Getting Back Together” before merging.
  6. fanquake force-pushed on Jan 28, 2026
  7. fanquake force-pushed on Feb 2, 2026
  8. fanquake force-pushed on Feb 3, 2026
  9. http: enclose libevent-dependent code in a namespace
    This commit is a no-op to isolate HTTP methods and objects that
    depend on libevent. Following commits will add replacement objects
    and methods in a new namespace for testing and review before
    switching over the server.
    9404167f3b
  10. http: Implement HTTPHeaders class
    see:
    https://www.rfc-editor.org/rfc/rfc2616#section-4.2
    https://www.rfc-editor.org/rfc/rfc7231#section-5
    https://www.rfc-editor.org/rfc/rfc7231#section-7
    https://httpwg.org/specs/rfc9111.html#header.field.definitions
    293743602f
  11. http: Implement HTTPResponse class
    HTTP Response message:
    https://datatracker.ietf.org/doc/html/rfc1945#section-6
    
    Status line (first line of response):
    https://datatracker.ietf.org/doc/html/rfc1945#section-6.1
    
    Status code definitions:
    https://datatracker.ietf.org/doc/html/rfc1945#section-9
    
    This commit also moves StringToBuffer to test/util/str
    since it is now used in more than one test.
    7bb0702c60
  12. http: Implement HTTPRequest class
    HTTP Request message:
    https://datatracker.ietf.org/doc/html/rfc1945#section-5
    
    Request Line aka Control Line aka first line:
    https://datatracker.ietf.org/doc/html/rfc1945#section-5.1
    
    See message_read_status() in libevent http.c for how
    `MORE_DATA_EXPECTED` is handled there
    fc6d55cb53
  13. http: Introduce HTTPServer class and implement binding to listening socket
    Introduce a new low-level socket managing class `HTTPServer`.
    
    BindAndStartListening() was copied from CConnMan's BindListenPort()
    in net.cpp and modernized.
    
    Unit-test it with a new class `SocketTestingSetup` which mocks
    `CreateSock()` and will enable mock client I/O in future commits.
    
    Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
    719f01c102
  14. HTTPServer: implement and test AcceptConnection()
    AcceptConnection() is mostly copied from CConmann in net.cpp
    and then modernized.
    
    Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
    2f2177c294
  15. HTTPServer: generate sequential Ids for each newly accepted connection
    Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
    f42c800ae5
  16. http: Introduce HTTPClient class 8f4cfdf462
  17. HTTPServer: start an I/O loop in a new thread and accept connections
    Socket handling methods are copied from CConnMan:
    
    `CConnman::GenerateWaitSockets()`
    `CConnman::SocketHandlerListening()`
    `CConnman::ThreadSocketHandler()` and `CConnman::SocketHandler()` are combined into ThreadSocketHandler()`.
    
    Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
    c65df14185
  18. HTTPServer: read requests from connected clients
    `SocketHandlerConnected()` adapted from CConnman
    
    Testing this requires adding a new feature to the SocketTestingSetup,
    inserting a "request" payload into the mock client that connects
    to us.
    
    Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
    8417aaecbc
  19. HTTPserver: support "chunked" Transfer-Encoding 28d45f32a0
  20. HTTPServer: compose and send replies to connected clients
    Sockets-touching bits copied and adapted from `CConnman::SocketSendData()`
    
    Testing this requires adding a new feature to the SocketTestingSetup,
    returning the DynSock I/O pipes from the mock socket so the received
    data can be checked.
    
    Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
    ae85ea5004
  21. HTTPServer: disconnect clients 82bf3ffde0
  22. Allow http workers to send data optimistically as an optimization 88dc10682c
  23. HTTPServer: use a queue to pipeline requests from each connected client
    See https://www.rfc-editor.org/rfc/rfc7230#section-6.3.2
    
    > A server MAY process a sequence of pipelined requests in
      parallel if they all have safe methods (Section 4.2.1 of [RFC7231]),
      but it MUST send the corresponding responses in the same order that
      the requests were received.
    
    We choose NOT to process requests in parallel. They are executed in
    the order recevied as well as responded to in the order received.
    This prevents race conditions where old state may get sent in response
    to requests that are very quick to process but were requested later on
    in the queue.
    0bc7fd7708
  24. define HTTP request methods at module level outside of class
    This is a refactor to prepare for matching the API of HTTPRequest
    definitions in both namespaces http_bitcoin and http_libevent. In
    particular, to provide a consistent return type for GetRequestMethod()
    in both classes.
    1d15ab0092
  25. Add helper methods to HTTPRequest to match original API
    These methods are called by http_request_cb() and are present in the
    original http_libevent::HTTPRequest.
    eba25e52af
  26. refactor: split http_request_cb into libevent callback and dispatch
    The original function is passed to libevent as a callback when HTTP
    requests are received and processed. It wrapped the libevent request
    object in a http_libevent::HTTPRequest and then handed that off to
    bitcoin for basic checks and finally dispatch to worker threads.
    
    In this commit we split the function after the
    http_libevent::HTTPRequest is created, and pass that object to a new
    function that maintains the logic of checking and dispatching.
    
    This will be the merge point for http_libevent and http_bitcoin,
    where HTTPRequest objects from either namespace have the same
    downstream lifecycle.
    d74588e385
  27. refactor: split HTTPBindAddresses into config parse and libevent setup
    The original function was already naturally split into two chunks:
    First, we parse and validate the users' RPC configuration for IPs and
    ports. Next we bind libevent's http server to the appropriate
    endpoints.
    
    This commit splits these chunks into two separate functions, leaving
    the argument parsing in the common space of the module and moving the
    libevent-specific binding into the http_libevent namespace.
    
    A future commit will implement http_bitcoin::HTTPBindAddresses to
    bind the validate list of endpoints by the new HTTP server.
    a2e174687c
  28. HTTPServer: implement control methods to match legacy API 9c50bda8d4
  29. HTTPServer: disconnect after idle timeout (-rpcservertimeout) 09f60d5759
  30. http: switch servers from libevent to bitcoin 5c2e6a71ae
  31. fuzz: switch http_libevent::HTTPRequest to http_bitcoin::HTTPRequest ceb837f18c
  32. http: delete libevent! 28864fee15
  33. common: Add unused UrlEncode function 815bca36a8
  34. http: Add HTTPHeader file in common
    This will be shared between the http server and the bitcoin-cli http client code.
    8787de5dde
  35. cli: Remove libevent usage
    Replace libevent-based HTTP client with a simple synchronous implementation using the Sock class directly.
    910025c504
  36. refactor: Use constexpr in torcontrol where possible 11ab08efff
  37. refactor: Modernize member variable names in torcontrol ea2e5bf469
  38. refactor: Get rid of unnecessary newlines in logs 9e6d409de6
  39. torcontrol: Remove libevent usage
    Replace libevent-based approach with using the Sock class and CThreadInterrupt.
    def96b607c
  40. fuzz: Improve torcontrol fuzz test
    Gets rid of the Dummy class and adds coverage of get_socks_cb.
    4fe15804cf
  41. test: Add simple functional test for torcontrol 2e715aad91
  42. test: Add test for partial message handling in torcontrol 9b073d816a
  43. test: remove raii_event_tests 9480159e30
  44. cmake: remove libevent d4fc1f7921
  45. depends: remove libevent 44739f59b8
  46. ci: remove libevent 4ee2be4e6a
  47. vcpkg: remove libevent 3777a8e647
  48. doc: remove libevent 2811bb393c
  49. fanquake force-pushed on Feb 9, 2026

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-02-09 21:13 UTC

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