diff --git a/polkadot/validation/src/error.rs b/polkadot/validation/src/error.rs index d3f7f973d6..fd28080afb 100644 --- a/polkadot/validation/src/error.rs +++ b/polkadot/validation/src/error.rs @@ -45,6 +45,8 @@ pub enum Error { /// Timer failed #[display(fmt = "Timer failed: {}", _0)] Timer(std::io::Error), + #[display(fmt = "Failed to compute deadline of now + {:?}", _0)] + DeadlineComputeFailure(std::time::Duration), /// Unable to dispatch agreement future #[display(fmt = "Unable to dispatch agreement future: {:?}", _0)] Executor(futures::future::ExecuteErrorKind), diff --git a/polkadot/validation/src/lib.rs b/polkadot/validation/src/lib.rs index 4f4e9a2762..bcb7b45e2c 100644 --- a/polkadot/validation/src/lib.rs +++ b/polkadot/validation/src/lib.rs @@ -627,6 +627,14 @@ impl consensus::Proposer for Proposer where last_included: initial_included, }; + let deadline_diff = max_duration - max_duration / 3; + let deadline = match Instant::now().checked_add(deadline_diff) { + None => return Either::Right( + future::err(Error::DeadlineComputeFailure(deadline_diff)), + ), + Some(d) => d, + }; + Either::Left(CreateProposal { parent_hash: self.parent_hash.clone(), parent_number: self.parent_number.clone(), @@ -639,7 +647,7 @@ impl consensus::Proposer for Proposer where inherent_data: Some(inherent_data), inherent_digests, // leave some time for the proposal finalisation - deadline: Instant::now() + max_duration - max_duration / 3, + deadline, }) } }