void OverlayManagerImpl::connectTo(PeerRecord& pr) { if (pr.mPort == 0) { CLOG(ERROR, "Overlay") << "Invalid port: " << pr.toString(); return; } if (!pr.mIP.size()) { CLOG(ERROR, "Overlay") << "OverlayManagerImpl::connectTo Invalid IP "; return; } mConnectionsAttempted.Mark(); if (!getConnectedPeer(pr.mIP, pr.mPort)) { pr.backOff(mApp.getClock()); pr.storePeerRecord(mApp.getDatabase()); addConnectedPeer(TCPPeer::initiate(mApp, pr.mIP, pr.mPort)); } else { CLOG(ERROR, "Overlay") << "trying to connect to a node we're already connected to" << pr.toString(); } }
bool TCPPeer::recvHello(StellarMessage const& msg) { mHelloTimer.cancel(); if (!Peer::recvHello(msg)) return false; if (mRole == INITIATOR) { if (!PeerRecord::loadPeerRecord(mApp.getDatabase(), getIP(), getRemoteListeningPort())) { PeerRecord pr; PeerRecord::fromIPPort(getIP(), getRemoteListeningPort(), mApp.getClock(), pr); pr.storePeerRecord(mApp.getDatabase()); } if (mApp.getOverlayManager().isPeerAccepted(shared_from_this())) { sendHello(); } else { // we can't accept anymore peer connections sendPeers(); drop(); } } else { // we called this guy // only lower numFailures if we were successful connecting out to him auto pr = PeerRecord::loadPeerRecord(mApp.getDatabase(), getIP(), getRemoteListeningPort()); if (!pr) { pr = make_optional<PeerRecord>(); PeerRecord::fromIPPort(getIP(), getRemoteListeningPort(), mApp.getClock(), *pr); } pr->mNumFailures = 0; pr->mNextAttempt = mApp.getClock().now(); pr->storePeerRecord(mApp.getDatabase()); } return true; }
void OverlayManagerImpl::storePeerList(std::vector<std::string> const& list, bool resetBackOff) { for (auto const& peerStr : list) { PeerRecord pr; if (PeerRecord::parseIPPort(peerStr, mApp, pr)) { if (resetBackOff) { pr.storePeerRecord(mApp.getDatabase()); } else { pr.insertIfNew(mApp.getDatabase()); } } else { CLOG(ERROR, "Overlay") << "Unable to add peer '" << peerStr << "'"; } } }