Skip to content
This repository has been archived by the owner on Oct 28, 2021. It is now read-only.

Commit

Permalink
Get rid of assigning endpoint to Peer in Host::onNodeTableEvent and H…
Browse files Browse the repository at this point in the history
…ost::requirePeer.

Instead recreate Peer in case the endpoint changed for the same NodeID.
  • Loading branch information
gumb0 committed Sep 17, 2018
1 parent 49c7e50 commit 2a13489
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 42 deletions.
88 changes: 46 additions & 42 deletions libp2p/Host.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,13 +241,11 @@ void Host::startPeerSession(Public const& _id, RLP const& _rlp, unique_ptr<RLPXF
shared_ptr<Peer> peer;
DEV_RECURSIVE_GUARDED(x_sessions)
{
auto const itPeer = m_peers.find(_id);
auto const remoteAddress = _s->remoteEndpoint().address();
auto const remoteTcpPort = _s->remoteEndpoint().port();
if (itPeer != m_peers.end() && itPeer->second->endpoint.address() == remoteAddress &&
itPeer->second->endpoint.tcpPort() == remoteTcpPort)
peer = itPeer->second;
else

peer = findPeer(_id, remoteAddress, remoteTcpPort);
if (!peer)
{
peer = make_shared<Peer>(Node{_id, NodeIPEndpoint{remoteAddress, 0, remoteTcpPort}});
m_peers[_id] = peer;
Expand Down Expand Up @@ -344,38 +342,35 @@ void Host::startPeerSession(Public const& _id, RLP const& _rlp, unique_ptr<RLPXF
LOG(m_logger) << "p2p.host.peer.register " << _id;
}

void Host::onNodeTableEvent(NodeID const& _n, NodeTableEventType const& _e)
void Host::onNodeTableEvent(NodeID const& _nodeID, NodeTableEventType const& _e)
{
if (_e == NodeEntryAdded)
{
LOG(m_logger) << "p2p.host.nodeTable.events.nodeEntryAdded " << _n;
if (Node n = nodeFromNodeTable(_n))
LOG(m_logger) << "p2p.host.nodeTable.events.nodeEntryAdded " << _nodeID;
if (Node node = nodeFromNodeTable(_nodeID))
{
shared_ptr<Peer> p;
shared_ptr<Peer> peer;
DEV_RECURSIVE_GUARDED(x_sessions)
{
if (m_peers.count(_n))
{
p = m_peers[_n];
p->endpoint = n.endpoint;
}
else
peer = findPeer(_nodeID, node.endpoint.address(), node.endpoint.tcpPort());
if (!peer)
{
p = make_shared<Peer>(n);
m_peers[_n] = p;
LOG(m_logger) << "p2p.host.peers.events.peerAdded " << _n << " " << p->endpoint;
peer = make_shared<Peer>(node);
m_peers[_nodeID] = peer;
LOG(m_logger) << "p2p.host.peers.events.peerAdded " << _nodeID << " "
<< peer->endpoint;
}
}
if (peerSlotsAvailable(Egress))
connect(p);
connect(peer);
}
}
else if (_e == NodeEntryDropped)
{
LOG(m_logger) << "p2p.host.nodeTable.events.NodeEntryDropped " << _n;
LOG(m_logger) << "p2p.host.nodeTable.events.NodeEntryDropped " << _nodeID;
RecursiveGuard l(x_sessions);
if (m_peers.count(_n) && m_peers[_n]->peerType == PeerType::Optional)
m_peers.erase(_n);
if (m_peers.count(_nodeID) && m_peers[_nodeID]->peerType == PeerType::Optional)
m_peers.erase(_nodeID);
}
}

Expand Down Expand Up @@ -536,52 +531,50 @@ void Host::addNode(NodeID const& _node, NodeIPEndpoint const& _endpoint)
addNodeToNodeTable(Node(_node, _endpoint));
}

void Host::requirePeer(NodeID const& _n, NodeIPEndpoint const& _endpoint)
void Host::requirePeer(NodeID const& _nodeID, NodeIPEndpoint const& _endpoint)
{
{
Guard l(x_requiredPeers);
m_requiredPeers.insert(_n);
m_requiredPeers.insert(_nodeID);
}

if (!m_run)
return;
if (_n == id())

if (_nodeID == id())
{
cnetdetails << "Ingoring the request to connect to self " << _n;
cnetdetails << "Ingoring the request to connect to self " << _nodeID;
return;
}

Node node(_n, _endpoint, PeerType::Required);
if (_n)
Node node(_nodeID, _endpoint, PeerType::Required);
if (_nodeID)
{
// create or update m_peers entry
shared_ptr<Peer> p;
shared_ptr<Peer> peer;
DEV_RECURSIVE_GUARDED(x_sessions)
if (m_peers.count(_n))
{
p = m_peers[_n];
p->endpoint = node.endpoint;
p->peerType = PeerType::Required;
}
{
peer = findPeer(_nodeID, node.endpoint.address(), node.endpoint.tcpPort());
if (peer)
peer->peerType = PeerType::Required;
else
{
p = make_shared<Peer>(node);
m_peers[_n] = p;
peer = make_shared<Peer>(node);
m_peers[_nodeID] = peer;
}
}
// required for discovery
addNodeToNodeTable(*p, NodeTable::NodeRelation::Unknown);
addNodeToNodeTable(*peer, NodeTable::NodeRelation::Unknown);
}
else
{
if (!addNodeToNodeTable(node))
return;
auto t = make_shared<boost::asio::deadline_timer>(m_ioService);
t->expires_from_now(boost::posix_time::milliseconds(600));
t->async_wait([this, _n](boost::system::error_code const& _ec)
{
t->async_wait([this, _nodeID](boost::system::error_code const& _ec) {
if (!_ec)
if (auto n = nodeFromNodeTable(_n))
if (auto n = nodeFromNodeTable(_nodeID))
requirePeer(n.id, n.endpoint);
});
DEV_GUARDED(x_timers)
Expand Down Expand Up @@ -1026,3 +1019,14 @@ std::vector<std::pair<std::shared_ptr<SessionFace>, std::shared_ptr<Peer>>> Host
ret.push_back(make_pair(s, s->peer()));
return ret;
}

std::shared_ptr<Peer> Host::findPeer(
NodeID const& _nodeID, bi::address const& _address, unsigned short _tcpPort) const
{
auto const itPeer = m_peers.find(_nodeID);
if (itPeer != m_peers.end() && itPeer->second->endpoint.address() == _address &&
itPeer->second->endpoint.tcpPort() == _tcpPort)
return itPeer->second;

return {};
}
3 changes: 3 additions & 0 deletions libp2p/Host.h
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,9 @@ class Host: public Worker
Node nodeFromNodeTable(Public const& _id) const;
bool addNodeToNodeTable(Node const& _node, NodeTable::NodeRelation _relation = NodeTable::NodeRelation::Unknown);

std::shared_ptr<Peer> findPeer(
NodeID const& _nodeID, bi::address const& _address, unsigned short _tcpPort) const;

bytes m_restoreNetwork; ///< Set by constructor and used to set Host key and restore network peers & nodes.

std::atomic<bool> m_run{false}; ///< Whether network is running.
Expand Down

0 comments on commit 2a13489

Please sign in to comment.