Saving incoming bootstrap connections in a container and closing them on shutdown. This was sometimes holding a process open in the background on shutdown.

This commit is contained in:
clemahieu 2017-12-13 20:29:22 -06:00
commit 41527c2b3f
2 changed files with 43 additions and 22 deletions

View file

@ -1108,44 +1108,62 @@ void rai::bootstrap_listener::start ()
void rai::bootstrap_listener::stop ()
{
on = false;
acceptor.close ();
on = false;
std::lock_guard <std::mutex> 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 <boost::asio::ip::tcp::socket> (service));
acceptor.async_accept (*socket, [this, socket] (boost::system::error_code const & ec)
{
accept_action (ec, socket);
});
auto socket (std::make_shared <boost::asio::ip::tcp::socket> (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 <boost::asio::ip::tcp::socket> socket_a)
{
if (!ec)
{
accept_connection ();
auto connection (std::make_shared <rai::bootstrap_server> (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 <rai::bootstrap_server> (socket_a, node.shared ()));
{
std::lock_guard <std::mutex> 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 <std::mutex> lock (node->bootstrap.mutex);
node->bootstrap.connections.erase (this);
}
rai::bootstrap_server::bootstrap_server (std::shared_ptr <boost::asio::ip::tcp::socket> socket_a, std::shared_ptr <rai::node> node_a) :

View file

@ -174,6 +174,7 @@ private:
std::condition_variable condition;
std::vector <std::function <void (bool)>> 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 <boost::asio::ip::tcp::socket>);
std::mutex mutex;
std::unordered_map <rai::bootstrap_server *, std::weak_ptr <rai::bootstrap_server>> connections;
rai::tcp_endpoint endpoint ();
boost::asio::ip::tcp::acceptor acceptor;
rai::tcp_endpoint local;