From a54ece4feb2b6e7a4835ad48a2595004c312cc66 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Thu, 25 Jul 2024 23:39:50 +0200 Subject: [PATCH] fix: terminate node on fatal error (#9810) --- crates/ethereum/node/src/launch.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/crates/ethereum/node/src/launch.rs b/crates/ethereum/node/src/launch.rs index c159fc6834..898b376025 100644 --- a/crates/ethereum/node/src/launch.rs +++ b/crates/ethereum/node/src/launch.rs @@ -30,7 +30,7 @@ use reth_rpc_engine_api::{capabilities::EngineCapabilities, EngineApi}; use reth_rpc_types::engine::ClientVersionV1; use reth_tasks::TaskExecutor; use reth_tokio_util::EventSender; -use reth_tracing::tracing::{debug, info}; +use reth_tracing::tracing::{debug, error, info}; use tokio::sync::{mpsc::unbounded_channel, oneshot}; use tokio_stream::wrappers::UnboundedReceiverStream; @@ -249,7 +249,7 @@ where // Run consensus engine to completion let network_handle = ctx.components().network().clone(); let chainspec = ctx.chain_spec(); - let (tx, rx) = oneshot::channel(); + let (exit, rx) = oneshot::channel(); info!(target: "reth::cli", "Starting consensus engine"); ctx.task_executor().spawn_critical_blocking("consensus engine", async move { if let Some(initial_target) = initial_target { @@ -257,6 +257,8 @@ where eth_service.orchestrator_mut().start_backfill_sync(initial_target); } + let mut res = Ok(()); + // advance the chain and handle events while let Some(event) = eth_service.next().await { debug!(target: "reth::cli", "Event: {event:?}"); @@ -267,7 +269,11 @@ where ChainEvent::BackfillSyncStarted => { network_handle.update_sync_state(SyncState::Syncing); } - ChainEvent::FatalError => break, + ChainEvent::FatalError => { + error!(target: "reth::cli", "Fatal error in consensus engine"); + res = Err(eyre::eyre!("Fatal error in consensus engine")); + break + } ChainEvent::Handler(ev) => { if let Some(head) = ev.canonical_header() { let head_block = Head { @@ -285,7 +291,8 @@ where } } } - let _ = tx.send(()); + + let _ = exit.send(res); }); let full_node = FullNode { @@ -306,7 +313,7 @@ where let handle = NodeHandle { node_exit_future: NodeExitFuture::new( - async { Ok(rx.await?) }, + async { rx.await? }, full_node.config.debug.terminate, ), node: full_node,