This commit is contained in:
Robert Habermeier
2018-10-27 15:43:03 +02:00
parent 5f6dc6bc6a
commit e33a8dde4a
2 changed files with 27 additions and 18 deletions
@@ -20,6 +20,7 @@ use parking_lot::RwLock;
use substrate_primitives::AuthorityId; use substrate_primitives::AuthorityId;
use std::cmp::Ord; use std::cmp::Ord;
use std::fmt::Debug;
use std::ops::Add; use std::ops::Add;
use std::sync::Arc; use std::sync::Arc;
@@ -54,14 +55,19 @@ impl<H, N> SharedAuthoritySet<H, N> {
} }
} }
impl<H: Eq, N: Add<Output=N> + Ord + Clone> SharedAuthoritySet<H, N> { impl<H: Eq, N> SharedAuthoritySet<H, N>
where N: Add<Output=N> + Ord + Clone + Debug
{
/// Note an upcoming pending transition. /// Note an upcoming pending transition.
pub(crate) fn add_pending_change(&self, pending: PendingChange<H, N>) { pub(crate) fn add_pending_change(&self, pending: PendingChange<H, N>) {
// ordered first by effective number and then by signal-block number. // ordered first by effective number and then by signal-block number.
let mut inner = self.inner.write(); let mut inner = self.inner.write();
let key = (pending.effective_number(), pending.canon_height); let key = (pending.effective_number(), pending.canon_height.clone());
let idx = inner.pending_changes let idx = inner.pending_changes
.binary_search_by_key(&key, |change| (change.effective_number(), change.canon_height)) .binary_search_by_key(&key, |change| (
change.effective_number(),
change.canon_height.clone(),
))
.unwrap_or_else(|i| i); .unwrap_or_else(|i| i);
inner.pending_changes.insert(idx, pending); inner.pending_changes.insert(idx, pending);
@@ -98,11 +104,6 @@ pub(crate) struct AuthoritySet<H, N> {
} }
impl<H, N> AuthoritySet<H, N> { impl<H, N> AuthoritySet<H, N> {
/// Get the earliest limit-block number, if any.
pub(crate) fn current_limit(&self) -> Option<N> {
self.pending_changes.get(0).map(|change| change.effective_number().clone())
}
/// Get the set identifier. /// Get the set identifier.
pub(crate) fn set_id(&self) -> u64 { pub(crate) fn set_id(&self) -> u64 {
self.set_id self.set_id
@@ -114,12 +115,20 @@ impl<H, N> AuthoritySet<H, N> {
} }
} }
impl<H: Eq, N: Ord + Debug> AuthoritySet<H, N> { impl<H: Eq, N> AuthoritySet<H, N>
where N: Add<Output=N> + Ord + Clone + Debug,
{
/// Get the earliest limit-block number, if any.
pub(crate) fn current_limit(&self) -> Option<N> {
self.pending_changes.get(0).map(|change| change.effective_number().clone())
}
/// Apply or prune any pending transitions. Provide a closure that can be used to check for the /// Apply or prune any pending transitions. Provide a closure that can be used to check for the
/// finalized block with given number. /// finalized block with given number.
/// ///
/// Returns true when the set's representation has changed. /// Returns true when the set's representation has changed.
pub(crate) fn apply_changes<F, E>(&mut self, just_finalized: N, canonical: F) -> Result<bool, E> pub(crate) fn apply_changes<F, E>(&mut self, just_finalized: N, mut canonical: F)
-> Result<bool, E>
where F: FnMut(N) -> Result<H, E> where F: FnMut(N) -> Result<H, E>
{ {
let mut changed = false; let mut changed = false;
@@ -132,7 +141,7 @@ impl<H: Eq, N: Ord + Debug> AuthoritySet<H, N> {
// check if the block that signalled the change is canonical in // check if the block that signalled the change is canonical in
// our chain. // our chain.
if canonical(change.canon_height)? == change.canon_hash { if canonical(change.canon_height.clone())? == change.canon_hash {
// apply this change: make the set canonical // apply this change: make the set canonical
info!(target: "finality", "Applying authority set change scheduled at block #{:?}", info!(target: "finality", "Applying authority set change scheduled at block #{:?}",
change.canon_height); change.canon_height);
+7 -7
View File
@@ -108,7 +108,7 @@ pub enum Error {
/// A blockchain error. /// A blockchain error.
Blockchain(String), Blockchain(String),
/// Could not complete a round on disk. /// Could not complete a round on disk.
CouldNotCompleteRound(ClientError), Client(ClientError),
/// A timer failed to fire. /// A timer failed to fire.
Timer(::tokio::timer::Error), Timer(::tokio::timer::Error),
} }
@@ -520,7 +520,7 @@ impl From<Error> for ExitOrError {
impl From<ClientError> for ExitOrError { impl From<ClientError> for ExitOrError {
fn from(e: ClientError) -> Self { fn from(e: ClientError) -> Self {
ExitOrError::Error(Error::from(e)) ExitOrError::Error(Error::Client(e))
} }
} }
@@ -578,7 +578,7 @@ impl<B, E, Block: BlockT, N> voter::Environment<Block::Hash, NumberFor<Block>> f
self.config.local_key.clone(), self.config.local_key.clone(),
self.config.genesis_voters.clone(), self.config.genesis_voters.clone(),
self.network.clone(), self.network.clone(),
).sink_map_err(Into::into); );
// schedule incoming messages from the network to be held until // schedule incoming messages from the network to be held until
// corresponding blocks are imported. // corresponding blocks are imported.
@@ -595,12 +595,12 @@ impl<B, E, Block: BlockT, N> voter::Environment<Block::Hash, NumberFor<Block>> f
let outgoing = Box::new(ClearOnDrop { let outgoing = Box::new(ClearOnDrop {
round, round,
network: self.network.clone(), network: self.network.clone(),
inner: outgoing, inner: outgoing.sink_map_err(Into::into),
}); });
voter::RoundData { voter::RoundData {
prevote_timer: Box::new(prevote_timer.map_err(Error::Timer)), prevote_timer: Box::new(prevote_timer.map_err(|e| Error::Timer(e).into())),
precommit_timer: Box::new(precommit_timer.map_err(Error::Timer)), precommit_timer: Box::new(precommit_timer.map_err(|e| Error::Timer(e).into())),
voters: self.voters.clone(), voters: self.voters.clone(),
incoming, incoming,
outgoing, outgoing,
@@ -613,7 +613,7 @@ impl<B, E, Block: BlockT, N> voter::Environment<Block::Hash, NumberFor<Block>> f
.insert_aux(&[(LAST_COMPLETED_KEY, &encoded_state[..])], &[]) .insert_aux(&[(LAST_COMPLETED_KEY, &encoded_state[..])], &[])
{ {
warn!(target: "afg", "Shutting down voter due to error bookkeeping last completed round in DB: {:?}", e); warn!(target: "afg", "Shutting down voter due to error bookkeeping last completed round in DB: {:?}", e);
Err(Error::CouldNotCompleteRound(e).into()) Err(Error::Client(e).into())
} else { } else {
Ok(()) Ok(())
} }