aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2016-02-01 10:36:45 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2016-02-01 10:46:44 +0100
commite2d9a5858807c0998a23cb28a5e1734fe054fe60 (patch)
tree408aa47baf58f66c3adaf6a41d5633ac42aed482
parentcb83beb3759b9bd19cc13b1e3dd589349787ac3e (diff)
parent8e09f914f8ec66301257358b250e9a61befadd95 (diff)
downloadbitcoin-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.cpp18
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;