From 1fa6b49136fa872123a6b4a708eae87a4bf0ed78 Mon Sep 17 00:00:00 2001 From: pawan Date: Tue, 21 Apr 2020 01:56:03 +0530 Subject: [PATCH] Fix timer --- beacon_node/timer/src/lib.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/beacon_node/timer/src/lib.rs b/beacon_node/timer/src/lib.rs index c0d8e28ebc..0c22e9ade5 100644 --- a/beacon_node/timer/src/lib.rs +++ b/beacon_node/timer/src/lib.rs @@ -3,19 +3,21 @@ //! This service allows task execution on the beacon node for various functionality. use beacon_chain::{BeaconChain, BeaconChainTypes}; -use futures::stream::{StreamExt}; +use futures::stream::StreamExt; +use futures::{future, prelude::*}; use slot_clock::SlotClock; use std::sync::Arc; use std::time::Duration; -use tokio::sync::oneshot::error::TryRecvError; +use tokio::runtime::Handle; use tokio::time::{interval_at, Instant}; /// Spawns a timer service which periodically executes tasks for the beacon chain pub async fn spawn( + handle: &Handle, beacon_chain: Arc>, milliseconds_per_slot: u64, ) -> Result, &'static str> { - let (exit_signal, mut exit) = tokio::sync::oneshot::channel(); + let (exit_signal, exit) = tokio::sync::oneshot::channel(); let start_instant = Instant::now() + beacon_chain @@ -23,19 +25,15 @@ pub async fn spawn( .duration_to_next_slot() .ok_or_else(|| "slot_notifier unable to determine time to next slot")?; - // Warning: `interval_at` panics on error - let mut timer_future = interval_at(start_instant, Duration::from_millis(milliseconds_per_slot)); - let timer_future = async move { - while let Some(_) = timer_future.next().await { + // 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 |_| { beacon_chain.per_slot_task(); - match exit.try_recv() { - Ok(_) | Err(TryRecvError::Closed) => break, - Err(TryRecvError::Empty) => {} - } - } - }; + future::ready(()) + }); - tokio::task::spawn(timer_future); + let future = futures::future::select(timer_future, exit.map_err(|_| ()).map(|_| ())); + handle.spawn(future); Ok(exit_signal) }