From a5107f2abca971b00065ace31d81cfefce0e989d Mon Sep 17 00:00:00 2001 From: Wesley Shillingford Date: Mon, 29 Jul 2019 17:08:23 +0100 Subject: [PATCH] Allow the RPC server to be run on a different system (#2162) * Allow RPC server to be run on a different system * Formatting --- nano/lib/rpcconfig.cpp | 14 ++++++++++++++ nano/lib/rpcconfig.hpp | 5 +++++ nano/rpc/rpc_request_processor.cpp | 4 ++-- nano/rpc_test/rpc.cpp | 3 +++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/nano/lib/rpcconfig.cpp b/nano/lib/rpcconfig.cpp index 00bfe447..c2839232 100644 --- a/nano/lib/rpcconfig.cpp +++ b/nano/lib/rpcconfig.cpp @@ -43,7 +43,9 @@ nano::error nano::rpc_config::serialize_json (nano::jsonconfig & json) const json.put ("max_request_size", max_request_size); nano::jsonconfig rpc_process_l; + rpc_process_l.put ("version", rpc_process.json_version ()); rpc_process_l.put ("io_threads", rpc_process.io_threads); + rpc_process_l.put ("ipc_address", rpc_process.ipc_address); rpc_process_l.put ("ipc_port", rpc_process.ipc_port); rpc_process_l.put ("num_ipc_connections", rpc_process.num_ipc_connections); json.put_child ("process", rpc_process_l); @@ -64,7 +66,9 @@ nano::error nano::rpc_config::deserialize_json (bool & upgraded_a, nano::jsoncon json.erase ("chain_request_limit"); nano::jsonconfig rpc_process_l; + rpc_process_l.put ("version", *version_l); rpc_process_l.put ("io_threads", rpc_process.io_threads); + rpc_process_l.put ("ipc_address", rpc_process.ipc_address); rpc_process_l.put ("ipc_port", rpc_process.ipc_port); rpc_process_l.put ("num_ipc_connections", rpc_process.num_ipc_connections); json.put_child ("process", rpc_process_l); @@ -86,8 +90,18 @@ nano::error nano::rpc_config::deserialize_json (bool & upgraded_a, nano::jsoncon auto rpc_process_l (json.get_optional_child ("process")); if (rpc_process_l) { + auto version_l (rpc_process_l->get_optional ("version")); + if (!version_l) + { + version_l = 1; + rpc_process_l->put ("version", *version_l); + rpc_process_l->put ("ipc_address", rpc_process.ipc_address); + upgraded_a = true; + } + rpc_process_l->get_optional ("io_threads", rpc_process.io_threads); rpc_process_l->get_optional ("ipc_port", rpc_process.ipc_port); + rpc_process_l->get_optional ("ipc_address", rpc_process.ipc_address); rpc_process_l->get_optional ("num_ipc_connections", rpc_process.num_ipc_connections); } } diff --git a/nano/lib/rpcconfig.hpp b/nano/lib/rpcconfig.hpp index 3dd51f19..f444256f 100644 --- a/nano/lib/rpcconfig.hpp +++ b/nano/lib/rpcconfig.hpp @@ -41,8 +41,13 @@ class rpc_process_config final public: nano::network_constants network_constants; unsigned io_threads{ std::max (4, boost::thread::hardware_concurrency ()) }; + boost::asio::ip::address_v6 ipc_address{ boost::asio::ip::address_v6::loopback () }; uint16_t ipc_port{ network_constants.default_ipc_port }; unsigned num_ipc_connections{ network_constants.is_live_network () ? 8u : network_constants.is_beta_network () ? 4u : 1u }; + static unsigned json_version () + { + return 1; + } }; class rpc_config final diff --git a/nano/rpc/rpc_request_processor.cpp b/nano/rpc/rpc_request_processor.cpp index 63681e64..457c0ab1 100644 --- a/nano/rpc/rpc_request_processor.cpp +++ b/nano/rpc/rpc_request_processor.cpp @@ -2,7 +2,7 @@ #include nano::rpc_request_processor::rpc_request_processor (boost::asio::io_context & io_ctx, nano::rpc_config & rpc_config) : -ipc_address (rpc_config.address.to_string ()), +ipc_address (rpc_config.rpc_process.ipc_address.to_string ()), ipc_port (rpc_config.rpc_process.ipc_port), thread ([this]() { nano::thread_role::set (nano::thread_role::name::rpc_request_processor); @@ -113,7 +113,7 @@ void nano::rpc_request_processor::try_reconnect_and_execute_request (std::shared } else { - json_error_response (rpc_request->response, "There is a problem connecting to the node. Make sure ipc->tcp is enabled in node config and ports match"); + json_error_response (rpc_request->response, "There is a problem connecting to the node. Make sure ipc->tcp is enabled in the node config, ipc ports match and ipc_address is the ip where the node is located"); make_available (*connection); } }); diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index b8e25d27..9157c32e 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -6596,6 +6596,7 @@ TEST (rpc_config, serialization) config1.enable_control = true; config1.max_json_depth = 10; config1.rpc_process.io_threads = 2; + config1.rpc_process.ipc_address = boost::asio::ip::address_v6::any (); config1.rpc_process.ipc_port = 2000; config1.rpc_process.num_ipc_connections = 99; nano::jsonconfig tree; @@ -6606,6 +6607,7 @@ TEST (rpc_config, serialization) ASSERT_NE (config2.enable_control, config1.enable_control); ASSERT_NE (config2.max_json_depth, config1.max_json_depth); ASSERT_NE (config2.rpc_process.io_threads, config1.rpc_process.io_threads); + ASSERT_NE (config2.rpc_process.ipc_address, config1.rpc_process.ipc_address); ASSERT_NE (config2.rpc_process.ipc_port, config1.rpc_process.ipc_port); ASSERT_NE (config2.rpc_process.num_ipc_connections, config1.rpc_process.num_ipc_connections); bool upgraded{ false }; @@ -6615,6 +6617,7 @@ TEST (rpc_config, serialization) ASSERT_EQ (config2.enable_control, config1.enable_control); ASSERT_EQ (config2.max_json_depth, config1.max_json_depth); ASSERT_EQ (config2.rpc_process.io_threads, config1.rpc_process.io_threads); + ASSERT_EQ (config2.rpc_process.ipc_address, config1.rpc_process.ipc_address); ASSERT_EQ (config2.rpc_process.ipc_port, config1.rpc_process.ipc_port); ASSERT_EQ (config2.rpc_process.num_ipc_connections, config1.rpc_process.num_ipc_connections); }