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.
This commit is contained in:
CJ Cobb
2022-12-13 20:09:53 -05:00
committed by Richard Holland
parent 3c1f84f09e
commit 167a7b3a5b

View File

@@ -135,27 +135,38 @@ doLedgerGrpc(RPC::GRPCContext<org::xrpl::rpc::v1::GetLedgerRequest>& 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";
}
}