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(); } }
void OverlayManagerImpl::storePeerList(std::vector<std::string> const& list) { for (auto const& peerStr : list) { PeerRecord pr; if (PeerRecord::parseIPPort(peerStr, mApp, pr)) { pr.insertIfNew(mApp.getDatabase()); } else { CLOG(ERROR, "Overlay") << "Unable to add peer '" << peerStr << "'"; } } }
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::storeConfigPeers() { // compute normalized mPreferredPeers std::vector<std::string> ppeers; for (auto const& s : mApp.getConfig().PREFERRED_PEERS) { PeerRecord pr; if (PeerRecord::parseIPPort(s, mApp, pr)) { auto r = mPreferredPeers.insert(pr.toString()); if (r.second) { ppeers.push_back(*r.first); } } } storePeerList(mApp.getConfig().KNOWN_PEERS, true); storePeerList(ppeers, true); }