mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 10:38:42 +01:00
Merge #10441: net: only enforce expected services for half of outgoing connections
b6fbfc2
net: only enforce the services required to connect (Cory Fields)
Tree-SHA512: 88943bff63213a734f3c96c45760cadaeb9ba18287c8a20c279851ebaf058a334c969028fb2180f155508e3eea4b838147382e4f2b655e7a9aa098eadc81d53e
This commit is contained in:
commit
cb1716acc7
21
src/net.cpp
21
src/net.cpp
@ -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()
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user