diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index bcdf318a8..96604df89 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -90,6 +90,8 @@ void TransactionAcquire::trigger(Peer::ref peer, bool timer) ripple::TMGetLedger tmGL; tmGL.set_ledgerhash(mHash.begin(), mHash.size()); tmGL.set_itype(ripple::liTS_CANDIDATE); + if (getTimeouts() != 0) + tmGL.set_querytype(ripple::qtINDIRECT); *(tmGL.add_nodeids()) = SHAMapNode().getRawString(); sendRequest(tmGL, peer); } @@ -113,6 +115,8 @@ void TransactionAcquire::trigger(Peer::ref peer, bool timer) ripple::TMGetLedger tmGL; tmGL.set_ledgerhash(mHash.begin(), mHash.size()); tmGL.set_itype(ripple::liTS_CANDIDATE); + if (getTimeouts() != 0) + tmGL.set_querytype(ripple::qtINDIRECT); BOOST_FOREACH(SHAMapNode& it, nodeIDs) *(tmGL.add_nodeids()) = it.getRawString(); sendRequest(tmGL, peer); diff --git a/src/Peer.cpp b/src/Peer.cpp index 3a64ef21e..5aad301fe 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -1174,7 +1174,24 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet) { if (packet.has_querytype() && !packet.has_requestcookie()) { - // WRITEME: try to route + cLog(lsINFO) << "Trying to route TX set request"; + std::vector peerList = theApp->getConnectionPool().getPeerVector(); + std::vector usablePeers; + BOOST_FOREACH(Peer::ref peer, peerList) + { + if (peer->hasTxSet(txHash)) + usablePeers.push_back(peer); + } + if (usablePeers.empty()) + { + cLog(lsINFO) << "Unable to route TX set request"; + return; + } + Peer::ref selectedPeer = usablePeers[rand() % usablePeers.size()]; + packet.set_requestcookie(getPeerId()); + selectedPeer->sendPacket(boost::make_shared(packet, ripple::mtGET_LEDGER)); + cLog(lsDEBUG) << "TX set request routed"; + return; } cLog(lsERROR) << "We do not have the map our peer wants"; punishPeer(PP_INVALID_REQUEST); @@ -1332,7 +1349,18 @@ void Peer::recvLedger(ripple::TMLedgerData& packet) if (packet.has_requestcookie()) { - // WRITEME: Route to original requester + Peer::pointer target = theApp->getConnectionPool().getPeerById(packet.requestcookie()); + if (target) + { + packet.clear_requestcookie(); + target->sendPacket(boost::make_shared(packet, ripple::mtLEDGER_DATA)); + } + else + { + cLog(lsINFO) << "Unable to route TX set reply"; + punishPeer(PP_UNWANTED_DATA); + } + return; } if (packet.type() == ripple::liTS_CANDIDATE)