From fe51c20c4e31f67655fe6195e9f3a0bb731366f9 Mon Sep 17 00:00:00 2001
From: Keefe Liu <keefe.l@users.noreply.github.com>
Date: Tue, 15 Oct 2024 12:05:21 +0800
Subject: [PATCH] fix tree task panic

---
 crates/chainspec/src/spec.rs       |  7 ++-----
 crates/engine/tree/src/tree/mod.rs | 17 ++++++++++++++++-
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/crates/chainspec/src/spec.rs b/crates/chainspec/src/spec.rs
index b1df34985..6f3f5a99d 100644
--- a/crates/chainspec/src/spec.rs
+++ b/crates/chainspec/src/spec.rs
@@ -11,13 +11,10 @@ use reth_ethereum_forks::{
     ForkFilter, ForkFilterKey, ForkHash, ForkId, Hardfork, Head, DEV_HARDFORKS,
 };
 use reth_network_peers::{
-    base_nodes, base_testnet_nodes, holesky_nodes, mainnet_nodes, op_nodes, op_testnet_nodes,
+    base_nodes, base_testnet_nodes, bsc_mainnet_nodes, bsc_testnet_nodes, holesky_nodes,
+    mainnet_nodes, op_nodes, op_testnet_nodes, opbnb_mainnet_nodes, opbnb_testnet_nodes,
     sepolia_nodes, NodeRecord,
 };
-#[cfg(feature = "bsc")]
-use reth_network_peers::{bsc_mainnet_nodes, bsc_testnet_nodes};
-#[cfg(feature = "opbnb")]
-use reth_network_peers::{opbnb_mainnet_nodes, opbnb_testnet_nodes};
 use reth_primitives_traits::{
     constants::{
         DEV_GENESIS_HASH, EIP1559_INITIAL_BASE_FEE, EMPTY_WITHDRAWALS, ETHEREUM_BLOCK_GAS_LIMIT,
diff --git a/crates/engine/tree/src/tree/mod.rs b/crates/engine/tree/src/tree/mod.rs
index f51db9a63..9d0d65839 100644
--- a/crates/engine/tree/src/tree/mod.rs
+++ b/crates/engine/tree/src/tree/mod.rs
@@ -630,7 +630,16 @@ where
         );
         task.set_invalid_block_hook(invalid_block_hook);
         let incoming = task.incoming_tx.clone();
-        std::thread::Builder::new().name("Tree Task".to_string()).spawn(|| task.run()).unwrap();
+        std::thread::Builder::new()
+            .name("Tree Task".to_string())
+            .spawn(move || {
+                let runtime =
+                    tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap();
+                runtime.block_on(async {
+                    task.run();
+                });
+            })
+            .unwrap();
         (incoming, outgoing)
     }
 
@@ -1203,8 +1212,11 @@ where
                     EngineApiRequest::Beacon(request) => {
                         match request {
                             BeaconEngineMessage::ForkchoiceUpdated { state, payload_attrs, tx } => {
+                                let start = Instant::now();
                                 let mut output = self.on_forkchoice_updated(state, payload_attrs);
+                                debug!("Forkchoice updated took {:?}", start.elapsed());
 
+                                let start = Instant::now();
                                 if let Ok(res) = &mut output {
                                     // track last received forkchoice state
                                     self.state
@@ -1220,12 +1232,15 @@ where
                                     // handle the event if any
                                     self.on_maybe_tree_event(res.event.take())?;
                                 }
+                                debug!("Sending response to beacon1 took {:?}", start.elapsed());
 
+                                let start = Instant::now();
                                 if let Err(err) =
                                     tx.send(output.map(|o| o.outcome).map_err(Into::into))
                                 {
                                     error!("Failed to send event: {err:?}");
                                 }
+                                debug!("Sent response to beacon2 took {:?}", start.elapsed());
                             }
                             BeaconEngineMessage::NewPayload { payload, cancun_fields, tx } => {
                                 let output = self.on_new_payload(payload, cancun_fields);