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
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 << "'";
        }
    }
}