Add ability to start pow server as child process (#2331)
This commit is contained in:
		
					parent
					
						
							
								43161cfec9
							
						
					
				
			
			
				commit
				
					
						dff507502f
					
				
			
		
					 7 changed files with 121 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -70,7 +70,26 @@ void nano_daemon::daemon::run (boost::filesystem::path const & data_path, nano::
 | 
			
		|||
				nano::ipc::ipc_server ipc_server (*node, config.rpc);
 | 
			
		||||
#if BOOST_PROCESS_SUPPORTED
 | 
			
		||||
				std::unique_ptr<boost::process::child> rpc_process;
 | 
			
		||||
				std::unique_ptr<boost::process::child> nano_pow_server_process;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
				if (config.pow_server.enable)
 | 
			
		||||
				{
 | 
			
		||||
					if (!boost::filesystem::exists (config.pow_server.pow_server_path))
 | 
			
		||||
					{
 | 
			
		||||
						std::cerr << std::string ("nano_pow_server is configured to start as a child process, however the file cannot be found at: ") + config.pow_server.pow_server_path << std::endl;
 | 
			
		||||
						std::exit (1);
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
#if BOOST_PROCESS_SUPPORTED
 | 
			
		||||
					auto network = node->network_params.network.get_current_network_as_string ();
 | 
			
		||||
					nano_pow_server_process = std::make_unique<boost::process::child> (config.pow_server.pow_server_path, "--config_path", data_path / "config-nano-pow-server.toml");
 | 
			
		||||
#else
 | 
			
		||||
					std::cerr << "nano_pow_server is configured to start as a child process, but this is not supported on this system. Disable startup and start the server manually." << std::endl;
 | 
			
		||||
					std::exit (1);
 | 
			
		||||
#endif
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				std::unique_ptr<std::thread> rpc_process_thread;
 | 
			
		||||
				std::unique_ptr<nano::rpc> rpc;
 | 
			
		||||
				std::unique_ptr<nano::rpc_handler_interface> rpc_handler;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -131,7 +131,28 @@ int run_wallet (QApplication & application, int argc, char * const * argv, boost
 | 
			
		|||
 | 
			
		||||
#if BOOST_PROCESS_SUPPORTED
 | 
			
		||||
			std::unique_ptr<boost::process::child> rpc_process;
 | 
			
		||||
			std::unique_ptr<boost::process::child> nano_pow_server_process;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
			if (config.pow_server.enable)
 | 
			
		||||
			{
 | 
			
		||||
				if (!boost::filesystem::exists (config.pow_server.pow_server_path))
 | 
			
		||||
				{
 | 
			
		||||
					splash->hide ();
 | 
			
		||||
					show_error (std::string ("nano_pow_server is configured to start as a child process, however the file cannot be found at: ") + config.pow_server.pow_server_path);
 | 
			
		||||
					std::exit (1);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
#if BOOST_PROCESS_SUPPORTED
 | 
			
		||||
				auto network = node->network_params.network.get_current_network_as_string ();
 | 
			
		||||
				nano_pow_server_process = std::make_unique<boost::process::child> (config.pow_server.pow_server_path, "--config_path", data_path / "config-nano-pow-server.toml");
 | 
			
		||||
#else
 | 
			
		||||
				splash->hide ();
 | 
			
		||||
				show_error ("nano_pow_server is configured to start as a child process, but this is not supported on this system. Disable startup and start the server manually.");
 | 
			
		||||
				std::exit (1);
 | 
			
		||||
#endif
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			std::unique_ptr<nano::rpc> rpc;
 | 
			
		||||
			std::unique_ptr<nano::rpc_handler_interface> rpc_handler;
 | 
			
		||||
			if (config.rpc_enable)
 | 
			
		||||
| 
						 | 
				
			
			@ -178,6 +199,11 @@ int run_wallet (QApplication & application, int argc, char * const * argv, boost
 | 
			
		|||
				{
 | 
			
		||||
					rpc_process->terminate ();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (nano_pow_server_process)
 | 
			
		||||
				{
 | 
			
		||||
					nano_pow_server_process->terminate ();
 | 
			
		||||
				}
 | 
			
		||||
#endif
 | 
			
		||||
				runner.stop_event_processing ();
 | 
			
		||||
			});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,6 +90,8 @@ add_library (node
 | 
			
		|||
	payment_observer_processor.cpp
 | 
			
		||||
	portmapping.hpp
 | 
			
		||||
	portmapping.cpp
 | 
			
		||||
	node_pow_server_config.hpp
 | 
			
		||||
	node_pow_server_config.cpp
 | 
			
		||||
	repcrawler.hpp
 | 
			
		||||
	repcrawler.cpp
 | 
			
		||||
	testing.hpp
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,13 +31,17 @@ nano::error nano::daemon_config::serialize_toml (nano::tomlconfig & toml)
 | 
			
		|||
	opencl_l.put ("enable", opencl_enable);
 | 
			
		||||
	toml.put_child ("opencl", opencl_l);
 | 
			
		||||
 | 
			
		||||
	nano::tomlconfig pow_server_l;
 | 
			
		||||
	pow_server.serialize_toml (pow_server_l);
 | 
			
		||||
	nano::tomlconfig pow_server (pow_server_l);
 | 
			
		||||
	toml.put_child ("nano_pow_server", pow_server);
 | 
			
		||||
 | 
			
		||||
	return toml.get_error ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::error nano::daemon_config::deserialize_toml (nano::tomlconfig & toml)
 | 
			
		||||
{
 | 
			
		||||
	auto rpc_l (toml.get_optional_child ("rpc"));
 | 
			
		||||
 | 
			
		||||
	if (!toml.get_error () && rpc_l)
 | 
			
		||||
	{
 | 
			
		||||
		rpc_l->get_optional<bool> ("enable", rpc_enable);
 | 
			
		||||
| 
						 | 
				
			
			@ -50,14 +54,17 @@ nano::error nano::daemon_config::deserialize_toml (nano::tomlconfig & toml)
 | 
			
		|||
		node.deserialize_toml (*node_l);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!toml.get_error ())
 | 
			
		||||
	auto opencl_l (toml.get_optional_child ("opencl"));
 | 
			
		||||
	if (!toml.get_error () && opencl_l)
 | 
			
		||||
	{
 | 
			
		||||
		auto opencl_l (toml.get_optional_child ("opencl"));
 | 
			
		||||
		if (!toml.get_error () && opencl_l)
 | 
			
		||||
		{
 | 
			
		||||
			opencl_l->get_optional<bool> ("enable", opencl_enable);
 | 
			
		||||
			opencl.deserialize_toml (*opencl_l);
 | 
			
		||||
		}
 | 
			
		||||
		opencl_l->get_optional<bool> ("enable", opencl_enable);
 | 
			
		||||
		opencl.deserialize_toml (*opencl_l);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto pow_l (toml.get_optional_child ("nano_pow_server"));
 | 
			
		||||
	if (!toml.get_error () && pow_l)
 | 
			
		||||
	{
 | 
			
		||||
		pow_server.deserialize_toml (*pow_l);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return toml.get_error ();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <nano/lib/errors.hpp>
 | 
			
		||||
#include <nano/node/node_pow_server_config.hpp>
 | 
			
		||||
#include <nano/node/node_rpc_config.hpp>
 | 
			
		||||
#include <nano/node/nodeconfig.hpp>
 | 
			
		||||
#include <nano/node/openclconfig.hpp>
 | 
			
		||||
| 
						 | 
				
			
			@ -25,6 +26,7 @@ public:
 | 
			
		|||
	nano::node_config node;
 | 
			
		||||
	bool opencl_enable{ false };
 | 
			
		||||
	nano::opencl_config opencl;
 | 
			
		||||
	nano::node_pow_server_config pow_server;
 | 
			
		||||
	boost::filesystem::path data_path;
 | 
			
		||||
	unsigned json_version () const
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										19
									
								
								nano/node/node_pow_server_config.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								nano/node/node_pow_server_config.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
#include <nano/lib/config.hpp>
 | 
			
		||||
#include <nano/lib/rpcconfig.hpp>
 | 
			
		||||
#include <nano/lib/tomlconfig.hpp>
 | 
			
		||||
#include <nano/node/node_pow_server_config.hpp>
 | 
			
		||||
 | 
			
		||||
nano::error nano::node_pow_server_config::serialize_toml (nano::tomlconfig & toml) const
 | 
			
		||||
{
 | 
			
		||||
	toml.put ("enable", enable, "Enable or disable starting Nano PoW Server as a child process.\ntype:bool");
 | 
			
		||||
	toml.put ("nano_pow_server_path", pow_server_path, "Path to the nano_pow_server executable.\ntype:string,path");
 | 
			
		||||
	return toml.get_error ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::error nano::node_pow_server_config::deserialize_toml (nano::tomlconfig & toml)
 | 
			
		||||
{
 | 
			
		||||
	toml.get_optional<bool> ("enable", enable);
 | 
			
		||||
	toml.get_optional<std::string> ("nano_pow_server_path", pow_server_path);
 | 
			
		||||
 | 
			
		||||
	return toml.get_error ();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								nano/node/node_pow_server_config.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								nano/node/node_pow_server_config.hpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,38 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <nano/lib/rpcconfig.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/dll/runtime_symbol_info.hpp>
 | 
			
		||||
#include <boost/filesystem.hpp>
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class tomlconfig;
 | 
			
		||||
 | 
			
		||||
inline std::string get_default_pow_server_filepath ()
 | 
			
		||||
{
 | 
			
		||||
	boost::system::error_code err;
 | 
			
		||||
	auto running_executable_filepath = boost::dll::program_location (err);
 | 
			
		||||
 | 
			
		||||
	// Construct the nano_pow_server executable file path based on where the currently running executable is found.
 | 
			
		||||
	auto pow_server_filepath = running_executable_filepath.parent_path () / "nano_pow_server";
 | 
			
		||||
	if (running_executable_filepath.has_extension ())
 | 
			
		||||
	{
 | 
			
		||||
		pow_server_filepath.replace_extension (running_executable_filepath.extension ());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pow_server_filepath.string ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class node_pow_server_config final
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	nano::error serialize_toml (nano::tomlconfig & toml) const;
 | 
			
		||||
	nano::error deserialize_toml (nano::tomlconfig & toml);
 | 
			
		||||
 | 
			
		||||
	bool enable{ false };
 | 
			
		||||
	std::string pow_server_path{ nano::get_default_pow_server_filepath () };
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue