Fix ipc server stop command
This commit is contained in:
parent
bc86e46624
commit
0c980bb247
4 changed files with 18 additions and 7 deletions
|
|
@ -277,9 +277,18 @@ public:
|
|||
auto body (std::string (reinterpret_cast<char *> (buffer.data ()), buffer.size ()));
|
||||
|
||||
// Note that if the rpc action is async, the shared_ptr<json_handler> lifetime will be extended by the action handler
|
||||
auto handler (std::make_shared<nano::json_handler> (node, server.node_rpc_config, body, response_handler_l, [&server = server] () {
|
||||
server.stop ();
|
||||
auto handler (std::make_shared<nano::json_handler> (node, server.node_rpc_config, body, response_handler_l, [server_w = server.weak_from_this ()] () {
|
||||
// TODO: Previously this was stopping node.io_ctx, which was wrong. Investigate what's going on here. Why isn't it using stop_callback passed externally?
|
||||
// This is running on the IO thread, so attempting to directly stop the server will cause it to try joining itself.
|
||||
// This RPC/IPC system is really badly designed...
|
||||
std::thread ([server_w] () {
|
||||
std::this_thread::sleep_for (std::chrono::seconds (1));
|
||||
if (auto server = server_w.lock ())
|
||||
{
|
||||
server->stop ();
|
||||
}
|
||||
})
|
||||
.detach ();
|
||||
}));
|
||||
// For unsafe actions to be allowed, the unsafe encoding must be used AND the transport config must allow it
|
||||
handler->process_request (allow_unsafe && config_transport.allow_unsafe);
|
||||
|
|
@ -600,6 +609,8 @@ nano::ipc::ipc_server::ipc_server (nano::node & node_a, nano::node_rpc_config co
|
|||
nano::ipc::ipc_server::~ipc_server ()
|
||||
{
|
||||
node.logger.debug (nano::log::type::ipc_server, "Server stopped");
|
||||
|
||||
stop ();
|
||||
}
|
||||
|
||||
void nano::ipc::ipc_server::stop ()
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ namespace ipc
|
|||
{
|
||||
class access;
|
||||
/** The IPC server accepts connections on one or more configured transports */
|
||||
class ipc_server final
|
||||
class ipc_server final : public std::enable_shared_from_this<ipc_server>
|
||||
{
|
||||
public:
|
||||
ipc_server (nano::node & node, nano::node_rpc_config const & node_rpc_config);
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
#include <boost/property_tree/json_parser.hpp>
|
||||
|
||||
nano::test::rpc_context::rpc_context (std::shared_ptr<nano::rpc> & rpc_a, std::unique_ptr<nano::ipc::ipc_server> & ipc_server_a, std::unique_ptr<nano::ipc_rpc_processor> & ipc_rpc_processor_a, std::unique_ptr<nano::node_rpc_config> & node_rpc_config_a)
|
||||
nano::test::rpc_context::rpc_context (std::shared_ptr<nano::rpc> & rpc_a, std::shared_ptr<nano::ipc::ipc_server> & ipc_server_a, std::unique_ptr<nano::ipc_rpc_processor> & ipc_rpc_processor_a, std::unique_ptr<nano::node_rpc_config> & node_rpc_config_a)
|
||||
{
|
||||
rpc = std::move (rpc_a);
|
||||
ipc_server = std::move (ipc_server_a);
|
||||
|
|
@ -45,7 +45,7 @@ bool nano::test::check_block_response_count (nano::test::system & system, rpc_co
|
|||
nano::test::rpc_context nano::test::add_rpc (nano::test::system & system, std::shared_ptr<nano::node> const & node_a)
|
||||
{
|
||||
auto node_rpc_config (std::make_unique<nano::node_rpc_config> ());
|
||||
auto ipc_server (std::make_unique<nano::ipc::ipc_server> (*node_a, *node_rpc_config));
|
||||
auto ipc_server (std::make_shared<nano::ipc::ipc_server> (*node_a, *node_rpc_config));
|
||||
nano::rpc_config rpc_config (node_a->network_params.network, system.get_available_port (), true);
|
||||
const auto ipc_tcp_port = ipc_server->listening_tcp_port ();
|
||||
debug_assert (ipc_tcp_port.has_value ());
|
||||
|
|
|
|||
|
|
@ -22,10 +22,10 @@ namespace test
|
|||
class rpc_context
|
||||
{
|
||||
public:
|
||||
rpc_context (std::shared_ptr<nano::rpc> & rpc_a, std::unique_ptr<nano::ipc::ipc_server> & ipc_server_a, std::unique_ptr<nano::ipc_rpc_processor> & ipc_rpc_processor_a, std::unique_ptr<nano::node_rpc_config> & node_rpc_config_a);
|
||||
rpc_context (std::shared_ptr<nano::rpc> & rpc_a, std::shared_ptr<nano::ipc::ipc_server> & ipc_server_a, std::unique_ptr<nano::ipc_rpc_processor> & ipc_rpc_processor_a, std::unique_ptr<nano::node_rpc_config> & node_rpc_config_a);
|
||||
|
||||
std::shared_ptr<nano::rpc> rpc;
|
||||
std::unique_ptr<nano::ipc::ipc_server> ipc_server;
|
||||
std::shared_ptr<nano::ipc::ipc_server> ipc_server;
|
||||
std::unique_ptr<nano::ipc_rpc_processor> ipc_rpc_processor;
|
||||
std::unique_ptr<nano::node_rpc_config> node_rpc_config;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue