[fold] fix getTransasction and saveValidatedLedger

This commit is contained in:
Denis Angell
2024-11-13 10:35:30 +01:00
parent 7bd82eef55
commit 9c2cc9f5f3

View File

@@ -3,6 +3,8 @@
#include <ripple/app/ledger/AcceptedLedger.h> #include <ripple/app/ledger/AcceptedLedger.h>
#include <ripple/app/ledger/LedgerMaster.h> #include <ripple/app/ledger/LedgerMaster.h>
#include <ripple/app/ledger/LedgerToJson.h>
#include <ripple/app/ledger/PendingSaves.h>
#include <ripple/app/ledger/TransactionMaster.h> #include <ripple/app/ledger/TransactionMaster.h>
#include <ripple/app/misc/impl/AccountTxPaging.h> #include <ripple/app/misc/impl/AccountTxPaging.h>
#include <ripple/app/rdb/backend/SQLiteDatabase.h> #include <ripple/app/rdb/backend/SQLiteDatabase.h>
@@ -115,6 +117,7 @@ public:
}), }),
accountData.transactions.end()); accountData.transactions.end());
} }
ledgers_.erase(ledgerSeq);
} }
void void
@@ -243,8 +246,60 @@ public:
std::unique_lock<std::shared_mutex> lock(mutex_); std::unique_lock<std::shared_mutex> lock(mutex_);
LedgerData ledgerData; LedgerData ledgerData;
ledgerData.info = ledger->info(); ledgerData.info = ledger->info();
auto j = app_.journal("Ledger");
auto seq = ledger->info().seq; auto seq = ledger->info().seq;
auto aLedger = std::make_shared<AcceptedLedger>(ledger, app_); // auto aLedger = std::make_shared<AcceptedLedger>(ledger, app_);
JLOG(j.trace()) << "saveValidatedLedger "
<< (current ? "" : "fromAcquire ") << seq;
if (!ledger->info().accountHash.isNonZero())
{
JLOG(j.fatal()) << "AH is zero: " << getJson({*ledger, {}});
assert(false);
}
if (ledger->info().accountHash !=
ledger->stateMap().getHash().as_uint256())
{
JLOG(j.fatal()) << "sAL: " << ledger->info().accountHash
<< " != " << ledger->stateMap().getHash();
JLOG(j.fatal())
<< "saveAcceptedLedger: seq=" << seq << ", current=" << current;
assert(false);
}
assert(ledger->info().txHash == ledger->txMap().getHash().as_uint256());
// Save the ledger header in the hashed object store
{
Serializer s(128);
s.add32(HashPrefix::ledgerMaster);
addRaw(ledger->info(), s);
app_.getNodeStore().store(
hotLEDGER, std::move(s.modData()), ledger->info().hash, seq);
}
std::shared_ptr<AcceptedLedger> aLedger;
try
{
aLedger = app_.getAcceptedLedgerCache().fetch(ledger->info().hash);
if (!aLedger)
{
aLedger = std::make_shared<AcceptedLedger>(ledger, app_);
app_.getAcceptedLedgerCache().canonicalize_replace_client(
ledger->info().hash, aLedger);
}
}
catch (std::exception const&)
{
JLOG(j.warn()) << "An accepted ledger was missing nodes";
app_.getLedgerMaster().failedSave(seq, ledger->info().hash);
// Clients can now trust the database for information about this
// ledger sequence.
app_.pendingSaves().finishWork(seq);
return false;
}
for (auto const& acceptedLedgerTx : *aLedger) for (auto const& acceptedLedgerTx : *aLedger)
{ {
@@ -474,30 +529,24 @@ public:
if (it != transactionMap_.end()) if (it != transactionMap_.end())
{ {
const auto& [txn, txMeta] = it->second; const auto& [txn, txMeta] = it->second;
if (!range || std::uint32_t inLedger =
(range->lower() <= txMeta->getLgrSeq() && rangeCheckedCast<std::uint32_t>(txMeta->getLgrSeq());
txMeta->getLgrSeq() <= range->upper())) it->second.first->setStatus(COMMITTED);
{ it->second.first->setLedger(inLedger);
std::uint32_t const inLedger = return it->second;
rangeCheckedCast<std::uint32_t>(txMeta->getLgrSeq());
it->second.first->setStatus(COMMITTED);
it->second.first->setLedger(inLedger);
return it->second;
}
} }
if (range) if (range)
{ {
bool allPresent = true; std::size_t count = 0;
for (LedgerIndex seq = range->lower(); seq <= range->upper(); ++seq) for (LedgerIndex seq = range->first(); seq <= range->last(); ++seq)
{ {
if (ledgers_.find(seq) == ledgers_.end()) if (ledgers_.find(seq) != ledgers_.end())
{ ++count;
allPresent = false;
break;
}
} }
return allPresent ? TxSearched::all : TxSearched::some; return (count == (range->last() - range->first() + 1))
? TxSearched::all
: TxSearched::some;
} }
return TxSearched::unknown; return TxSearched::unknown;