diff --git a/polkadot/collator/src/lib.rs b/polkadot/collator/src/lib.rs index 490b17ba05..de0a36e096 100644 --- a/polkadot/collator/src/lib.rs +++ b/polkadot/collator/src/lib.rs @@ -246,7 +246,7 @@ impl
IntoExit for CollationNode
where impl
Worker for CollationNode
where
P: ParachainContext + Send + 'static,
- E: Future Worker for CollationNode where
let client = service.client();
let network = service.network();
+ let inner_exit = exit.clone();
let work = client.import_notification_stream()
.for_each(move |notification| {
macro_rules! try_fr {
@@ -325,7 +326,7 @@ impl Worker for CollationNode where
}
});
- tokio::spawn(silenced);
+ tokio::spawn(silenced.select(inner_exit.clone()).then(|_| Ok(())));
Ok(())
});
diff --git a/polkadot/consensus/src/attestation_service.rs b/polkadot/consensus/src/attestation_service.rs
index afc47a92ae..fc87f83d9e 100644
--- a/polkadot/consensus/src/attestation_service.rs
+++ b/polkadot/consensus/src/attestation_service.rs
@@ -137,28 +137,31 @@ pub(crate) fn start {
+struct MessageProcessTask {
inner_stream: mpsc::UnboundedReceiver ,
+ exit: E,
}
-impl
- where P::Api: ParachainHost MessageProcessTask where
+ P: ProvideRuntimeApi + Send + Sync + 'static,
+ P::Api: ParachainHost
statement.sender,
&self.parent_hash
) {
- self.table_router.import_statement(statement);
+ self.table_router.import_statement(statement, self.exit.clone());
}
}
@@ -69,8 +72,10 @@ impl
}
}
-impl
- where P::Api: ParachainHost Future for MessageProcessTask where
+ P: ProvideRuntimeApi + Send + Sync + 'static,
+ P::Api: ParachainHost {
+pub struct ConsensusNetwork {
network: Arc ,
+ exit: E,
}
-impl ConsensusNetwork {
+impl ConsensusNetwork {
/// Create a new consensus networking object.
- pub fn new(network: Arc ) -> Self {
- ConsensusNetwork { network, api }
+ pub fn new(network: Arc ) -> Self {
+ ConsensusNetwork { network, exit, api }
}
}
-impl Clone for ConsensusNetwork {
+impl Clone for ConsensusNetwork {
fn clone(&self) -> Self {
ConsensusNetwork {
network: self.network.clone(),
+ exit: self.exit.clone(),
api: self.api.clone(),
}
}
}
/// A long-lived network which can create parachain statement routing processes on demand.
-impl
- where P::Api: ParachainHost Network for ConsensusNetwork where
+ P: ProvideRuntimeApi + Send + Sync + 'static,
+ P::Api: ParachainHost ;
@@ -122,7 +131,7 @@ impl
+impl
where P::Api: ParachainHost
where P::Api: ParachainHost
for (producer, statement) in producers.into_iter().zip(statements) {
self.knowledge.lock().note_statement(statement.sender, &statement.statement);
- if let Some(producer) = producer {
+ if let Some(work) = producer.map(|p| self.create_work(c_hash, p)) {
trace!(target: "consensus", "driving statement work to completion");
- self.dispatch_work(c_hash, producer);
+ self.task_executor.spawn(work.select(exit.clone()).then(|_| Ok(())));
}
}
}
- fn dispatch_work
let knowledge = self.knowledge.clone();
let attestation_topic = self.attestation_topic.clone();
- let work = producer.prime(validate)
+ producer.prime(validate)
.map(move |produced| {
// store the data before broadcasting statements, so other peers can fetch.
knowledge.lock().note_candidate(
candidate_hash,
produced.block_data,
- produced.extrinsic
+ produced.extrinsic,
);
if produced.validity.is_none() && produced.availability.is_none() {
@@ -204,9 +208,7 @@ impl
);
}
})
- .map_err(|e| debug!(target: "p_net", "Failed to produce statements: {:?}", e));
-
- self.task_executor.spawn(work);
+ .map_err(|e| debug!(target: "p_net", "Failed to produce statements: {:?}", e))
}
}
diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs
index 05427b752c..82c641b26b 100644
--- a/polkadot/service/src/lib.rs
+++ b/polkadot/service/src/lib.rs
@@ -205,7 +205,11 @@ construct_service_factory! {
let client = service.client();
// collator connections and consensus network both fulfilled by this
- let consensus_network = ConsensusNetwork::new(service.network(), service.client());
+ let consensus_network = ConsensusNetwork::new(
+ service.network(),
+ service.on_exit(),
+ service.client(),
+ );
let proposer_factory = ::consensus::ProposerFactory::new(
client.clone(),
consensus_network.clone(),