20 #include <ripple/app/ledger/AccountStateSF.h>
21 #include <ripple/app/ledger/InboundLedger.h>
22 #include <ripple/app/ledger/InboundLedgers.h>
23 #include <ripple/app/ledger/LedgerMaster.h>
24 #include <ripple/app/ledger/TransactionStateSF.h>
25 #include <ripple/app/main/Application.h>
26 #include <ripple/app/misc/NetworkOPs.h>
27 #include <ripple/basics/Log.h>
28 #include <ripple/core/JobQueue.h>
29 #include <ripple/nodestore/DatabaseShard.h>
30 #include <ripple/overlay/Overlay.h>
31 #include <ripple/protocol/HashPrefix.h>
32 #include <ripple/protocol/jss.h>
33 #include <ripple/resource/Fees.h>
34 #include <ripple/shamap/SHAMapNodeID.h>
40 using namespace std::chrono_literals;
85 app.journal(
"InboundLedger"))
88 , mHaveTransactions(false)
93 , mReceiveDispatched(false)
114 <<
"Acquiring shard with no shard store available";
126 else if (shardStore &&
mSeq >= shardStore->earliestLedgerSeq())
128 if (
auto l = shardStore->fetchLedger(
mHash,
mSeq))
146 <<
" local store. " <<
mHash;
164 JLOG(
m_journal.
debug()) <<
"Deferring InboundLedger timer due to load";
171 ptr->invokeOnTimer();
180 if ((seq != 0) && (
mSeq == 0))
214 if (entry.second->type() == protocol::liAS_NODE)
220 <<
"Acquire " <<
mHash <<
" abort "
233 if (
mLedger->info().txHash.isNonZero())
235 if (
mLedger->txMap().getHash().isZero())
238 ret =
mLedger->txMap().getNeededHashes(max, filter);
249 if (
mLedger->info().accountHash.isNonZero())
251 if (
mLedger->stateMap().getHash().isZero())
254 ret =
mLedger->stateMap().getNeededHashes(max, filter);
291 auto makeLedger = [&,
this](
Blob const& data) {
293 mLedger = std::make_shared<Ledger>(
301 <<
" cannot be a ledger";
323 makeLedger(node->getData());
336 if (
mLedger->info().txHash.isZero())
345 if (
mLedger->txMap().fetchRoot(
359 if (
mLedger->info().accountHash.isZero())
362 <<
"We are acquiring a ledger with a zero account hash";
368 if (
mLedger->stateMap().fetchRoot(
369 SHAMapHash{mLedger->info().accountHash}, &filter))
425 <<
"No progress(" << pc <<
") for ledger " <<
mHash;
493 if (self->mComplete && !self->mFailed)
495 self->app().getLedgerMaster().checkAccept(self->getLedger());
496 self->app().getLedgerMaster().tryAdvance();
499 self->app().getInboundLedgers().logFailure(
500 self->getHash(), self->getSeq());
514 <<
"Trigger on ledger: " <<
mHash << (
mComplete ?
" completed" :
"")
522 stream <<
"Trigger acquiring ledger " <<
mHash <<
" from " << peer;
524 stream <<
"Trigger acquiring ledger " <<
mHash;
543 protocol::TMGetLedger tmGL;
548 tmGL.set_querytype(protocol::qtINDIRECT);
557 protocol::TMGetObjectByHash tmBH;
558 bool typeSet =
false;
559 tmBH.set_query(
true);
561 for (
auto const& p : need)
567 tmBH.set_type(p.first);
571 if (p.first == tmBH.type())
573 protocol::TMIndexedObject* io = tmBH.add_objects();
574 io->set_hash(p.second.begin(), p.second.size());
576 io->set_ledgerseq(
mSeq);
581 std::make_shared<Message>(tmBH, protocol::mtGET_OBJECTS);
595 <<
"getNeededHashes says acquire is complete";
608 tmGL.set_itype(protocol::liBASE);
610 tmGL.set_ledgerseq(
mSeq);
612 << (peer ?
"selected peer" :
"all peers");
618 tmGL.set_ledgerseq(
mLedger->info().seq);
623 tmGL.set_querydepth(0);
625 else if (peer && peer->isHighLatency())
628 tmGL.set_querydepth(2);
631 tmGL.set_querydepth(1);
639 if (!
mLedger->stateMap().isValid())
643 else if (
mLedger->stateMap().getHash().isZero())
646 tmGL.set_itype(protocol::liAS_NODE);
649 << (peer ?
"selected peer" :
"all peers");
669 if (!
mLedger->stateMap().isValid())
685 tmGL.set_itype(protocol::liAS_NODE);
686 for (
auto const&
id : nodes)
688 *(tmGL.add_nodeids()) =
id.first.getRawString();
692 <<
"Sending AS node request (" << nodes.size()
694 << (peer ?
"selected peer" :
"all peers");
711 if (!
mLedger->txMap().isValid())
715 else if (
mLedger->txMap().getHash().isZero())
718 tmGL.set_itype(protocol::liTX_NODE);
721 << (peer ?
"selected peer" :
"all peers");
735 if (!
mLedger->txMap().isValid())
751 tmGL.set_itype(protocol::liTX_NODE);
752 for (
auto const& n : nodes)
754 *(tmGL.add_nodeids()) = n.first.getRawString();
757 <<
"Sending TX node request (" << nodes.size()
758 <<
") to " << (peer ?
"selected peer" :
"all peers");
773 <<
"Done:" << (
mComplete ?
" complete" :
"")
788 nodes.begin(), nodes.end(), [
this](
auto const& item) {
789 return mRecentNodes.count(item.second) == 0;
795 if (dup == nodes.begin())
809 nodes.erase(dup, nodes.end());
815 if (nodes.size() > limit)
818 for (
auto const& n : nodes)
836 mLedger = std::make_shared<Ledger>(
842 <<
"Acquire hash mismatch: " <<
mLedger->info().hash
855 s.
addRaw(data.data(), data.size());
858 if (
mLedger->info().txHash.isZero())
861 if (
mLedger->info().accountHash.isZero())
864 mLedger->txMap().setSynching();
865 mLedger->stateMap().setSynching();
892 auto nodeIDit = nodeIDs.
cbegin();
893 auto nodeDatait = data.begin();
897 while (nodeIDit != nodeIDs.
cend())
899 if (nodeIDit->isRoot())
901 san +=
mLedger->txMap().addRootNode(
911 san +=
mLedger->txMap().addKnownNode(
912 *nodeIDit,
makeSlice(*nodeDatait), &filter);
921 if (!
mLedger->txMap().isSynching())
945 <<
"got ASdata (" << nodeIDs.
size() <<
") acquiring ledger " <<
mHash;
946 if (nodeIDs.
size() == 1)
966 auto nodeIDit = nodeIDs.
cbegin();
967 auto nodeDatait = data.begin();
971 while (nodeIDit != nodeIDs.
cend())
973 if (nodeIDit->isRoot())
975 san +=
mLedger->stateMap().addRootNode(
988 san +=
mLedger->stateMap().addKnownNode(
989 *nodeIDit,
makeSlice(*nodeDatait), &filter);
1001 if (!
mLedger->stateMap().isSynching())
1035 san +=
mLedger->stateMap().addRootNode(
1060 san +=
mLedger->txMap().addRootNode(
1095 protocol::TMGetObjectByHash::otTRANSACTION_NODE, h));
1135 protocol::TMLedgerData& packet)
1139 if (packet.type() == protocol::liBASE)
1141 if (packet.nodes_size() < 1)
1162 if (!
mHaveState && (packet.nodes().size() > 1) &&
1181 if ((packet.type() == protocol::liTX_NODE) ||
1182 (packet.type() == protocol::liAS_NODE))
1184 if (packet.nodes().size() == 0)
1192 nodeIDs.
reserve(packet.nodes().size());
1194 nodeData.
reserve(packet.nodes().size());
1196 for (
int i = 0; i < packet.nodes().size(); ++i)
1198 const protocol::TMLedgerNode& node = packet.nodes(i);
1200 if (!node.has_nodeid() || !node.has_nodedata())
1208 SHAMapNodeID(node.nodeid().data(), node.nodeid().size()));
1210 Blob(node.nodedata().begin(), node.nodedata().end()));
1215 if (packet.type() == protocol::liTX_NODE)
1243 int chosenPeerCount = -1;
1264 for (
auto& entry : data)
1266 if (
auto peer = entry.first.lock())
1269 if (count > chosenPeerCount)
1271 chosenPeerCount = count;
1272 chosenPeer = std::move(peer);
1292 ret[jss::complete] =
true;
1295 ret[jss::failed] =
true;
1298 ret[jss::peers] =
static_cast<int>(
mPeers.size());
1317 ret[jss::needed_state_hashes] = hv;
1327 ret[jss::needed_transaction_hashes] = hv;