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
parent 000c18aace
commit 027de94e1f
No known key found for this signature in database
GPG key ID: 77E80682A83DB40E

View file

@ -898,29 +898,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;