mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Get ledger acquire work off the main thread and out of the master lock.
Prioritize ledger acquire work appripriately. This should help prevent the server from becoming overly sluggish while acquiring ledgers. Still todo: Finish all pending receive operations before sending out any data requests.
This commit is contained in:
@@ -477,6 +477,7 @@ void LedgerAcquire::trigger(Peer::ref peer)
|
||||
{
|
||||
cLog(lsDEBUG) << "Done:" << (mComplete ? " complete" : "") << (mFailed ? " failed " : " ")
|
||||
<< mLedger->getLedgerSeq();
|
||||
sl.unlock();
|
||||
done();
|
||||
}
|
||||
}
|
||||
@@ -830,13 +831,19 @@ void LedgerAcquireMaster::dropLedger(const uint256& hash)
|
||||
mLedgers.erase(hash);
|
||||
}
|
||||
|
||||
SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer::ref peer)
|
||||
void LedgerAcquireMaster::gotLedgerData(Job&, boost::shared_ptr<ripple::TMLedgerData> packet_ptr,
|
||||
boost::weak_ptr<Peer> wPeer)
|
||||
{
|
||||
ripple::TMLedgerData& packet = *packet_ptr;
|
||||
Peer::pointer peer = wPeer.lock();
|
||||
if (!peer)
|
||||
return;
|
||||
|
||||
uint256 hash;
|
||||
if (packet.ledgerhash().size() != 32)
|
||||
{
|
||||
std::cerr << "Acquire error" << std::endl;
|
||||
return SMAddNode::invalid();
|
||||
peer->punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
memcpy(hash.begin(), packet.ledgerhash().data(), 32);
|
||||
cLog(lsTRACE) << "Got data (" << packet.nodes().size() << ") for acquiring ledger: " << hash;
|
||||
@@ -845,7 +852,8 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer:
|
||||
if (!ledger)
|
||||
{
|
||||
cLog(lsINFO) << "Got data for ledger we're not acquiring";
|
||||
return SMAddNode();
|
||||
peer->punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
|
||||
if (packet.type() == ripple::liBASE)
|
||||
@@ -853,12 +861,14 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer:
|
||||
if (packet.nodes_size() < 1)
|
||||
{
|
||||
cLog(lsWARNING) << "Got empty base data";
|
||||
return SMAddNode::invalid();
|
||||
peer->punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
if (!ledger->takeBase(packet.nodes(0).nodedata()))
|
||||
{
|
||||
cLog(lsWARNING) << "Got invalid base data";
|
||||
return SMAddNode::invalid();
|
||||
peer->punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
SMAddNode san = SMAddNode::useful();
|
||||
if ((packet.nodes().size() > 1) && !ledger->takeAsRootNode(strCopy(packet.nodes(1).nodedata()), san))
|
||||
@@ -871,7 +881,7 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer:
|
||||
}
|
||||
if (!san.isInvalid())
|
||||
ledger->trigger(peer);
|
||||
return san;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((packet.type() == ripple::liTX_NODE) || (packet.type() == ripple::liAS_NODE))
|
||||
@@ -882,7 +892,8 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer:
|
||||
if (packet.nodes().size() <= 0)
|
||||
{
|
||||
cLog(lsINFO) << "Got response with no nodes";
|
||||
return SMAddNode::invalid();
|
||||
peer->punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < packet.nodes().size(); ++i)
|
||||
{
|
||||
@@ -890,7 +901,8 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer:
|
||||
if (!node.has_nodeid() || !node.has_nodedata())
|
||||
{
|
||||
cLog(lsWARNING) << "Got bad node";
|
||||
return SMAddNode::invalid();
|
||||
peer->punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
|
||||
nodeIDs.push_back(SHAMapNode(node.nodeid().data(), node.nodeid().size()));
|
||||
@@ -902,12 +914,12 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer:
|
||||
else
|
||||
ledger->takeAsNode(nodeIDs, nodeData, ret);
|
||||
if (!ret.isInvalid())
|
||||
ledger->trigger(peer);
|
||||
return ret;
|
||||
ledger->trigger(peer);
|
||||
return;
|
||||
}
|
||||
|
||||
cLog(lsWARNING) << "Not sure what ledger data we got";
|
||||
return SMAddNode::invalid();
|
||||
peer->punishPeer(LT_InvalidRequest);
|
||||
}
|
||||
|
||||
void LedgerAcquireMaster::sweep()
|
||||
|
||||
Reference in New Issue
Block a user