std::pair<TER, bool> apply (Application& app, OpenView& view, STTx const& tx, ApplyFlags flags, beast::Journal j) { STAmountSO saved(view.info().parentCloseTime); auto pfresult = preflight(app, view.rules(), tx, flags, j); auto pcresult = preclaim(pfresult, app, view); return doApply(pcresult, app, view); }
void TxQ::processValidatedLedger(Application& app, OpenView const& view, bool timeLeap) { auto const allowEscalation = (view.rules().enabled(featureFeeEscalation, app.config().features)); if (!allowEscalation) { return; } feeMetrics_.updateFeeMetrics(app, view, timeLeap); auto ledgerSeq = view.info().seq; std::lock_guard<std::mutex> lock(mutex_); if (!timeLeap) maxSize_ = feeMetrics_.getTxnsExpected() * setup_.ledgersInQueue; // Remove any queued candidates whose LastLedgerSequence has gone by. // Stop if we leave maxSize_ candidates. size_t keptCandidates = 0; auto candidateIter = byFee_.begin(); while (candidateIter != byFee_.end() && (!maxSize_ || keptCandidates < *maxSize_)) { if (candidateIter->lastValid && *candidateIter->lastValid <= ledgerSeq) { candidateIter = erase(candidateIter); } else { ++keptCandidates; ++candidateIter; } } // Erase any candidates more than maxSize_. // This can help keep the queue from getting overfull. for (; candidateIter != byFee_.end(); ++candidateIter) candidateIter = erase(candidateIter); // Remove any TxQAccounts that don't have candidates // under them for (auto txQAccountIter = byAccount_.begin(); txQAccountIter != byAccount_.end();) { if (txQAccountIter->second.empty()) txQAccountIter = byAccount_.erase(txQAccountIter); else ++txQAccountIter; } }