From df1300fb379169d07969e52d7d2659be12231747 Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Tue, 13 Dec 2022 20:09:53 -0500 Subject: [PATCH] Catch transaction deserialization error in doLedgerGrpc (#4323) * Allow clio to extract ledgers with transactions that can no longer be deserialized. The problem transactions will be skipped. --- src/ripple/rpc/handlers/LedgerHandler.cpp | 43 ++++++++++++++--------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/ripple/rpc/handlers/LedgerHandler.cpp b/src/ripple/rpc/handlers/LedgerHandler.cpp index b3a441f48a..6b4fc77367 100644 --- a/src/ripple/rpc/handlers/LedgerHandler.cpp +++ b/src/ripple/rpc/handlers/LedgerHandler.cpp @@ -133,27 +133,38 @@ doLedgerGrpc(RPC::GRPCContext& context) if (request.transactions()) { - for (auto& i : ledger->txs) + try { - assert(i.first); - if (request.expand()) + for (auto& i : ledger->txs) { - auto txn = - response.mutable_transactions_list()->add_transactions(); - Serializer sTxn = i.first->getSerializer(); - txn->set_transaction_blob(sTxn.data(), sTxn.getLength()); - if (i.second) + assert(i.first); + if (request.expand()) { - Serializer sMeta = i.second->getSerializer(); - txn->set_metadata_blob(sMeta.data(), sMeta.getLength()); + auto txn = response.mutable_transactions_list() + ->add_transactions(); + Serializer sTxn = i.first->getSerializer(); + txn->set_transaction_blob(sTxn.data(), sTxn.getLength()); + if (i.second) + { + Serializer sMeta = i.second->getSerializer(); + txn->set_metadata_blob(sMeta.data(), sMeta.getLength()); + } + } + else + { + auto const& hash = i.first->getTransactionID(); + response.mutable_hashes_list()->add_hashes( + hash.data(), hash.size()); } } - else - { - auto const& hash = i.first->getTransactionID(); - response.mutable_hashes_list()->add_hashes( - hash.data(), hash.size()); - } + } + catch (std::exception const& e) + { + JLOG(context.j.error()) + << __func__ << " - Error deserializing transaction in ledger " + << ledger->info().seq + << " . skipping transaction and following transactions. You " + "should look into this further"; } }