diff --git a/src/ripple_overlay/impl/PeerImp.h b/src/ripple_overlay/impl/PeerImp.h index 7156190d7..8c701090f 100644 --- a/src/ripple_overlay/impl/PeerImp.h +++ b/src/ripple_overlay/impl/PeerImp.h @@ -1842,6 +1842,50 @@ private: std::bind (&sGetLedger, boost::weak_ptr (shared_from_this ()), packet)); } + /** A peer has sent us transaction set data */ + static void peerTXData (Job&, + boost::weak_ptr wPeer, + uint256 const& hash, + boost::shared_ptr pPacket, + beast::Journal journal) + { + boost::shared_ptr peer = wPeer.lock (); + if (!peer) + return; + + protocol::TMLedgerData& packet = *pPacket; + + std::list nodeIDs; + std::list< Blob > nodeData; + for (int i = 0; i < packet.nodes ().size (); ++i) + { + const protocol::TMLedgerNode& node = packet.nodes (i); + + if (!node.has_nodeid () || !node.has_nodedata () || (node.nodeid ().size () != 33)) + { + journal.warning << "LedgerData request with invalid node ID"; + peer->charge (Resource::feeInvalidRequest); + return; + } + + nodeIDs.push_back (SHAMapNode (node.nodeid ().data (), node.nodeid ().size ())); + nodeData.push_back (Blob (node.nodedata ().begin (), node.nodedata ().end ())); + } + + SHAMapAddNode san; + { + Application::ScopedLockType lock (getApp ().getMasterLock ()); + + san = getApp().getOPs().gotTXData (peer, hash, nodeIDs, nodeData); + } + + if (san.isInvalid ()) + { + peer->charge (Resource::feeUnwantedData); + } + + } + void recvLedger (boost::shared_ptr const& packet_ptr) { protocol::TMLedgerData& packet = *packet_ptr; @@ -1884,35 +1928,11 @@ private: if (packet.type () == protocol::liTS_CANDIDATE) { // got data for a candidate transaction set - std::list nodeIDs; - std::list< Blob > nodeData; - for (int i = 0; i < packet.nodes ().size (); ++i) - { - const protocol::TMLedgerNode& node = packet.nodes (i); - - if (!node.has_nodeid () || !node.has_nodedata () || (node.nodeid ().size () != 33)) - { - m_journal.warning << "LedgerData request with invalid node ID"; - charge (Resource::feeInvalidRequest); - return; - } - - nodeIDs.push_back (SHAMapNode (node.nodeid ().data (), node.nodeid ().size ())); - nodeData.push_back (Blob (node.nodedata ().begin (), node.nodedata ().end ())); - } - - SHAMapAddNode san; - { - Application::ScopedLockType lock (getApp ().getMasterLock ()); - - san = getApp().getOPs ().gotTXData (shared_from_this (), hash, nodeIDs, nodeData); - } - - if (san.isInvalid ()) - { - charge (Resource::feeUnwantedData); - } + getApp().getJobQueue().addJob (jtTXN_DATA, "recvPeerData", + BIND_TYPE (&PeerImp::peerTXData, P_1, + boost::weak_ptr (shared_from_this ()), + hash, packet_ptr, m_journal)); return; }