From 9c2cc9f5f3314b05ed43a6e613ba0128101e1f45 Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Wed, 13 Nov 2024 10:35:30 +0100 Subject: [PATCH] [fold] fix `getTransasction` and `saveValidatedLedger` --- src/ripple/app/rdb/backend/RWDBDatabase.h | 87 ++++++++++++++++++----- 1 file changed, 68 insertions(+), 19 deletions(-) diff --git a/src/ripple/app/rdb/backend/RWDBDatabase.h b/src/ripple/app/rdb/backend/RWDBDatabase.h index 8bdbf1ec1..dc3df4035 100644 --- a/src/ripple/app/rdb/backend/RWDBDatabase.h +++ b/src/ripple/app/rdb/backend/RWDBDatabase.h @@ -3,6 +3,8 @@ #include #include +#include +#include #include #include #include @@ -115,6 +117,7 @@ public: }), accountData.transactions.end()); } + ledgers_.erase(ledgerSeq); } void @@ -243,8 +246,60 @@ public: std::unique_lock lock(mutex_); LedgerData ledgerData; ledgerData.info = ledger->info(); + auto j = app_.journal("Ledger"); auto seq = ledger->info().seq; - auto aLedger = std::make_shared(ledger, app_); + // auto aLedger = std::make_shared(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 aLedger; + try + { + aLedger = app_.getAcceptedLedgerCache().fetch(ledger->info().hash); + if (!aLedger) + { + aLedger = std::make_shared(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) { @@ -474,30 +529,24 @@ public: if (it != transactionMap_.end()) { const auto& [txn, txMeta] = it->second; - if (!range || - (range->lower() <= txMeta->getLgrSeq() && - txMeta->getLgrSeq() <= range->upper())) - { - std::uint32_t const inLedger = - rangeCheckedCast(txMeta->getLgrSeq()); - it->second.first->setStatus(COMMITTED); - it->second.first->setLedger(inLedger); - return it->second; - } + std::uint32_t inLedger = + rangeCheckedCast(txMeta->getLgrSeq()); + it->second.first->setStatus(COMMITTED); + it->second.first->setLedger(inLedger); + return it->second; } if (range) { - bool allPresent = true; - for (LedgerIndex seq = range->lower(); seq <= range->upper(); ++seq) + std::size_t count = 0; + for (LedgerIndex seq = range->first(); seq <= range->last(); ++seq) { - if (ledgers_.find(seq) == ledgers_.end()) - { - allPresent = false; - break; - } + if (ledgers_.find(seq) != ledgers_.end()) + ++count; } - return allPresent ? TxSearched::all : TxSearched::some; + return (count == (range->last() - range->first() + 1)) + ? TxSearched::all + : TxSearched::some; } return TxSearched::unknown;