diff --git a/network/src/validation.rs b/network/src/validation.rs
index 69891913b489..8914b417fa54 100644
--- a/network/src/validation.rs
+++ b/network/src/validation.rs
@@ -330,6 +330,7 @@ impl
ParachainNetwork for ValidationNetwork
where
&self,
table: Arc,
authorities: &[ValidatorId],
+ exit: exit_future::Exit,
) -> Self::BuildTableRouter {
let parent_hash = *table.consensus_parent_hash();
let local_session_key = table.session_key();
@@ -354,7 +355,7 @@ impl ParachainNetwork for ValidationNetwork
where
let table_router_clone = table_router.clone();
let work = table_router.checked_statements()
.for_each(move |msg| { table_router_clone.import_statement(msg); Ok(()) });
- executor.spawn(work);
+ executor.spawn(work.select(exit).map(|_| ()).map_err(|_| ()));
table_router
});
diff --git a/runtime/src/parachains.rs b/runtime/src/parachains.rs
index 9f8378797c08..8f450a3a351a 100644
--- a/runtime/src/parachains.rs
+++ b/runtime/src/parachains.rs
@@ -22,9 +22,7 @@ use parity_codec::{Decode, HasCompact};
use srml_support::{decl_storage, decl_module, fail, ensure};
use bitvec::{bitvec, BigEndian};
-use sr_primitives::traits::{
- Hash as HashT, BlakeTwo256, Member, CheckedConversion, Saturating, One, Zero,
-};
+use sr_primitives::traits::{Hash as HashT, BlakeTwo256, Member, CheckedConversion, Saturating, One};
use primitives::{Hash, Balance, parachain::{
self, Id as ParaId, Chain, DutyRoster, AttestedCandidate, Statement, AccountIdConversion,
ParachainDispatchOrigin, UpwardMessage, BlockIngressRoots,
@@ -243,9 +241,11 @@ decl_storage! {
config(parachains): Vec<(ParaId, Vec, Vec)>;
config(_phdata): PhantomData;
build(|storage: &mut StorageOverlay, _: &mut ChildrenStorageOverlay, config: &GenesisConfig| {
+ use sr_primitives::traits::Zero;
+
let mut p = config.parachains.clone();
- p.sort_unstable_by_key(|&(ref id, _, _)| id.clone());
- p.dedup_by_key(|&mut (ref id, _, _)| id.clone());
+ p.sort_unstable_by_key(|&(ref id, _, _)| *id);
+ p.dedup_by_key(|&mut (ref id, _, _)| *id);
let only_ids: Vec<_> = p.iter().map(|&(ref id, _, _)| id).cloned().collect();
diff --git a/validation/src/lib.rs b/validation/src/lib.rs
index bd946f4bbe2c..652d98f64502 100644
--- a/validation/src/lib.rs
+++ b/validation/src/lib.rs
@@ -147,6 +147,7 @@ pub trait Network {
&self,
table: Arc,
authorities: &[SessionKey],
+ exit: exit_future::Exit,
) -> Self::BuildTableRouter;
}
@@ -313,11 +314,14 @@ impl ParachainValidation where
let (group_info, local_duty) = make_group_info(
duty_roster,
&authorities,
- sign_with.public().into(),
+ sign_with.public(),
)?;
- info!("Starting parachain attestation session on top of parent {:?}. Local parachain duty is {:?}",
- parent_hash, local_duty.validation);
+ info!(
+ "Starting parachain attestation session on top of parent {:?}. Local parachain duty is {:?}",
+ parent_hash,
+ local_duty.validation,
+ );
let active_parachains = self.client.runtime_api().active_parachains(&id)?;
@@ -331,25 +335,23 @@ impl ParachainValidation where
self.extrinsic_store.clone(),
max_block_data_size,
));
+
+ let (_drop_signal, exit) = exit_future::signal();
+
let router = self.network.communication_for(
table.clone(),
&authorities,
+ exit.clone(),
);
- let drop_signal = match local_duty.validation {
- Chain::Parachain(id) => Some(self.launch_work(
- parent_hash,
- id,
- router,
- max_block_data_size,
- )),
- Chain::Relay => None,
- };
+ if let Chain::Parachain(id) = local_duty.validation {
+ self.launch_work(parent_hash, id, router, max_block_data_size, exit);
+ }
let tracker = Arc::new(AttestationTracker {
table,
started: Instant::now(),
- _drop_signal: drop_signal
+ _drop_signal,
});
live_instances.insert(parent_hash, tracker.clone());
@@ -369,10 +371,10 @@ impl ParachainValidation where
validation_para: ParaId,
build_router: N::BuildTableRouter,
max_block_data_size: Option,
- ) -> exit_future::Signal {
+ exit: exit_future::Exit,
+ ) {
use extrinsic_store::Data;
- let (signal, exit) = exit_future::signal();
let (collators, client) = (self.collators.clone(), self.client.clone());
let extrinsic_store = self.extrinsic_store.clone();
@@ -428,16 +430,15 @@ impl ParachainValidation where
.then(|_| Ok(()));
// spawn onto thread pool.
- if let Err(_) = self.handle.execute(Box::new(cancellable_work)) {
+ if self.handle.execute(Box::new(cancellable_work)).is_err() {
error!("Failed to spawn cancellable work task");
}
- signal
}
}
/// Parachain validation for a single block.
struct AttestationTracker {
- _drop_signal: Option,
+ _drop_signal: exit_future::Signal,
table: Arc,
started: Instant,
}
@@ -544,7 +545,7 @@ impl consensus::Environment for ProposerFactory