From 0747d4afe46878b357fa08f43376c56f505e30c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:59:17 +0200 Subject: [PATCH] Handle rollbacks when cementing --- nano/node/confirming_set.cpp | 8 ++++++++ nano/secure/ledger.cpp | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/nano/node/confirming_set.cpp b/nano/node/confirming_set.cpp index c499e350..da342a4e 100644 --- a/nano/node/confirming_set.cpp +++ b/nano/node/confirming_set.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -180,6 +181,13 @@ void nano::confirming_set::run_batch (std::unique_lock & lock) stats.inc (nano::stat::type::confirming_set, nano::stat::detail::cementing); + // The block might be rolled back before it's fully cemented + if (!ledger.any.block_exists (transaction, hash)) + { + stats.inc (nano::stat::type::confirming_set, nano::stat::detail::missing_block); + break; + } + auto added = ledger.confirm (transaction, hash, config.max_blocks); if (!added.empty ()) { diff --git a/nano/secure/ledger.cpp b/nano/secure/ledger.cpp index efe7c5ad..cba173a6 100644 --- a/nano/secure/ledger.cpp +++ b/nano/secure/ledger.cpp @@ -865,7 +865,10 @@ std::deque> nano::ledger::confirm (secure::write_tr bool refreshed = transaction.refresh_if_needed (); if (refreshed) { - release_assert (any.block_exists (transaction, target_hash), "block was rolled back during cementing"); + if (!any.block_exists (transaction, target_hash)) + { + break; // Block was rolled back during cementing + } } // Early return might leave parts of the dependency tree unconfirmed