Exit signal gets its own trait (#433)

* Exit signal gets its own trait

* Typo

* Removed clone bounds
This commit is contained in:
Arkadiy Paronyan
2018-07-28 08:31:16 +02:00
committed by GitHub
parent e8777d9142
commit 9214f42a3b
3 changed files with 24 additions and 23 deletions
+4 -10
View File
@@ -38,7 +38,7 @@ use chain_spec::ChainSpec;
use futures::Future; use futures::Future;
use tokio::runtime::Runtime; use tokio::runtime::Runtime;
pub use service::{Components as ServiceComponents, Service, CustomConfiguration}; pub use service::{Components as ServiceComponents, Service, CustomConfiguration};
pub use cli::VersionInfo; pub use cli::{VersionInfo, IntoExit};
fn load_spec(id: &str) -> Result<Option<service::ChainSpec>, String> { fn load_spec(id: &str) -> Result<Option<service::ChainSpec>, String> {
Ok(match ChainSpec::from(id) { Ok(match ChainSpec::from(id) {
@@ -51,22 +51,16 @@ fn load_spec(id: &str) -> Result<Option<service::ChainSpec>, String> {
/// ///
/// This will be invoked with the service and spawn a future that resolves /// This will be invoked with the service and spawn a future that resolves
/// when complete. /// when complete.
pub trait Worker { pub trait Worker: IntoExit {
/// A future that resolves when the work is done or the node should exit. /// A future that resolves when the work is done or the node should exit.
/// This will be run on a tokio runtime. /// This will be run on a tokio runtime.
type Work: Future<Item=(),Error=()> + Send + 'static; type Work: Future<Item=(),Error=()> + Send + 'static;
/// An exit scheduled for the future.
type Exit: Future<Item=(),Error=()> + Send + 'static;
/// Return configuration for the polkadot node. /// Return configuration for the polkadot node.
// TODO: make this the full configuration, so embedded nodes don't need // TODO: make this the full configuration, so embedded nodes don't need
// string CLI args // string CLI args
fn configuration(&self) -> service::CustomConfiguration { Default::default() } fn configuration(&self) -> service::CustomConfiguration { Default::default() }
/// Don't work, but schedule an exit.
fn exit_only(&self) -> Self::Exit;
/// Do work and schedule exit. /// Do work and schedule exit.
fn work<C: service::Components>(self, service: &service::Service<C>) -> Self::Work; fn work<C: service::Components>(self, service: &service::Service<C>) -> Self::Work;
} }
@@ -85,9 +79,9 @@ pub fn run<I, T, W>(args: I, worker: W, version: cli::VersionInfo) -> error::Res
W: Worker, W: Worker,
{ {
match cli::prepare_execution::<service::Factory, _, _, _, _>(args, worker.exit_only(), version, load_spec, "parity-polkadot")? { match cli::prepare_execution::<service::Factory, _, _, _, _>(args, worker, version, load_spec, "parity-polkadot")? {
cli::Action::ExecutedInternally => (), cli::Action::ExecutedInternally => (),
cli::Action::RunService(mut config) => { cli::Action::RunService((mut config, worker)) => {
info!("Parity ·:· Polkadot"); info!("Parity ·:· Polkadot");
info!(" version {}", config.full_version()); info!(" version {}", config.full_version());
info!(" by Parity Technologies, 2017, 2018"); info!(" by Parity Technologies, 2017, 2018");
+12 -7
View File
@@ -69,7 +69,7 @@ use polkadot_api::PolkadotApi;
use polkadot_primitives::{AccountId, BlockId, SessionKey}; use polkadot_primitives::{AccountId, BlockId, SessionKey};
use polkadot_primitives::parachain::{self, BlockData, DutyRoster, HeadData, ConsolidatedIngress, Message, Id as ParaId}; use polkadot_primitives::parachain::{self, BlockData, DutyRoster, HeadData, ConsolidatedIngress, Message, Id as ParaId};
use polkadot_cli::{ServiceComponents, Service, CustomConfiguration, VersionInfo}; use polkadot_cli::{ServiceComponents, Service, CustomConfiguration, VersionInfo};
use polkadot_cli::Worker; use polkadot_cli::{Worker, IntoExit};
use tokio::timer::Deadline; use tokio::timer::Deadline;
const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); const COLLATION_TIMEOUT: Duration = Duration::from_secs(30);
@@ -211,12 +211,21 @@ struct CollationNode<P, E> {
key: Arc<ed25519::Pair>, key: Arc<ed25519::Pair>,
} }
impl<P, E> IntoExit for CollationNode<P, E> where
P: ParachainContext + Send + 'static,
E: Future<Item=(),Error=()> + Send + 'static
{
type Exit = E;
fn into_exit(self) -> Self::Exit {
self.exit
}
}
impl<P, E> Worker for CollationNode<P, E> where impl<P, E> Worker for CollationNode<P, E> where
P: ParachainContext + Send + 'static, P: ParachainContext + Send + 'static,
E: Future<Item=(),Error=()> + Send + Clone + 'static E: Future<Item=(),Error=()> + Send + 'static
{ {
type Work = Box<Future<Item=(),Error=()> + Send>; type Work = Box<Future<Item=(),Error=()> + Send>;
type Exit = E;
fn configuration(&self) -> CustomConfiguration { fn configuration(&self) -> CustomConfiguration {
let mut config = CustomConfiguration::default(); let mut config = CustomConfiguration::default();
@@ -227,10 +236,6 @@ impl<P, E> Worker for CollationNode<P, E> where
config config
} }
fn exit_only(&self) -> Self::Exit {
self.exit.clone()
}
fn work<C: ServiceComponents>(self, service: &Service<C>) -> Self::Work { fn work<C: ServiceComponents>(self, service: &Service<C>) -> Self::Work {
let CollationNode { parachain_context, exit, para_id, key } = self; let CollationNode { parachain_context, exit, para_id, key } = self;
let client = service.client(); let client = service.client();
+8 -6
View File
@@ -38,11 +38,9 @@ mod vergen {
// the regular polkadot worker simply does nothing until ctrl-c // the regular polkadot worker simply does nothing until ctrl-c
struct Worker; struct Worker;
impl cli::Worker for Worker { impl cli::IntoExit for Worker {
type Work = Self::Exit;
type Exit = future::MapErr<oneshot::Receiver<()>, fn(oneshot::Canceled) -> ()>; type Exit = future::MapErr<oneshot::Receiver<()>, fn(oneshot::Canceled) -> ()>;
fn into_exit(self) -> Self::Exit {
fn exit_only(&self) -> Self::Exit {
// can't use signal directly here because CtrlC takes only `Fn`. // can't use signal directly here because CtrlC takes only `Fn`.
let (exit_send, exit) = oneshot::channel(); let (exit_send, exit) = oneshot::channel();
@@ -55,9 +53,13 @@ impl cli::Worker for Worker {
exit.map_err(drop) exit.map_err(drop)
} }
}
fn work<C: ServiceComponents>(self, _service: &Service<C>) -> Self::Exit { impl cli::Worker for Worker {
self.exit_only() type Work = <Self as cli::IntoExit>::Exit;
fn work<C: ServiceComponents>(self, _service: &Service<C>) -> Self::Work {
use cli::IntoExit;
self.into_exit()
} }
} }