|
|
|
@ -1721,11 +1721,17 @@ void CConnman::ThreadOpenConnections()
@@ -1721,11 +1721,17 @@ void CConnman::ThreadOpenConnections()
|
|
|
|
|
// Only connect out to one peer per network group (/16 for IPv4).
|
|
|
|
|
// Do this here so we don't have to critsect vNodes inside mapAddresses critsect.
|
|
|
|
|
int nOutbound = 0; |
|
|
|
|
int nOutboundRelevant = 0; |
|
|
|
|
std::set<std::vector<unsigned char> > setConnected; |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
BOOST_FOREACH(CNode* pnode, vNodes) { |
|
|
|
|
if (!pnode->fInbound && !pnode->fAddnode) { |
|
|
|
|
|
|
|
|
|
// Count the peers that have all relevant services
|
|
|
|
|
if (pnode->fSuccessfullyConnected && !pnode->fFeeler && ((pnode->nServices & nRelevantServices) == nRelevantServices)) { |
|
|
|
|
nOutboundRelevant++; |
|
|
|
|
} |
|
|
|
|
// Netgroups for inbound and addnode peers are not excluded because our goal here
|
|
|
|
|
// is to not use multiple of our limited outbound slots on a single netgroup
|
|
|
|
|
// but inbound and addnode peers do not use our outbound slots. Inbound peers
|
|
|
|
@ -1789,14 +1795,27 @@ void CConnman::ThreadOpenConnections()
@@ -1789,14 +1795,27 @@ void CConnman::ThreadOpenConnections()
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
// only consider nodes missing relevant services after 40 failed attempts and only if less than half the outbound are up.
|
|
|
|
|
if ((addr.nServices & nRelevantServices) != nRelevantServices && (nTries < 40 || nOutbound >= (nMaxOutbound >> 1))) |
|
|
|
|
ServiceFlags nRequiredServices = nRelevantServices; |
|
|
|
|
if (nTries >= 40 && nOutbound < (nMaxOutbound >> 1)) { |
|
|
|
|
nRequiredServices = REQUIRED_SERVICES; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((addr.nServices & nRequiredServices) != nRequiredServices) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// do not allow non-default ports, unless after 50 invalid addresses selected already
|
|
|
|
|
if (addr.GetPort() != Params().GetDefaultPort() && nTries < 50) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
addrConnect = addr; |
|
|
|
|
|
|
|
|
|
// regardless of the services assumed to be available, only require the minimum if half or more outbound have relevant services
|
|
|
|
|
if (nOutboundRelevant >= (nMaxOutbound >> 1)) { |
|
|
|
|
addrConnect.nServices = REQUIRED_SERVICES; |
|
|
|
|
} else { |
|
|
|
|
addrConnect.nServices = nRequiredServices; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|