Make it possible to track peers by 64-bit peer ID.

This commit is contained in:
JoelKatz
2012-11-05 17:15:27 -08:00
parent f0521ec619
commit 4d067676ea
2 changed files with 29 additions and 2 deletions

View File

@@ -110,6 +110,21 @@ bool ConnectionPool::savePeer(const std::string& strIp, int iPort, char code)
return bNew;
}
Peer::pointer ConnectionPool::getPeerById(const uint64& id)
{
boost::mutex::scoped_lock sl(mPeerLock);
boost::unordered_map<uint64, Peer::pointer>::iterator it = mPeerIdMap.find(id);
if (it == mPeerIdMap.end())
return Peer::pointer();
return it->second;
}
bool ConnectionPool::hasPeer(const uint64& id)
{
boost::mutex::scoped_lock sl(mPeerLock);
return mPeerIdMap.find(id) != mPeerIdMap.end();
}
// An available peer is one we had no trouble connect to last time and that we are not currently knowingly connected or connecting
// too.
//
@@ -412,6 +427,9 @@ bool ConnectionPool::peerConnected(Peer::ref peer, const RippleAddress& naPeer,
mConnectedMap[naPeer] = peer;
bNew = true;
assert(peer->getPeerId() != 0);
mPeerIdMap.insert(std::make_pair(peer->getPeerId(), peer));
}
// Found in map, already connected.
else if (!strIP.empty())
@@ -450,11 +468,12 @@ bool ConnectionPool::peerConnected(Peer::ref peer, const RippleAddress& naPeer,
// We maintain a map of public key to peer for connected and verified peers. Maintain it.
void ConnectionPool::peerDisconnected(Peer::ref peer, const RippleAddress& naPeer)
{
boost::mutex::scoped_lock sl(mPeerLock);
if (naPeer.isValid())
{
boost::unordered_map<RippleAddress, Peer::pointer>::iterator itCm;
boost::mutex::scoped_lock sl(mPeerLock);
itCm = mConnectedMap.find(naPeer);
@@ -482,6 +501,9 @@ void ConnectionPool::peerDisconnected(Peer::ref peer, const RippleAddress& naPee
{
//cLog(lsINFO) << "Pool: disconnected: anonymous: " << peer->getIP() << " " << peer->getPort();
}
assert(peer->getPeerId() != 0);
mPeerIdMap.erase(peer->getPeerId());
}
// Schedule for immediate scanning, if not already scheduled.

View File

@@ -19,7 +19,7 @@ private:
boost::mutex mPeerLock;
uint64 mLastPeer;
typedef std::pair<RippleAddress, Peer::pointer> naPeer;
typedef std::pair<RippleAddress, Peer::pointer> naPeer;
typedef std::pair<ipPort, Peer::pointer> pipPeer;
// Peers we are connecting with and non-thin peers we are connected to.
@@ -33,6 +33,9 @@ private:
// Peers we have the public key for.
boost::unordered_map<RippleAddress, Peer::pointer> mConnectedMap;
// Connections with have a 64-bit identifier
boost::unordered_map<uint64, Peer::pointer> mPeerIdMap;
boost::asio::ssl::context mCtx;
Peer::pointer mScanning;
@@ -94,6 +97,8 @@ public:
// Peer 64-bit ID function
uint64 assignPeerId();
Peer::pointer getPeerById(const uint64& id);
bool hasPeer(const uint64& id);
//
// Scanning