diff --git a/rai/node/bootstrap.cpp b/rai/node/bootstrap.cpp index 404c3f6c..aab2a3d3 100755 --- a/rai/node/bootstrap.cpp +++ b/rai/node/bootstrap.cpp @@ -1132,11 +1132,19 @@ node (node_a) void rai::bootstrap_listener::start () { - acceptor.open (local.protocol ()); - acceptor.set_option (boost::asio::ip::tcp::acceptor::reuse_address (true)); - acceptor.bind (local); - acceptor.listen (); - accept_connection (); + acceptor.open (local.protocol ()); + acceptor.set_option (boost::asio::ip::tcp::acceptor::reuse_address (true)); + + boost::system::error_code ec; + acceptor.bind (local, ec); + if (ec) + { + BOOST_LOG (node.log) << boost::str (boost::format ("Error while binding for bootstrap on port %1%: %2%") % local.port() % ec.message ()); + throw std::runtime_error (ec.message()); + } + + acceptor.listen (); + accept_connection (); } void rai::bootstrap_listener::stop () diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 38f5d339..d2895a0b 100755 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -1500,31 +1500,30 @@ block_processor_thread ([this] () { this->block_processor.process_blocks (); }) } } }); - BOOST_LOG (log) << "Node starting, version: " << RAIBLOCKS_VERSION_MAJOR << "." << RAIBLOCKS_VERSION_MINOR; + BOOST_LOG (log) << "Node starting, version: " << RAIBLOCKS_VERSION_MAJOR << "." << RAIBLOCKS_VERSION_MINOR; BOOST_LOG (log) << boost::str (boost::format ("Work pool running %1% threads") % work.threads.size ()); - if (!init_a.error ()) - { - if (config.logging.node_lifetime_tracing ()) - { - std::cerr << "Constructing node\n"; - } + if (!init_a.error ()) + { + if (config.logging.node_lifetime_tracing ()) + { + BOOST_LOG (log) << "Constructing node"; + } rai::transaction transaction (store.environment, nullptr, true); - if (store.latest_begin (transaction) == store.latest_end ()) - { - // Store was empty meaning we just created it, add the genesis block - rai::genesis genesis; - genesis.initialize (transaction, store); - } - } + if (store.latest_begin (transaction) == store.latest_end ()) + { + // Store was empty meaning we just created it, add the genesis block + rai::genesis genesis; + genesis.initialize (transaction, store); + } + } } rai::node::~node () { if (config.logging.node_lifetime_tracing ()) { - std::cerr << "Destructing node\n"; + BOOST_LOG (log) << "Destructing node"; } - stop(); } diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 6e92878f..380796cd 100755 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -76,8 +76,16 @@ node (node_a) { auto endpoint (rai::tcp_endpoint (config_a.address, config_a.port)); acceptor.open (endpoint.protocol ()); - acceptor.set_option (boost::asio::ip::tcp::acceptor::reuse_address (true)); - acceptor.bind (endpoint); + acceptor.set_option (boost::asio::ip::tcp::acceptor::reuse_address (true)); + + boost::system::error_code ec; + acceptor.bind (endpoint, ec); + if (ec) + { + BOOST_LOG (node.log) << boost::str (boost::format ("Error while binding for RPC on port %1%: %2%") % endpoint.port() % ec.message ()); + throw std::runtime_error (ec.message()); + } + acceptor.listen (); node_a.observers.blocks.add ([this] (std::shared_ptr block_a, rai::account const & account_a, rai::amount const &) { diff --git a/rai/rai_node/daemon.cpp b/rai/rai_node/daemon.cpp index 85eeb7b1..0ef2113d 100644 --- a/rai/rai_node/daemon.cpp +++ b/rai/rai_node/daemon.cpp @@ -114,21 +114,28 @@ void rai_daemon::daemon::run (boost::filesystem::path const & data_path) } : std::function (rai::uint256_union const &)> (nullptr)); rai::alarm alarm (service); rai::node_init init; - auto node (std::make_shared (init, service, data_path, alarm, config.node, opencl_work)); - if (!init.error ()) + try { - node->start (); - rai::rpc rpc (service, *node, config.rpc); - if (config.rpc_enable) + auto node (std::make_shared (init, service, data_path, alarm, config.node, opencl_work)); + if (!init.error ()) { - rpc.start (); + node->start (); + rai::rpc rpc (service, *node, config.rpc); + if (config.rpc_enable) + { + rpc.start (); + } + runner.reset (new rai::thread_runner (service, node->config.io_threads)); + runner->join (); + } + else + { + std::cerr << "Error initializing node\n"; } - runner.reset (new rai::thread_runner (service, node->config.io_threads)); - runner->join (); } - else + catch(const std::runtime_error& e) { - std::cerr << "Error initializing node\n"; + std::cerr << "Error while running node (" << e.what() << ")\n"; } } else