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:
parent
73ad82fa74
commit
41527c2b3f
2 changed files with 43 additions and 22 deletions
|
@ -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) :
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue