timeout loading
This commit is contained in:
		
							parent
							
								
									7d0eafd5cd
								
							
						
					
					
						commit
						1c958695c3
					
				| @ -17,7 +17,7 @@ | ||||
| //! Tendermint specific parameters.
 | ||||
| 
 | ||||
| use ethjson; | ||||
| use super::timeout::DefaultTimeouts; | ||||
| use super::timeout::TendermintTimeouts; | ||||
| use util::{Address, U256}; | ||||
| 
 | ||||
| /// `Tendermint` params.
 | ||||
| @ -30,7 +30,7 @@ pub struct TendermintParams { | ||||
| 	/// Number of authorities.
 | ||||
| 	pub authority_n: usize, | ||||
| 	/// Timeout durations for different steps.
 | ||||
| 	pub timeouts: DefaultTimeouts, | ||||
| 	pub timeouts: TendermintTimeouts, | ||||
| } | ||||
| 
 | ||||
| impl Default for TendermintParams { | ||||
| @ -54,7 +54,13 @@ impl From<ethjson::spec::TendermintParams> for TendermintParams { | ||||
| 			gas_limit_bound_divisor: p.gas_limit_bound_divisor.into(), | ||||
| 			authorities: val, | ||||
| 			authority_n: val_n, | ||||
| 			timeouts: DefaultTimeouts::default() | ||||
| 			let dt = TendermintTimeouts::default(); | ||||
| 			timeouts: TendermintTimeouts { | ||||
| 				propose: p.timeout_propose.unwrap_or(dt.propose), | ||||
| 				prevote: p.timeout_prevote.unwrap_or(dt.prevote), | ||||
| 				precommit: p.timeout_precommit.unwrap_or(dt.precommit), | ||||
| 				commit: p.timeout_commit.unwrap_or(dt.commit) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -20,7 +20,8 @@ use std::sync::atomic::{Ordering as AtomicOrdering}; | ||||
| use std::sync::Weak; | ||||
| use io::{IoContext, IoHandler, TimerToken}; | ||||
| use super::{Tendermint, Step}; | ||||
| use time::get_time; | ||||
| use time::{get_time, Duration}; | ||||
| use service::ClientIoMessage; | ||||
| 
 | ||||
| pub struct TimerHandler { | ||||
| 	engine: Weak<Tendermint>, | ||||
| @ -28,41 +29,50 @@ pub struct TimerHandler { | ||||
| 
 | ||||
| /// Base timeout of each step in ms.
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub struct DefaultTimeouts { | ||||
| 	pub propose: Ms, | ||||
| 	pub prevote: Ms, | ||||
| 	pub precommit: Ms, | ||||
| 	pub commit: Ms | ||||
| pub struct TendermintTimeouts { | ||||
| 	propose: Duration, | ||||
| 	prevote: Duartion, | ||||
| 	precommit: Duration, | ||||
| 	commit: Duration | ||||
| } | ||||
| 
 | ||||
| impl Default for DefaultTimeouts { | ||||
| impl TendermintTimeouts { | ||||
| 	pub fn for_step(step: Step) -> Duration { | ||||
| 		match step { | ||||
| 			Step::Propose => self.propose, | ||||
| 			Step::Prevote => self.prevote, | ||||
| 			Step::Precommit => self.precommit, | ||||
| 			Step::Commit => self.commit, | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| impl Default for TendermintTimeouts { | ||||
| 	fn default() -> Self { | ||||
| 		DefaultTimeouts { | ||||
| 			propose: 1000, | ||||
| 			prevote: 1000, | ||||
| 			precommit: 1000, | ||||
| 			commit: 1000 | ||||
| 			propose: Duration::milliseconds(1000), | ||||
| 			prevote: Duration::milliseconds(1000), | ||||
| 			precommit: Duration::milliseconds(1000), | ||||
| 			commit: Duration::milliseconds(1000) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| pub type Ms = usize; | ||||
| 
 | ||||
| #[derive(Clone)] | ||||
| pub struct NextStep; | ||||
| 
 | ||||
| /// Timer token representing the consensus step timeouts.
 | ||||
| pub const ENGINE_TIMEOUT_TOKEN: TimerToken = 0; | ||||
| pub const ENGINE_TIMEOUT_TOKEN: TimerToken = 23; | ||||
| 
 | ||||
| impl IoHandler<NextStep> for TimerHandler { | ||||
| 	fn initialize(&self, io: &IoContext<BlockArrived>) { | ||||
| 	fn initialize(&self, io: &IoContext<NextStep>) { | ||||
| 		if let Some(engine) = self.engine.upgrade() { | ||||
| 			io.register_timer_once(ENGINE_TIMEOUT_TOKEN, engine.remaining_step_duration().as_millis()) | ||||
| 				.unwrap_or_else(|e| warn!(target: "poa", "Failed to start consensus step timer: {}.", e)) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	fn timeout(&self, io: &IoContext<BlockArrived>, timer: TimerToken) { | ||||
| 	fn timeout(&self, io: &IoContext<NextStep>, timer: TimerToken) { | ||||
| 		if timer == ENGINE_TIMEOUT_TOKEN { | ||||
| 			if let Some(engine) = self.engine.upgrade() { | ||||
| 				engine.step.fetch_add(1, AtomicOrdering::SeqCst); | ||||
| @ -77,14 +87,17 @@ impl IoHandler<NextStep> for TimerHandler { | ||||
| 					}, | ||||
| 				}; | ||||
| 
 | ||||
| 
 | ||||
| 				io.register_timer_once(ENGINE_TIMEOUT_TOKEN, engine.next_timeout().as_millis()) | ||||
| 					.unwrap_or_else(|e| warn!(target: "poa", "Failed to restart consensus step timer: {}.", e)) | ||||
| 
 | ||||
| 				if let Some(ref channel) = *engine.message_channel.lock() { | ||||
| 					match channel.send(ClientIoMessage::UpdateSealing) { | ||||
| 						Ok(_) => trace!(target: "poa", "timeout: UpdateSealing message sent for step {}.", engine.step.load(AtomicOrdering::Relaxed)), | ||||
| 						Ok(_) => trace!(target: "poa", "timeout: UpdateSealing message sent for step {}.", engine.step.), | ||||
| 						Err(err) => trace!(target: "poa", "timeout: Could not send a sealing message {} for step {}.", err, engine.step.load(AtomicOrdering::Relaxed)), | ||||
| 					} | ||||
| 				} | ||||
| 				io.register_timer_once(ENGINE_TIMEOUT_TOKEN, engine.next_timeout().as_millis()) | ||||
| 					.unwrap_or_else(|e| warn!(target: "poa", "Failed to restart consensus step timer: {}.", e)) | ||||
| 
 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -27,6 +27,18 @@ pub struct TendermintParams { | ||||
| 	pub gas_limit_bound_divisor: Uint, | ||||
| 	/// Valid authorities
 | ||||
| 	pub authorities: Vec<Address>, | ||||
| 	/// Propose step timeout in milliseconds.
 | ||||
| 	#[serde(rename="timeoutPropose")] | ||||
| 	pub timeout_propose: Option<Uint>, | ||||
| 	/// Prevote step timeout in milliseconds.
 | ||||
| 	#[serde(rename="timeoutPrevote")] | ||||
| 	pub timeout_prevote: Option<Uint>, | ||||
| 	/// Precommit step timeout in milliseconds.
 | ||||
| 	#[serde(rename="timeoutPrecommit")] | ||||
| 	pub timeout_precommit: Option<Uint>, | ||||
| 	/// Commit step timeout in milliseconds.
 | ||||
| 	#[serde(rename="timeoutCommit")] | ||||
| 	pub timeout_commit: Option<Uint>, | ||||
| } | ||||
| 
 | ||||
| /// Tendermint engine deserialization.
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user