diff --git a/beacon_node/client/src/builder.rs b/beacon_node/client/src/builder.rs index a7d2e8a83c..9bb8bf12ce 100644 --- a/beacon_node/client/src/builder.rs +++ b/beacon_node/client/src/builder.rs @@ -251,8 +251,13 @@ where .ok_or_else(|| "node timer requires a chain spec".to_string())? .milliseconds_per_slot; - let timer_exit = timer::spawn(&context.runtime_handle, beacon_chain, milliseconds_per_slot) - .map_err(|e| format!("Unable to start node timer: {}", e))?; + let timer_exit = timer::spawn( + &context.runtime_handle, + beacon_chain, + milliseconds_per_slot, + context.log.clone(), + ) + .map_err(|e| format!("Unable to start node timer: {}", e))?; self.exit_channels.push(timer_exit); diff --git a/beacon_node/client/src/notifier.rs b/beacon_node/client/src/notifier.rs index b5fd3a7351..271feabacf 100644 --- a/beacon_node/client/src/notifier.rs +++ b/beacon_node/client/src/notifier.rs @@ -31,6 +31,7 @@ pub fn spawn_notifier( milliseconds_per_slot: u64, log: slog::Logger, ) -> Result, String> { + let log_1 = log.clone(); let slot_duration = Duration::from_millis(milliseconds_per_slot); let duration_to_next_slot = beacon_chain .slot_clock @@ -149,8 +150,16 @@ pub fn spawn_notifier( let (exit_signal, exit) = tokio::sync::oneshot::channel(); + let exit_future = async move { + let _ = exit.await.ok(); + info!(log_1, "Notifier service shutdown"); + }; + // run the notifier on the current executor - handle.spawn(futures::future::select(Box::pin(interval_future), exit)); + handle.spawn(futures::future::select( + Box::pin(interval_future), + Box::pin(exit_future), + )); Ok(exit_signal) } diff --git a/beacon_node/eth1/src/service.rs b/beacon_node/eth1/src/service.rs index ccb163e41f..68fe357258 100644 --- a/beacon_node/eth1/src/service.rs +++ b/beacon_node/eth1/src/service.rs @@ -289,6 +289,7 @@ impl Service { exit: tokio::sync::oneshot::Receiver<()>, ) { let update_interval = Duration::from_millis(service.config().auto_update_interval_millis); + let log = service.log.clone(); let mut interval = interval_at(Instant::now(), update_interval); @@ -300,7 +301,12 @@ impl Service { } }; - let future = futures::future::select(Box::pin(update_future), exit); + let exit_future = async move { + let _ = exit.await.ok(); + info!(log, "Eth1 service shutdown"); + }; + + let future = futures::future::select(Box::pin(update_future), Box::pin(exit_future)); handle.spawn(future); } diff --git a/beacon_node/timer/src/lib.rs b/beacon_node/timer/src/lib.rs index 8cafe52900..fa79736761 100644 --- a/beacon_node/timer/src/lib.rs +++ b/beacon_node/timer/src/lib.rs @@ -3,8 +3,8 @@ //! This service allows task execution on the beacon node for various functionality. use beacon_chain::{BeaconChain, BeaconChainTypes}; -use futures::future; use futures::stream::StreamExt; +use slog::info; use slot_clock::SlotClock; use std::sync::Arc; use std::time::Duration; @@ -16,6 +16,7 @@ pub fn spawn( handle: &Handle, beacon_chain: Arc>, milliseconds_per_slot: u64, + log: slog::Logger, ) -> Result, &'static str> { let (exit_signal, exit) = tokio::sync::oneshot::channel(); @@ -26,14 +27,22 @@ pub fn spawn( .ok_or_else(|| "slot_notifier unable to determine time to next slot")?; // Warning: `interval_at` panics if `milliseconds_per_slot` = 0. - let timer_future = interval_at(start_instant, Duration::from_millis(milliseconds_per_slot)) - .for_each(move |_| { + let mut interval = interval_at(start_instant, Duration::from_millis(milliseconds_per_slot)); + let timer_future = async move { + while interval.next().await.is_some() { beacon_chain.per_slot_task(); - future::ready(()) - }); + } + }; - let future = futures::future::select(timer_future, exit); + let log_1 = log.clone(); + let exit_future = async move { + let _ = exit.await.ok(); + info!(log_1, "Timer service shutdown"); + }; + + let future = futures::future::select(Box::pin(timer_future), Box::pin(exit_future)); handle.spawn(future); + info!(log, "Timer service started"); Ok(exit_signal) }