PeerFinder work

This commit is contained in:
Nik Bougalis
2013-10-29 20:47:15 -07:00
committed by Vinnie Falco
parent e710bd2183
commit 42b841735e
16 changed files with 624 additions and 58 deletions

View File

@@ -332,6 +332,8 @@ private:
else
m_usage = m_resourceManager.newOutboundEndpoint (m_remoteAddress);
getApp ().getPeers ().peerConnected(m_remoteAddress, m_isInbound);
// Must compute mCookieHash before receiving a hello.
sendHello ();
startReadHeader ();
@@ -378,6 +380,8 @@ private:
else
m_usage = m_resourceManager.newOutboundEndpoint (m_remoteAddress);
getApp ().getPeers ().peerConnected(m_remoteAddress, m_isInbound);
// Must compute mCookieHash before receiving a hello.
sendHello ();
startReadHeader ();
@@ -624,7 +628,13 @@ void PeerImp::connect (const std::string& strIp, int iPort)
if (!err)
{
WriteLog (lsINFO, Peer) << "Peer: Connect: Outbound: " << addressToString (this) << ": " << mIpPort.first << " " << mIpPort.second;
WriteLog (lsINFO, Peer) << "Peer: Connect: Outbound: " <<
addressToString (this) << ": " <<
mIpPort.first << " " << mIpPort.second;
// Notify peer finder that we have a connection attempt in-progress
getApp ().getPeers ().getPeerFinder ().onPeerConnectAttemptBegins(
IPAddress::from_string(strIp).withPort(iPortAct) );
boost::asio::async_connect (
getNativeSocket (),
@@ -640,14 +650,23 @@ void PeerImp::connect (const std::string& strIp, int iPort)
// Connect ssl as client.
void PeerImp::handleConnect (const boost::system::error_code& error, boost::asio::ip::tcp::resolver::iterator it)
{
// Notify peer finder about the status of this in-progress connection attempt
getApp ().getPeers ().getPeerFinder ().onPeerConnectAttemptCompletes(
IPAddress::from_string(getIP()).withPort(getPort()), !error );
if (error)
{
WriteLog (lsINFO, Peer) << "Peer: Connect: Error: " << error.category ().name () << ": " << error.message () << ": " << error;
WriteLog (lsINFO, Peer) << "Peer: Connect: Error: " <<
getIP() << ":" << getPort() <<
" (" << error.category ().name () <<
": " << error.message () <<
": " << error << ")";
detach ("hc", true);
}
else
{
WriteLog (lsINFO, Peer) << "Connect peer: success.";
WriteLog (lsINFO, Peer) << "Peer: Connect: Success: " <<
getIP() << ":" << getPort();
getHandshakeStream ().set_verify_mode (boost::asio::ssl::verify_none);
@@ -1158,7 +1177,7 @@ void PeerImp::recvHello (protocol::TMHello& packet)
getApp().getPeers ().peerVerified (shared_from_this ());
}
if (! getApp().getPeers ().peerConnected (shared_from_this (), mNodePublic, getIP (), getPort ()))
if (! getApp().getPeers ().peerHandshake (shared_from_this (), mNodePublic, getIP (), getPort ()))
{
// Already connected, self, or some other reason.
WriteLog (lsINFO, Peer) << "Recv(Hello): Disconnect: Extraneous connection.";

View File

@@ -116,9 +116,7 @@ public:
{
PeerFinder::Config config;
#if RIPPLE_USE_PEERFINDER
config.maxPeerCount = getConfig ().PEERS_MAX;
#endif
config.wantIncoming =
(! getConfig ().PEER_PRIVATE) &&
@@ -271,9 +269,18 @@ public:
bool getTopNAddrs (int n, std::vector<std::string>& addrs);
bool savePeer (const std::string& strIp, int iPort, char code);
// disconnect the specified peer
void disconnectPeer (PeerFinder::PeerID const &id, bool graceful)
{
// NIKB TODO
}
// A peer connected but we only have the IP address so far.
void peerConnected (const IPAddress& address, bool incoming);
// We know peers node public key.
// <-- bool: false=reject
bool peerConnected (Peer::ref peer, const RippleAddress& naPeer, const std::string& strIP, int iPort);
bool peerHandshake (Peer::ref peer, const RippleAddress& naPeer, const std::string& strIP, int iPort);
// No longer connected.
void peerDisconnected (Peer::ref peer, const RippleAddress& naPeer);
@@ -641,7 +648,7 @@ void PeersImp::connectTo (const std::string& strIp, int iPort)
// <-- true, if already connected.
Peer::pointer PeersImp::peerConnect (const std::string& strIp, int iPort)
{
IPAndPortNumber pipPeer = make_pair (strIp, iPort);
IPAndPortNumber pipPeer = make_pair (strIp, iPort);
Peer::pointer ppResult;
{
@@ -716,9 +723,14 @@ uint64 PeersImp::assignPeerId ()
return ++mLastPeer;
}
void PeersImp::peerConnected (const IPAddress& address, bool incoming)
{
getPeerFinder ().onPeerConnected (address, incoming);
}
// Now know peer's node public key. Determine if we want to stay connected.
// <-- bNew: false = redundant
bool PeersImp::peerConnected (Peer::ref peer, const RippleAddress& naPeer,
bool PeersImp::peerHandshake (Peer::ref peer, const RippleAddress& naPeer,
const std::string& strIP, int iPort)
{
bool bNew = false;
@@ -745,7 +757,7 @@ bool PeersImp::peerConnected (Peer::ref peer, const RippleAddress& naPeer,
// Notify peerfinder since this is a connection that we didn't
// know about and are keeping
//
getPeerFinder ().onPeerConnected (RipplePublicKey (
getPeerFinder ().onPeerHandshake (RipplePublicKey (
peer->getNodePublic()), peer->getPeerEndpoint(),
peer->isInbound());

View File

@@ -62,9 +62,13 @@ public:
virtual bool getTopNAddrs (int n, std::vector<std::string>& addrs) = 0;
virtual bool savePeer (const std::string& strIp, int iPort, char code) = 0;
// A peer connection has been established, but we know nothing about it at
// this point beyond the IP address.
virtual void peerConnected (const IPAddress& address, bool incoming) = 0;
// We know peers node public key.
// <-- bool: false=reject
virtual bool peerConnected (Peer::ref peer, const RippleAddress& naPeer, const std::string& strIP, int iPort) = 0;
virtual bool peerHandshake (Peer::ref peer, const RippleAddress& naPeer, const std::string& strIP, int iPort) = 0;
// No longer connected.
virtual void peerDisconnected (Peer::ref peer, const RippleAddress& naPeer) = 0;