20 #include <ripple/app/ledger/LedgerReplayer.h>
21 #include <ripple/app/ledger/impl/LedgerDeltaAcquire.h>
22 #include <ripple/app/ledger/impl/SkipListAcquire.h>
23 #include <ripple/core/JobQueue.h>
34 , inboundLedgers_(inboundLedgers)
35 , peerSetBuilder_(
std::move(peerSetBuilder))
36 , j_(app.journal(
"LedgerReplayer"))
49 uint256 const& finishLedgerHash,
53 finishLedgerHash.
isNonZero() && totalNumLedgers > 0 &&
57 r, finishLedgerHash, totalNumLedgers);
61 bool newSkipList =
false;
68 JLOG(
j_.
info()) <<
"Too many replay tasks, dropping new task "
73 for (
auto const& t :
tasks_)
79 <<
" ledgers merged into an existing task.";
83 JLOG(
j_.
info()) <<
"Replay " << totalNumLedgers
84 <<
" ledgers. Finish ledger hash "
89 skipList = i->second.lock();
93 skipList = std::make_shared<SkipListAcquire>(
102 task = std::make_shared<LedgerReplayTask>(
123 auto const& parameter = task->getTaskParameter();
124 JLOG(
j_.
trace()) <<
"Creating " << parameter.totalLedgers_ - 1 <<
" deltas";
125 if (parameter.totalLedgers_ > 1)
128 parameter.skipList_.begin(),
129 parameter.skipList_.end(),
130 parameter.startHash_);
131 if (skipListItem == parameter.skipList_.end() ||
132 ++skipListItem == parameter.skipList_.end())
134 JLOG(
j_.
error()) <<
"Task parameter error when creating deltas "
135 << parameter.finishHash_;
140 seq <= parameter.finishSeq_ &&
141 skipListItem != parameter.skipList_.end();
142 ++seq, ++skipListItem)
145 bool newDelta =
false;
150 auto i =
deltas_.find(*skipListItem);
152 delta = i->second.lock();
156 delta = std::make_shared<LedgerDeltaAcquire>(
162 deltas_[*skipListItem] = delta;
167 task->addDelta(delta);
185 skipList = i->second.lock();
194 skipList->processData(info.
seq, item);
208 delta = i->second.lock();
217 delta->processData(info, std::move(txns));
224 JLOG(
j_.
debug()) <<
"Sweeping, LedgerReplayer has " <<
tasks_.size()
225 <<
" tasks, " <<
skipLists_.size() <<
" skipLists, and "
226 <<
deltas_.size() <<
" deltas.";
232 [
this](
auto const& t) ->
bool {
236 <<
"Sweep task " << t->getTaskParameter().finishHash_;
243 auto removeCannotLocked = [](
auto& subTasks) {
244 for (
auto it = subTasks.begin(); it != subTasks.end();)
246 if (
auto item = it->second.lock(); !item)
248 it = subTasks.erase(it);
254 removeCannotLocked(skipLists_);
255 removeCannotLocked(deltas_);
259 LedgerReplayer::onStop()
261 JLOG(j_.
info()) <<
"Stopping...";
265 tasks_.begin(), tasks_.end(), [](
auto& i) { i->cancel(); });
267 auto lockAndCancel = [](
auto& i) {
268 if (
auto sptr = i.second.lock(); sptr)
273 std::for_each(skipLists_.begin(), skipLists_.end(), lockAndCancel);
275 std::for_each(deltas_.begin(), deltas_.end(), lockAndCancel);
280 JLOG(j_.
info()) <<
"Stopped";