diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2016-02-01 10:36:45 +0100 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2016-02-01 10:46:44 +0100 |
commit | e2d9a5858807c0998a23cb28a5e1734fe054fe60 (patch) | |
tree | 408aa47baf58f66c3adaf6a41d5633ac42aed482 | |
parent | cb83beb3759b9bd19cc13b1e3dd589349787ac3e (diff) | |
parent | 8e09f914f8ec66301257358b250e9a61befadd95 (diff) | |
download | bitcoin-e2d9a5858807c0998a23cb28a5e1734fe054fe60.tar.xz |
Merge #7438: Do not absolutely protect local peers; decide group ties based on time.
8e09f91 Decide eviction group ties based on time. (Gregory Maxwell)
46dbcd4 Do not absolutely protect local peers from eviction. (Gregory Maxwell)
-rw-r--r-- | src/net.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/net.cpp b/src/net.cpp index 8abfc4b430..2f60cfa1ca 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -884,8 +884,6 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { continue; if (node->fDisconnect) continue; - if (node->addr.IsLocal()) - continue; vEvictionCandidates.push_back(CNodeRef(node)); } } @@ -916,15 +914,20 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { if (vEvictionCandidates.empty()) return false; - // Identify the network group with the most connections + // Identify the network group with the most connections and youngest member. + // (vEvictionCandidates is already sorted by reverse connect time) std::vector<unsigned char> naMostConnections; unsigned int nMostConnections = 0; + int64_t nMostConnectionsTime = 0; std::map<std::vector<unsigned char>, std::vector<CNodeRef> > mapAddrCounts; BOOST_FOREACH(const CNodeRef &node, vEvictionCandidates) { mapAddrCounts[node->addr.GetGroup()].push_back(node); + int64_t grouptime = mapAddrCounts[node->addr.GetGroup()][0]->nTimeConnected; + size_t groupsize = mapAddrCounts[node->addr.GetGroup()].size(); - if (mapAddrCounts[node->addr.GetGroup()].size() > nMostConnections) { - nMostConnections = mapAddrCounts[node->addr.GetGroup()].size(); + if (groupsize > nMostConnections || (groupsize == nMostConnections && grouptime > nMostConnectionsTime)) { + nMostConnections = groupsize; + nMostConnectionsTime = grouptime; naMostConnections = node->addr.GetGroup(); } } @@ -932,14 +935,13 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { // Reduce to the network group with the most connections vEvictionCandidates = mapAddrCounts[naMostConnections]; - // Do not disconnect peers if there is only 1 connection from their network group + // Do not disconnect peers if there is only one unprotected 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 network group with the most connections - std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeTimeConnected); + // Disconnect from the network group with the most connections vEvictionCandidates[0]->fDisconnect = true; return true; |