From 41527c2b3fb68dc0d877626fb2a1110a058aa8c1 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Wed, 13 Dec 2017 20:29:22 -0600 Subject: [PATCH] Saving incoming bootstrap connections in a container and closing them on shutdown. This was sometimes holding a process open in the background on shutdown. --- rai/node/bootstrap.cpp | 62 +++++++++++++++++++++++++++--------------- rai/node/bootstrap.hpp | 3 ++ 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/rai/node/bootstrap.cpp b/rai/node/bootstrap.cpp index 357d8b63..08554403 100755 --- a/rai/node/bootstrap.cpp +++ b/rai/node/bootstrap.cpp @@ -1108,44 +1108,62 @@ void rai::bootstrap_listener::start () void rai::bootstrap_listener::stop () { - on = false; - acceptor.close (); + on = false; + std::lock_guard lock (mutex); + acceptor.close (); + for (auto & i : connections) + { + auto connection (i.second.lock ()); + if (connection) + { + connection->socket->close (); + } + } } void rai::bootstrap_listener::accept_connection () { - auto socket (std::make_shared (service)); - acceptor.async_accept (*socket, [this, socket] (boost::system::error_code const & ec) - { - accept_action (ec, socket); - }); + auto socket (std::make_shared (service)); + acceptor.async_accept (*socket, [this, socket] (boost::system::error_code const & ec) + { + accept_action (ec, socket); + }); } void rai::bootstrap_listener::accept_action (boost::system::error_code const & ec, std::shared_ptr socket_a) { - if (!ec) - { - accept_connection (); - auto connection (std::make_shared (socket_a, node.shared ())); - connection->receive (); - } - else - { - BOOST_LOG (node.log) << boost::str (boost::format ("Error while accepting bootstrap connections: %1%") % ec.message ()); - } + if (!ec) + { + accept_connection (); + auto connection (std::make_shared (socket_a, node.shared ())); + { + std::lock_guard lock (mutex); + if (acceptor.is_open ()) + { + connections [connection.get ()] = connection; + connection->receive (); + } + } + } + else + { + BOOST_LOG (node.log) << boost::str (boost::format ("Error while accepting bootstrap connections: %1%") % ec.message ()); + } } boost::asio::ip::tcp::endpoint rai::bootstrap_listener::endpoint () { - return boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v6::loopback (), local.port ()); + return boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v6::loopback (), local.port ()); } rai::bootstrap_server::~bootstrap_server () { - if (node->config.logging.network_logging ()) - { - BOOST_LOG (node->log) << "Exiting bootstrap server"; - } + if (node->config.logging.network_logging ()) + { + BOOST_LOG (node->log) << "Exiting bootstrap server"; + } + std::lock_guard lock (node->bootstrap.mutex); + node->bootstrap.connections.erase (this); } rai::bootstrap_server::bootstrap_server (std::shared_ptr socket_a, std::shared_ptr node_a) : diff --git a/rai/node/bootstrap.hpp b/rai/node/bootstrap.hpp index 21a9ab25..5c1d49bd 100644 --- a/rai/node/bootstrap.hpp +++ b/rai/node/bootstrap.hpp @@ -174,6 +174,7 @@ private: std::condition_variable condition; std::vector > observers; }; +class bootstrap_server; class bootstrap_listener { public: @@ -182,6 +183,8 @@ public: void stop (); void accept_connection (); void accept_action (boost::system::error_code const &, std::shared_ptr ); + std::mutex mutex; + std::unordered_map > connections; rai::tcp_endpoint endpoint (); boost::asio::ip::tcp::acceptor acceptor; rai::tcp_endpoint local;