From 1cb92aa83ed9be2c01be7b556574b55b89130c0f Mon Sep 17 00:00:00 2001 From: Cecile Tonglet <cecile@parity.io> Date: Mon, 27 Jul 2020 07:54:24 +0200 Subject: [PATCH] Refactor service to allow building full (and light) node matching chain spec (#1467) --- polkadot/cli/src/browser.rs | 4 +- polkadot/cli/src/command.rs | 69 ++++++++++------------------ polkadot/service/src/lib.rs | 92 ++++++++++++++++++++++++++++--------- 3 files changed, 96 insertions(+), 69 deletions(-) diff --git a/polkadot/cli/src/browser.rs b/polkadot/cli/src/browser.rs index becd3405300..17ef9ae8022 100644 --- a/polkadot/cli/src/browser.rs +++ b/polkadot/cli/src/browser.rs @@ -46,8 +46,8 @@ async fn start_inner(chain_spec: String, log_level: String) -> Result<Client, Bo info!("👤 Role: {}", config.display_role()); // Create the service. This is the most heavy initialization step. - let (task_manager, rpc_handlers) = service::kusama_new_light(config) - .map_err(|e| format!("{:?}", e))?; + let builder = service::NodeBuilder::new(config); + let (task_manager, rpc_handlers) = builder.build_light().map_err(|e| format!("{:?}", e))?; Ok(browser_utils::start_client(task_manager, rpc_handlers)) } diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs index 7f513f12d58..ab57fc4489a 100644 --- a/polkadot/cli/src/command.rs +++ b/polkadot/cli/src/command.rs @@ -106,8 +106,8 @@ pub fn run() -> Result<()> { match &cli.subcommand { None => { - let runtime = cli.create_runner(&cli.run.base)?; - let chain_spec = &runtime.config().chain_spec; + let runner = cli.create_runner(&cli.run.base)?; + let chain_spec = &runner.config().chain_spec; set_default_ss58_version(chain_spec); @@ -124,55 +124,32 @@ pub fn run() -> Result<()> { info!(" endorsed by the "); info!(" KUSAMA FOUNDATION "); info!("----------------------------"); + } - runtime.run_node_until_exit(|config| match config.role { - Role::Light => service::kusama_new_light(config) - .map(|(components, _)| components), - _ => service::kusama_new_full( - config, - None, - None, - authority_discovery_disabled, - 6000, - grandpa_pause, - ).map(|(components, _, _)| components) - }) - } else if chain_spec.is_westend() { - runtime.run_node_until_exit(|config| match config.role { - Role::Light => service::westend_new_light(config) - .map(|(components, _)| components), - _ => service::westend_new_full( - config, - None, - None, - authority_discovery_disabled, - 6000, - grandpa_pause, - ).map(|(components, _, _)| components) - }) - } else { - runtime.run_node_until_exit(|config| match config.role { - Role::Light => service::polkadot_new_light(config) - .map(|(components, _)| components), - _ => service::polkadot_new_full( - config, + runner.run_node_until_exit(|config| { + let role = config.role.clone(); + let builder = service::NodeBuilder::new(config); + + match role { + Role::Light => builder.build_light().map(|(task_manager, _)| task_manager), + _ => builder.build_full( None, None, authority_discovery_disabled, 6000, grandpa_pause, - ).map(|(components, _, _)| components) - }) - } + ), + } + }) }, Some(Subcommand::Base(subcommand)) => { - let runtime = cli.create_runner(subcommand)?; - let chain_spec = &runtime.config().chain_spec; + let runner = cli.create_runner(subcommand)?; + let chain_spec = &runner.config().chain_spec; set_default_ss58_version(chain_spec); if chain_spec.is_kusama() { - runtime.run_subcommand(subcommand, |config| + runner.run_subcommand(subcommand, |config| service::new_chain_ops::< service::kusama_runtime::RuntimeApi, service::KusamaExecutor, @@ -180,7 +157,7 @@ pub fn run() -> Result<()> { >(config) ) } else if chain_spec.is_westend() { - runtime.run_subcommand(subcommand, |config| + runner.run_subcommand(subcommand, |config| service::new_chain_ops::< service::westend_runtime::RuntimeApi, service::WestendExecutor, @@ -188,7 +165,7 @@ pub fn run() -> Result<()> { >(config) ) } else { - runtime.run_subcommand(subcommand, |config| + runner.run_subcommand(subcommand, |config| service::new_chain_ops::< service::polkadot_runtime::RuntimeApi, service::PolkadotExecutor, @@ -209,21 +186,21 @@ pub fn run() -> Result<()> { } }, Some(Subcommand::Benchmark(cmd)) => { - let runtime = cli.create_runner(cmd)?; - let chain_spec = &runtime.config().chain_spec; + let runner = cli.create_runner(cmd)?; + let chain_spec = &runner.config().chain_spec; set_default_ss58_version(chain_spec); if chain_spec.is_kusama() { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::<service::kusama_runtime::Block, service::KusamaExecutor>(config) }) } else if chain_spec.is_westend() { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::<service::westend_runtime::Block, service::WestendExecutor>(config) }) } else { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::<service::polkadot_runtime::Block, service::PolkadotExecutor>(config) }) } diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index a0b2fdcd228..55cda652420 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -643,7 +643,7 @@ fn new_light<Runtime, Dispatch, Extrinsic>(mut config: Configuration) -> Result< let rpc_extensions = polkadot_rpc::create_light(light_deps); - let ServiceComponents { task_manager, rpc_handlers, .. } = service::build(service::ServiceParams { + let ServiceComponents { task_manager, rpc_handlers, .. } = service::build(service::ServiceParams { config, block_announce_validator_builder: None, finality_proof_request_builder: Some(finality_proof_request_builder), @@ -655,7 +655,7 @@ fn new_light<Runtime, Dispatch, Extrinsic>(mut config: Configuration) -> Result< transaction_pool: transaction_pool.clone(), import_queue, keystore, backend, task_manager, })?; - + Ok((task_manager, rpc_handlers)) } @@ -793,26 +793,76 @@ pub struct FullNodeHandles { pub validation_service_handle: Option<consensus::ServiceHandle>, } -/// Create a new Polkadot service for a light client. -pub fn polkadot_new_light(config: Configuration) -> Result< - (TaskManager, Arc<RpcHandlers>), ServiceError -> -{ - new_light::<polkadot_runtime::RuntimeApi, PolkadotExecutor, _>(config) +/// A builder for a node. +pub struct NodeBuilder { + config: Configuration, } -/// Create a new Kusama service for a light client. -pub fn kusama_new_light(config: Configuration) -> Result< - (TaskManager, Arc<RpcHandlers>), ServiceError -> -{ - new_light::<kusama_runtime::RuntimeApi, KusamaExecutor, _>(config) -} +impl NodeBuilder { + /// Create a new node builder. + pub fn new(config: Configuration) -> Self { + Self { + config, + } + } -/// Create a new Westend service for a light client. -pub fn westend_new_light(config: Configuration, ) -> Result< - (TaskManager, Arc<RpcHandlers>), ServiceError -> -{ - new_light::<westend_runtime::RuntimeApi, KusamaExecutor, _>(config) + /// Build a new light node. + pub fn build_light(self) -> Result<(TaskManager, Arc<RpcHandlers>), ServiceError> { + if self.config.chain_spec.is_kusama() { + new_light::<kusama_runtime::RuntimeApi, KusamaExecutor, _>( + self.config, + ) + } else if self.config.chain_spec.is_westend() { + new_light::<westend_runtime::RuntimeApi, WestendExecutor, _>( + self.config, + ) + } else { + new_light::<polkadot_runtime::RuntimeApi, PolkadotExecutor, _>( + self.config, + ) + } + } + + /// Build a new full node. + #[cfg(feature = "full-node")] + pub fn build_full( + self, + collating_for: Option<(CollatorId, parachain::Id)>, + max_block_data_size: Option<u64>, + authority_discovery_disabled: bool, + slot_duration: u64, + grandpa_pause: Option<(u32, u32)>, + ) -> Result<TaskManager, ServiceError> { + if self.config.chain_spec.is_kusama() { + new_full::<kusama_runtime::RuntimeApi, KusamaExecutor, _>( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } else if self.config.chain_spec.is_westend() { + new_full::<westend_runtime::RuntimeApi, WestendExecutor, _>( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } else { + new_full::<polkadot_runtime::RuntimeApi, PolkadotExecutor, _>( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } + } } -- GitLab