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();
    }
}
示例#2
0
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 << "'";
        }
    }
}
示例#3
0
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);
}