Merge pull request #2302
ef005f5e
p2p: add a couple early outs when the stop signal is received (moneromooo-monero)80d361c7
abstract_tcp_server2: improve tracking/cancelling of early connections (moneromooo-monero)
This commit is contained in:
commit
07312a7d6e
|
@ -281,8 +281,6 @@ namespace net_utils
|
||||||
|
|
||||||
bool is_thread_worker();
|
bool is_thread_worker();
|
||||||
|
|
||||||
bool cleanup_connections();
|
|
||||||
|
|
||||||
/// The io_service used to perform asynchronous operations.
|
/// The io_service used to perform asynchronous operations.
|
||||||
std::unique_ptr<boost::asio::io_service> m_io_service_local_instance;
|
std::unique_ptr<boost::asio::io_service> m_io_service_local_instance;
|
||||||
boost::asio::io_service& io_service_;
|
boost::asio::io_service& io_service_;
|
||||||
|
@ -309,7 +307,7 @@ namespace net_utils
|
||||||
connection_ptr new_connection_;
|
connection_ptr new_connection_;
|
||||||
|
|
||||||
boost::mutex connections_mutex;
|
boost::mutex connections_mutex;
|
||||||
std::deque<std::pair<boost::system_time, connection_ptr>> connections_;
|
std::set<connection_ptr> connections_;
|
||||||
|
|
||||||
}; // class <>boosted_tcp_server
|
}; // class <>boosted_tcp_server
|
||||||
|
|
||||||
|
|
|
@ -54,8 +54,6 @@
|
||||||
#undef MONERO_DEFAULT_LOG_CATEGORY
|
#undef MONERO_DEFAULT_LOG_CATEGORY
|
||||||
#define MONERO_DEFAULT_LOG_CATEGORY "net"
|
#define MONERO_DEFAULT_LOG_CATEGORY "net"
|
||||||
|
|
||||||
#define CONNECTION_CLEANUP_TIME 30 // seconds
|
|
||||||
|
|
||||||
PRAGMA_WARNING_PUSH
|
PRAGMA_WARNING_PUSH
|
||||||
namespace epee
|
namespace epee
|
||||||
{
|
{
|
||||||
|
@ -808,7 +806,6 @@ POP_WARNINGS
|
||||||
m_threads_count = threads_count;
|
m_threads_count = threads_count;
|
||||||
m_main_thread_id = boost::this_thread::get_id();
|
m_main_thread_id = boost::this_thread::get_id();
|
||||||
MLOG_SET_THREAD_NAME("[SRV_MAIN]");
|
MLOG_SET_THREAD_NAME("[SRV_MAIN]");
|
||||||
add_idle_handler(boost::bind(&boosted_tcp_server::cleanup_connections, this), 5000);
|
|
||||||
while(!m_stop_signal_sent)
|
while(!m_stop_signal_sent)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -898,7 +895,7 @@ POP_WARNINGS
|
||||||
connections_mutex.lock();
|
connections_mutex.lock();
|
||||||
for (auto &c: connections_)
|
for (auto &c: connections_)
|
||||||
{
|
{
|
||||||
c.second->cancel();
|
c->cancel();
|
||||||
}
|
}
|
||||||
connections_.clear();
|
connections_.clear();
|
||||||
connections_mutex.unlock();
|
connections_mutex.unlock();
|
||||||
|
@ -907,19 +904,6 @@ POP_WARNINGS
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
template<class t_protocol_handler>
|
template<class t_protocol_handler>
|
||||||
bool boosted_tcp_server<t_protocol_handler>::cleanup_connections()
|
|
||||||
{
|
|
||||||
connections_mutex.lock();
|
|
||||||
boost::system_time cutoff = boost::get_system_time() - boost::posix_time::seconds(CONNECTION_CLEANUP_TIME);
|
|
||||||
while (!connections_.empty() && connections_.front().first < cutoff)
|
|
||||||
{
|
|
||||||
connections_.pop_front();
|
|
||||||
}
|
|
||||||
connections_mutex.unlock();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------------
|
|
||||||
template<class t_protocol_handler>
|
|
||||||
bool boosted_tcp_server<t_protocol_handler>::is_stop_signal_sent()
|
bool boosted_tcp_server<t_protocol_handler>::is_stop_signal_sent()
|
||||||
{
|
{
|
||||||
return m_stop_signal_sent;
|
return m_stop_signal_sent;
|
||||||
|
@ -958,9 +942,10 @@ POP_WARNINGS
|
||||||
|
|
||||||
connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) );
|
connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) );
|
||||||
connections_mutex.lock();
|
connections_mutex.lock();
|
||||||
connections_.push_back(std::make_pair(boost::get_system_time(), new_connection_l));
|
connections_.insert(new_connection_l);
|
||||||
MDEBUG("connections_ size now " << connections_.size());
|
MDEBUG("connections_ size now " << connections_.size());
|
||||||
connections_mutex.unlock();
|
connections_mutex.unlock();
|
||||||
|
epee::misc_utils::auto_scope_leave_caller scope_exit_handler = epee::misc_utils::create_scope_leave_handler([&](){ CRITICAL_REGION_LOCAL(connections_mutex); connections_.erase(new_connection_l); });
|
||||||
boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket();
|
boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket();
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1038,6 +1023,10 @@ POP_WARNINGS
|
||||||
|
|
||||||
_dbg3("Connected success to " << adr << ':' << port);
|
_dbg3("Connected success to " << adr << ':' << port);
|
||||||
|
|
||||||
|
// start adds the connection to the config object's list, so we don't need to have it locally anymore
|
||||||
|
connections_mutex.lock();
|
||||||
|
connections_.erase(new_connection_l);
|
||||||
|
connections_mutex.unlock();
|
||||||
bool r = new_connection_l->start(false, 1 < m_threads_count);
|
bool r = new_connection_l->start(false, 1 < m_threads_count);
|
||||||
if (r)
|
if (r)
|
||||||
{
|
{
|
||||||
|
@ -1062,9 +1051,10 @@ POP_WARNINGS
|
||||||
TRY_ENTRY();
|
TRY_ENTRY();
|
||||||
connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) );
|
connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) );
|
||||||
connections_mutex.lock();
|
connections_mutex.lock();
|
||||||
connections_.push_back(std::make_pair(boost::get_system_time(), new_connection_l));
|
connections_.insert(new_connection_l);
|
||||||
MDEBUG("connections_ size now " << connections_.size());
|
MDEBUG("connections_ size now " << connections_.size());
|
||||||
connections_mutex.unlock();
|
connections_mutex.unlock();
|
||||||
|
epee::misc_utils::auto_scope_leave_caller scope_exit_handler = epee::misc_utils::create_scope_leave_handler([&](){ CRITICAL_REGION_LOCAL(connections_mutex); connections_.erase(new_connection_l); });
|
||||||
boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket();
|
boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket();
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1113,6 +1103,11 @@ POP_WARNINGS
|
||||||
{
|
{
|
||||||
_dbg3("[sock " << new_connection_l->socket().native_handle() << "] Connected success to " << adr << ':' << port <<
|
_dbg3("[sock " << new_connection_l->socket().native_handle() << "] Connected success to " << adr << ':' << port <<
|
||||||
" from " << lep.address().to_string() << ':' << lep.port());
|
" from " << lep.address().to_string() << ':' << lep.port());
|
||||||
|
|
||||||
|
// start adds the connection to the config object's list, so we don't need to have it locally anymore
|
||||||
|
connections_mutex.lock();
|
||||||
|
connections_.erase(new_connection_l);
|
||||||
|
connections_mutex.unlock();
|
||||||
bool r = new_connection_l->start(false, 1 < m_threads_count);
|
bool r = new_connection_l->start(false, 1 < m_threads_count);
|
||||||
if (r)
|
if (r)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1090,6 +1090,8 @@ namespace nodetool
|
||||||
|
|
||||||
if (use_white_list) {
|
if (use_white_list) {
|
||||||
local_peers_count = m_peerlist.get_white_peers_count();
|
local_peers_count = m_peerlist.get_white_peers_count();
|
||||||
|
if (!local_peers_count)
|
||||||
|
return false;
|
||||||
max_random_index = std::min<uint64_t>(local_peers_count -1, 20);
|
max_random_index = std::min<uint64_t>(local_peers_count -1, 20);
|
||||||
random_index = get_random_index_with_fixed_probability(max_random_index);
|
random_index = get_random_index_with_fixed_probability(max_random_index);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1916,6 +1918,9 @@ namespace nodetool
|
||||||
{
|
{
|
||||||
peerlist_entry pe = AUTO_VAL_INIT(pe);
|
peerlist_entry pe = AUTO_VAL_INIT(pe);
|
||||||
|
|
||||||
|
if (m_net_server.is_stop_signal_sent())
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!m_peerlist.get_random_gray_peer(pe)) {
|
if (!m_peerlist.get_random_gray_peer(pe)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue