From 1cb92aa83ed9be2c01be7b556574b55b89130c0f Mon Sep 17 00:00:00 2001 From: Cecile Tonglet 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 | 79 +++++++++++-------------------- polkadot/service/src/lib.rs | 92 ++++++++++++++++++++++++++++--------- 3 files changed, 101 insertions(+), 74 deletions(-) diff --git a/polkadot/cli/src/browser.rs b/polkadot/cli/src/browser.rs index becd340530..17ef9ae802 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 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, - None, - None, - authority_discovery_disabled, - 6000, - grandpa_pause, - ).map(|(components, _, _)| components) - }) } + + 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, + ), + } + }) }, 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::(config) }) } else if chain_spec.is_westend() { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::(config) }) } else { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::(config) }) } diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index a0b2fdcd22..55cda65242 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -643,7 +643,7 @@ fn new_light(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(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, } -/// Create a new Polkadot service for a light client. -pub fn polkadot_new_light(config: Configuration) -> Result< - (TaskManager, Arc), ServiceError -> -{ - new_light::(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), ServiceError -> -{ - new_light::(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), ServiceError -> -{ - new_light::(config) + /// Build a new light node. + pub fn build_light(self) -> Result<(TaskManager, Arc), ServiceError> { + if self.config.chain_spec.is_kusama() { + new_light::( + self.config, + ) + } else if self.config.chain_spec.is_westend() { + new_light::( + self.config, + ) + } else { + new_light::( + 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, + authority_discovery_disabled: bool, + slot_duration: u64, + grandpa_pause: Option<(u32, u32)>, + ) -> Result { + if self.config.chain_spec.is_kusama() { + new_full::( + 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::( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } else { + new_full::( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } + } }