diff --git a/src/net.cpp b/src/net.cpp index 0fab0f82af..77dde99445 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -818,7 +818,7 @@ public: } }; -static bool AttemptToEvictConnection() { +static bool AttemptToEvictConnection(bool fPreferNewConnection) { std::vector vEvictionCandidates; { LOCK(cs_vNodes); @@ -866,8 +866,11 @@ static bool AttemptToEvictConnection() { // Reduce to the CNetAddr with the most connections vEvictionCandidates = mapAddrCounts[naMostConnections]; + // Do not disconnect peers who have only 1 evictable connection if (vEvictionCandidates.size() <= 1) - return false; + // 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 std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeTimeConnected); @@ -920,7 +923,7 @@ static void AcceptConnection(const ListenSocket& hListenSocket) { if (nInbound >= nMaxInbound) { - if (!AttemptToEvictConnection()) { + if (!AttemptToEvictConnection(whitelisted)) { // No connection to evict, disconnect the new connection LogPrint("net", "failed to find an eviction candidate - connection dropped (full)\n"); CloseSocket(hSocket);