From e9c00ab2f924f6af7ddfa5a2f27bc7110673cce8 Mon Sep 17 00:00:00 2001 From: subtly Date: Sun, 14 Jun 2015 06:30:20 -0400 Subject: [PATCH] ensure required peers --- libp2p/Host.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/libp2p/Host.cpp b/libp2p/Host.cpp index b0d246458..596182413 100644 --- a/libp2p/Host.cpp +++ b/libp2p/Host.cpp @@ -619,26 +619,36 @@ void Host::run(boost::system::error_code const&) // updated. // disconnectLatePeers(); // todo: update peerSlotsAvailable() + + list> toConnect; + unsigned reqConn = 0; + { + RecursiveGuard l(x_sessions); + for (auto const& p: m_peers) + { + bool haveSession = havePeerSession(p.second->id); + bool required = p.second->required; + if (haveSession && required) + reqConn++; + else if (!haveSession && p.second->shouldReconnect() && (!m_netPrefs.pin || required)) + toConnect.push_back(p.second); + } + } + + for (auto p: toConnect) + if (p->required && reqConn++ < m_idealPeerCount) + connect(p); + unsigned pendingCount = 0; DEV_GUARDED(x_pendingNodeConns) pendingCount = m_pendingPeerConns.size(); - int openSlots = m_idealPeerCount - peerCount() - pendingCount; - if (openSlots > 0) + int openSlots = m_idealPeerCount - peerCount() - pendingCount + reqConn; + if (openSlots > 0 && !m_netPrefs.pin) { - list> toConnect; - { - RecursiveGuard l(x_sessions); - for (auto p: m_peers) - if (p.second->shouldReconnect() && !havePeerSession(p.second->id) && (!m_netPrefs.pin || p.second->required)) - toConnect.push_back(p.second); - } - for (auto p: toConnect) - if (openSlots--) + if (!p->required && openSlots--) connect(p); - else - break; - + m_nodeTable->discover(); }