diff --git a/nano/lib/thread_roles.cpp b/nano/lib/thread_roles.cpp index ccb34be3b..8b4c0314a 100644 --- a/nano/lib/thread_roles.cpp +++ b/nano/lib/thread_roles.cpp @@ -190,6 +190,9 @@ std::string nano::thread_role::get_string (nano::thread_role::name role) case nano::thread_role::name::monitor: thread_role_name_string = "Monitor"; break; + case nano::thread_role::name::http_callbacks: + thread_role_name_string = "HTTP callbacks"; + break; default: debug_assert (false && "nano::thread_role::get_string unhandled thread role"); } diff --git a/nano/lib/thread_roles.hpp b/nano/lib/thread_roles.hpp index 66f7455d3..349c02f1b 100644 --- a/nano/lib/thread_roles.hpp +++ b/nano/lib/thread_roles.hpp @@ -68,6 +68,7 @@ enum class name vote_router, online_reps, monitor, + http_callbacks, }; std::string_view to_string (name); diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 9fbec5eb6..fbdf7c728 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -558,6 +558,7 @@ void nano::node::start () vote_router.start (); online_reps.start (); monitor.start (); + http_callbacks.start (); add_initial_peers (); } @@ -605,6 +606,7 @@ void nano::node::stop () message_processor.stop (); network.stop (); monitor.stop (); + http_callbacks.stop (); bootstrap_workers.stop (); wallet_workers.stop (); @@ -1075,6 +1077,7 @@ nano::container_info nano::node::container_info () const info.add ("bandwidth", outbound_limiter.container_info ()); info.add ("backlog_scan", backlog_scan.container_info ()); info.add ("bounded_backlog", backlog.container_info ()); + info.add ("http_callbacks", http_callbacks.container_info ()); return info; } diff --git a/nano/node/rpc_callbacks.cpp b/nano/node/rpc_callbacks.cpp index ea5ab4c27..cb1a0be4f 100644 --- a/nano/node/rpc_callbacks.cpp +++ b/nano/node/rpc_callbacks.cpp @@ -9,7 +9,8 @@ nano::http_callbacks::http_callbacks (nano::node & node_a) : observers{ node_a.observers }, ledger{ node_a.ledger }, logger{ node_a.logger }, - stats{ node_a.stats } + stats{ node_a.stats }, + workers{ 1, nano::thread_role::name::http_callbacks } { // Only set up callbacks if a callback address is configured if (!config.callback_address.empty ()) @@ -19,6 +20,21 @@ nano::http_callbacks::http_callbacks (nano::node & node_a) : } } +void nano::http_callbacks::start () +{ + workers.start (); +} + +void nano::http_callbacks::stop () +{ + workers.stop (); +} + +nano::container_info nano::http_callbacks::container_info () const +{ + return workers.container_info (); +} + void nano::http_callbacks::setup_callbacks () { // Add observer for block confirmations @@ -36,8 +52,8 @@ void nano::http_callbacks::setup_callbacks () stats.inc (nano::stat::type::http_callbacks_notified, nano::stat::detail::block_confirmed); // Post callback processing to worker thread - // Safe to capture 'this' by reference as workers are stopped before node destruction - node.workers.post ([this, block_a, account_a, amount_a, is_state_send_a, is_state_epoch_a] () { + // Safe to capture 'this' by reference as workers are stopped before this component destruction + workers.post ([this, block_a, account_a, amount_a, is_state_send_a, is_state_epoch_a] () { // Construct the callback payload as a property tree boost::property_tree::ptree event; event.add ("account", account_a.to_account ()); diff --git a/nano/node/rpc_callbacks.hpp b/nano/node/rpc_callbacks.hpp index cd565cc65..5e6359322 100644 --- a/nano/node/rpc_callbacks.hpp +++ b/nano/node/rpc_callbacks.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include namespace nano @@ -9,6 +10,11 @@ class http_callbacks public: explicit http_callbacks (nano::node &); + void start (); + void stop (); + + nano::container_info container_info () const; + private: // Dependencies nano::node_config const & config; nano::node & node; @@ -20,5 +26,7 @@ private: // Dependencies private: void setup_callbacks (); void do_rpc_callback (boost::asio::ip::tcp::resolver::iterator i_a, std::string const &, uint16_t, std::shared_ptr const &, std::shared_ptr const &, std::shared_ptr const &); + + nano::thread_pool workers; }; } \ No newline at end of file