Use network group instead of CNetAddr in final pass to select node to disconnect

This commit is contained in:
Patrick Strateman 2015-08-25 17:06:15 -07:00 committed by Taylor Hornby
parent b63e75ae12
commit 85e84f5e58
1 changed files with 10 additions and 10 deletions

View File

@ -794,29 +794,29 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) {
if (vEvictionCandidates.empty()) return false;
// Identify CNetAddr with the most connections
CNetAddr naMostConnections;
// Identify the network group with the most connections
std::vector<unsigned char> naMostConnections;
unsigned int nMostConnections = 0;
std::map<CNetAddr, std::vector<CNodeRef> > mapAddrCounts;
std::map<std::vector<unsigned char>, std::vector<CNodeRef> > mapAddrCounts;
BOOST_FOREACH(const CNodeRef &node, vEvictionCandidates) {
mapAddrCounts[node->addr].push_back(node);
mapAddrCounts[node->addr.GetGroup()].push_back(node);
if (mapAddrCounts[node->addr].size() > nMostConnections) {
nMostConnections = mapAddrCounts[node->addr].size();
naMostConnections = node->addr;
if (mapAddrCounts[node->addr.GetGroup()].size() > nMostConnections) {
nMostConnections = mapAddrCounts[node->addr.GetGroup()].size();
naMostConnections = node->addr.GetGroup();
}
}
// Reduce to the CNetAddr with the most connections
// Reduce to the network group with the most connections
vEvictionCandidates = mapAddrCounts[naMostConnections];
// Do not disconnect peers who have only 1 evictable connection
// Do not disconnect peers if there is only 1 connection from their network group
if (vEvictionCandidates.size() <= 1)
// unless we prefer the new connection (for whitelisted peers)
if (!fPreferNewConnection)
return false;
// Disconnect the most recent connection from the CNetAddr with the most connections
// Disconnect the most recent connection from the network group with the most connections
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeTimeConnected);
vEvictionCandidates[0]->fDisconnect = true;