net_node: drop connections from banned IPs after looping through connections

This keeps the connections lock just for the time of looping
and adding connectoins to a list, and the dropping happens
after it. This should avoid lengthy delays waiting for the
connections lock.
This commit is contained in:
moneromooo-monero 2016-12-03 11:20:48 +00:00
parent c36cb54340
commit 7c0dd5e46c
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
1 changed files with 6 additions and 4 deletions

View File

@ -203,15 +203,17 @@ namespace nodetool
m_blocked_ips[addr] = time(nullptr) + seconds; m_blocked_ips[addr] = time(nullptr) + seconds;
// drop any connection to that IP // drop any connection to that IP
while (!m_net_server.get_config_object().foreach_connection([&](const p2p_connection_context& cntxt) std::list<boost::uuids::uuid> conns;
m_net_server.get_config_object().foreach_connection([&](const p2p_connection_context& cntxt)
{ {
if (cntxt.m_remote_ip == addr) if (cntxt.m_remote_ip == addr)
{ {
drop_connection(cntxt); conns.push_back(cntxt.m_connection_id);
return false;
} }
return true; return true;
})); });
for (const auto &c: conns)
m_net_server.get_config_object().close(c);
LOG_PRINT_CYAN("IP " << epee::string_tools::get_ip_string_from_int32(addr) << " blocked.", LOG_LEVEL_0); LOG_PRINT_CYAN("IP " << epee::string_tools::get_ip_string_from_int32(addr) << " blocked.", LOG_LEVEL_0);
return true; return true;