From 95d034b20bd28e85b0abeba6d97079e422876184 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Tue, 5 May 2026 14:23:59 -0400 Subject: [PATCH] Divorce service from incoming p2p in terms of network halt. --- include/bitcoin/network/net.hpp | 12 ++++++-- include/bitcoin/network/sessions/session.hpp | 4 +++ src/net.cpp | 29 +++++++++++++++++++- src/sessions/session.cpp | 8 +++++- src/sessions/session_server.cpp | 2 +- 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/include/bitcoin/network/net.hpp b/include/bitcoin/network/net.hpp index e41e5bdec..a6ae851be 100644 --- a/include/bitcoin/network/net.hpp +++ b/include/bitcoin/network/net.hpp @@ -89,14 +89,15 @@ class BCT_API net /// Suspensions. /// ----------------------------------------------------------------------- + /// Service connections are managed independently from P2P. - /// Network connections are suspended (incoming and/or outgoing). + /// P2P connections are suspended (incoming and/or outgoing). virtual bool suspended() const NOEXCEPT; - /// Suspend all connections. + /// Suspend all P2P connections. virtual void suspend(const code& ec) NOEXCEPT; - /// Resume all connection. + /// Resume all P2P connection. virtual void resume() NOEXCEPT; /// Properties. @@ -217,6 +218,8 @@ class BCT_API net friend class session; /// I/O factories. + virtual acceptor::ptr create_service( + const socket::context& context={}) NOEXCEPT; virtual acceptor::ptr create_acceptor( const socket::context& context={}) NOEXCEPT; virtual connector::ptr create_seed_connector() NOEXCEPT; @@ -265,6 +268,8 @@ class BCT_API net private: // Suspensions. + void suspend_services() NOEXCEPT; + void resume_services() NOEXCEPT; void suspend_acceptors() NOEXCEPT; void resume_acceptors() NOEXCEPT; void suspend_connectors() NOEXCEPT; @@ -310,6 +315,7 @@ class BCT_API net const settings& settings_; std::atomic_bool closed_{ false }; std::atomic_bool accept_suspended_{ false }; + std::atomic_bool service_suspended_{ false }; std::atomic_bool connect_suspended_{ false }; std::atomic total_channel_count_{}; std::atomic inbound_channel_count_{}; diff --git a/include/bitcoin/network/sessions/session.hpp b/include/bitcoin/network/sessions/session.hpp index 5b3acbe1a..e8ae9bbd6 100644 --- a/include/bitcoin/network/sessions/session.hpp +++ b/include/bitcoin/network/sessions/session.hpp @@ -186,6 +186,10 @@ class BCT_API session /// Factories. /// ----------------------------------------------------------------------- + /// Create a channel acceptor (service). + virtual acceptor::ptr create_service( + const socket::context& context={}) NOEXCEPT; + /// Create a channel acceptor (inbound). virtual acceptor::ptr create_acceptor( const socket::context& context={}) NOEXCEPT; diff --git a/src/net.cpp b/src/net.cpp index 772bd9cba..137771ea7 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -68,7 +68,23 @@ net::~net() NOEXCEPT // I/O factories. // ---------------------------------------------------------------------------- -// inbound/server +// server +// TODO: could move this to server by extending context. +acceptor::ptr net::create_service(const socket::context& context) NOEXCEPT +{ + const auto& settings = network_settings(); + socket::parameters params + { + .connect_timeout = settings.connect_timeout(), + .maximum_request = settings.inbound.maximum_request, + .context = context + }; + + return emplace_shared(log, strand(), service(), + service_suspended_, std::move(params)); +} + +// inbound acceptor::ptr net::create_acceptor(const socket::context& context) NOEXCEPT { const auto& settings = network_settings(); @@ -275,6 +291,17 @@ bool net::closed() const NOEXCEPT // Suspensions. // ---------------------------------------------------------------------------- +// Service connections are managed independently from P2P. + +void net::suspend_services() NOEXCEPT +{ + service_suspended_.store(true); +} + +void net::resume_services() NOEXCEPT +{ + service_suspended_.store(false); +} void net::suspend(const code&) NOEXCEPT { diff --git a/src/sessions/session.cpp b/src/sessions/session.cpp index bf365644e..417c9125a 100644 --- a/src/sessions/session.cpp +++ b/src/sessions/session.cpp @@ -340,7 +340,13 @@ void session::unsubscribe_close() NOEXCEPT // Factories. // ---------------------------------------------------------------------------- -// inbound/server +// server +acceptor::ptr session::create_service(const socket::context& context) NOEXCEPT +{ + return network_.create_service(context); +} + +// inbound acceptor::ptr session::create_acceptor(const socket::context& context) NOEXCEPT { return network_.create_acceptor(context); diff --git a/src/sessions/session_server.cpp b/src/sessions/session_server.cpp index 74aeb7a78..a680aa331 100644 --- a/src/sessions/session_server.cpp +++ b/src/sessions/session_server.cpp @@ -113,7 +113,7 @@ code session_server::do_accept(const config::authorities& binds, for (const auto& bind: binds) { - const auto acceptor = create_acceptor(context); + const auto acceptor = create_service(context); // Require that all acceptors at least start. if (const auto ec = acceptor->start(bind))