From 1bb5a356c892c93bdcf0980d675603eefab1a0f1 Mon Sep 17 00:00:00 2001 From: Tomasz Polaczyk Date: Thu, 14 Dec 2023 10:53:07 +0100 Subject: [PATCH 1/2] Allow skipping block history download in warp sync --- cumulus/client/service/src/lib.rs | 19 ++++---- substrate/client/cli/src/arg_enums.rs | 8 +++- substrate/client/network/common/src/sync.rs | 7 ++- .../client/network/sync/src/chain_sync.rs | 47 ++++++++++++------- substrate/client/service/src/builder.rs | 2 +- 5 files changed, 52 insertions(+), 31 deletions(-) diff --git a/cumulus/client/service/src/lib.rs b/cumulus/client/service/src/lib.rs index 950e59aff24e..edaebb18cd39 100644 --- a/cumulus/client/service/src/lib.rs +++ b/cumulus/client/service/src/lib.rs @@ -453,16 +453,15 @@ where RCInterface: RelayChainInterface + Clone + 'static, IQ: ImportQueue + 'static, { - let warp_sync_params = match parachain_config.network.sync_mode { - SyncMode::Warp => { - let target_block = warp_sync_get::( - para_id, - relay_chain_interface.clone(), - spawn_handle.clone(), - ); - Some(WarpSyncParams::WaitForTarget(target_block)) - }, - _ => None, + let warp_sync_params = if parachain_config.network.sync_mode.is_warp() { + let target_block = warp_sync_get::( + para_id, + relay_chain_interface.clone(), + spawn_handle.clone(), + ); + Some(WarpSyncParams::WaitForTarget(target_block)) + } else { + None }; let block_announce_validator = match sybil_resistance_level { diff --git a/substrate/client/cli/src/arg_enums.rs b/substrate/client/cli/src/arg_enums.rs index d4a4b7cfdf6d..43644d05bdfa 100644 --- a/substrate/client/cli/src/arg_enums.rs +++ b/substrate/client/cli/src/arg_enums.rs @@ -231,8 +231,10 @@ pub enum SyncMode { Fast, /// Download blocks without executing them. Download latest state without proofs. FastUnsafe, - /// Prove finality and download the latest state. + /// Prove finality and download the latest state. Download block history as well. Warp, + /// Prove finality and download the latest state. Does not download block history. + WarpNoBlockHistory, } impl Into for SyncMode { @@ -247,7 +249,9 @@ impl Into for SyncMode { skip_proofs: true, storage_chain_mode: false, }, - SyncMode::Warp => sc_network::config::SyncMode::Warp, + SyncMode::Warp => sc_network::config::SyncMode::Warp { block_history: true }, + SyncMode::WarpNoBlockHistory => + sc_network::config::SyncMode::Warp { block_history: false }, } } } diff --git a/substrate/client/network/common/src/sync.rs b/substrate/client/network/common/src/sync.rs index a910740aef64..007189340ac1 100644 --- a/substrate/client/network/common/src/sync.rs +++ b/substrate/client/network/common/src/sync.rs @@ -33,13 +33,16 @@ pub enum SyncMode { storage_chain_mode: bool, }, /// Warp sync - verify authority set transitions and the latest state. - Warp, + Warp { + /// Download block history as well + block_history: bool, + }, } impl SyncMode { /// Returns `true` if `self` is [`Self::Warp`]. pub fn is_warp(&self) -> bool { - matches!(self, Self::Warp) + matches!(self, Self::Warp { .. }) } /// Returns `true` if `self` is [`Self::LightState`]. diff --git a/substrate/client/network/sync/src/chain_sync.rs b/substrate/client/network/sync/src/chain_sync.rs index 3825cfa33f73..1fd3966e68a7 100644 --- a/substrate/client/network/sync/src/chain_sync.rs +++ b/substrate/client/network/sync/src/chain_sync.rs @@ -253,6 +253,8 @@ pub struct ChainSync { import_existing: bool, /// Gap download process. gap_sync: Option>, + /// Flag to remember that block history has been disabled + skipped_gap_sync: bool, /// Pending actions. actions: Vec>, } @@ -367,6 +369,7 @@ where warp_sync: None, import_existing: false, gap_sync: None, + skipped_gap_sync: false, warp_sync_config, warp_sync_target_block_header: None, actions: Vec::new(), @@ -412,7 +415,7 @@ where phase: WarpSyncPhase::DownloadingBlocks(gap_sync.best_queued_number), total_bytes: 0, }), - (None, SyncMode::Warp, _) => Some(WarpSyncProgress { + (None, SyncMode::Warp { .. }, _) => Some(WarpSyncProgress { phase: WarpSyncPhase::AwaitingPeers { required_peers: MIN_PEERS_TO_START_WARP_SYNC, }, @@ -554,7 +557,7 @@ where }, ); - if let SyncMode::Warp = self.mode { + if self.mode.is_warp() { if self.peers.len() >= MIN_PEERS_TO_START_WARP_SYNC && self.warp_sync.is_none() { log::debug!(target: LOG_TARGET, "Starting warp state sync."); @@ -1204,7 +1207,7 @@ where match self.mode { SyncMode::Full => BlockAttributes::HEADER | BlockAttributes::JUSTIFICATION | BlockAttributes::BODY, - SyncMode::LightState { storage_chain_mode: false, .. } | SyncMode::Warp => + SyncMode::LightState { storage_chain_mode: false, .. } | SyncMode::Warp { .. } => BlockAttributes::HEADER | BlockAttributes::JUSTIFICATION | BlockAttributes::BODY, SyncMode::LightState { storage_chain_mode: true, .. } => BlockAttributes::HEADER | @@ -1217,7 +1220,7 @@ where match self.mode { SyncMode::Full => false, SyncMode::LightState { .. } => true, - SyncMode::Warp => true, + SyncMode::Warp { .. } => true, } } @@ -1360,7 +1363,7 @@ where ); self.mode = SyncMode::Full; } - if matches!(self.mode, SyncMode::Warp) && info.finalized_state.is_some() { + if self.mode.is_warp() && info.finalized_state.is_some() { warn!( target: LOG_TARGET, "Can't use warp sync mode with a partially synced database. Reverting to full sync mode." @@ -1388,12 +1391,17 @@ where } if let Some((start, end)) = info.block_gap { - debug!(target: LOG_TARGET, "Starting gap sync #{start} - #{end}"); - self.gap_sync = Some(GapSync { - best_queued_number: start - One::one(), - target: end, - blocks: BlockCollection::new(), - }); + if let SyncMode::Warp { block_history: false } = self.mode { + // Skip block history + self.skipped_gap_sync = true; + } else { + debug!(target: LOG_TARGET, "Starting gap sync #{start} - #{end}"); + self.gap_sync = Some(GapSync { + best_queued_number: start - One::one(), + target: end, + blocks: BlockCollection::new(), + }); + } } trace!( target: LOG_TARGET, @@ -1564,7 +1572,7 @@ where /// Get block requests scheduled by sync to be sent out. fn block_requests(&mut self) -> Vec<(PeerId, BlockRequest)> { - if self.mode == SyncMode::Warp { + if self.mode.is_warp() { return self .warp_target_block_request() .map_or_else(|| Vec::new(), |req| Vec::from([req])) @@ -1962,10 +1970,17 @@ where let gap_sync_complete = self.gap_sync.as_ref().map_or(false, |s| s.target == number); if gap_sync_complete { - info!( - target: LOG_TARGET, - "Block history download is complete." - ); + if self.skipped_gap_sync { + info!( + target: LOG_TARGET, + "Block history download has been skipped." + ); + } else { + info!( + target: LOG_TARGET, + "Block history download is complete." + ); + } self.gap_sync = None; } }, diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs index 1a3a679c519a..81fab3c4bfdc 100644 --- a/substrate/client/service/src/builder.rs +++ b/substrate/client/service/src/builder.rs @@ -769,7 +769,7 @@ where match config.network.sync_mode { SyncMode::LightState { .. } => return Err("Fast sync doesn't work for archive nodes".into()), - SyncMode::Warp => return Err("Warp sync doesn't work for archive nodes".into()), + SyncMode::Warp { .. } => return Err("Warp sync doesn't work for archive nodes".into()), SyncMode::Full => {}, } } From 87b4caf39b4f28274890cd4911761644b4c7223c Mon Sep 17 00:00:00 2001 From: Tomasz Polaczyk Date: Thu, 14 Dec 2023 11:52:03 +0100 Subject: [PATCH 2/2] Fix clippy --- cumulus/client/service/src/lib.rs | 2 +- substrate/client/network/test/src/lib.rs | 2 +- substrate/client/network/test/src/sync.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cumulus/client/service/src/lib.rs b/cumulus/client/service/src/lib.rs index edaebb18cd39..a754e324f7ba 100644 --- a/cumulus/client/service/src/lib.rs +++ b/cumulus/client/service/src/lib.rs @@ -40,7 +40,7 @@ use sc_consensus::{ import_queue::{ImportQueue, ImportQueueService}, BlockImport, }; -use sc_network::{config::SyncMode, NetworkService}; +use sc_network::NetworkService; use sc_network_sync::SyncingService; use sc_network_transactions::TransactionsHandlerController; use sc_service::{Configuration, NetworkStarter, SpawnTaskHandle, TaskManager, WarpSyncParams}; diff --git a/substrate/client/network/test/src/lib.rs b/substrate/client/network/test/src/lib.rs index 71f13b74a532..7f648700b380 100644 --- a/substrate/client/network/test/src/lib.rs +++ b/substrate/client/network/test/src/lib.rs @@ -758,7 +758,7 @@ pub trait TestNetFactory: Default + Sized + Send { *genesis_extra_storage = storage; } - if matches!(config.sync_mode, SyncMode::LightState { .. } | SyncMode::Warp) { + if matches!(config.sync_mode, SyncMode::LightState { .. } | SyncMode::Warp { .. }) { test_client_builder = test_client_builder.set_no_genesis(); } let backend = test_client_builder.backend(); diff --git a/substrate/client/network/test/src/sync.rs b/substrate/client/network/test/src/sync.rs index f2be662ada16..1d74fc4be6a0 100644 --- a/substrate/client/network/test/src/sync.rs +++ b/substrate/client/network/test/src/sync.rs @@ -1225,7 +1225,7 @@ async fn warp_sync() { net.add_full_peer_with_config(Default::default()); net.add_full_peer_with_config(Default::default()); net.add_full_peer_with_config(FullPeerConfig { - sync_mode: SyncMode::Warp, + sync_mode: SyncMode::Warp { block_history: true }, ..Default::default() }); let gap_end = net.peer(0).push_blocks(63, false).pop().unwrap(); @@ -1266,7 +1266,7 @@ async fn warp_sync_to_target_block() { let target_block = net.peer(0).client.header(target).unwrap().unwrap(); net.add_full_peer_with_config(FullPeerConfig { - sync_mode: SyncMode::Warp, + sync_mode: SyncMode::Warp { block_history: true }, target_block: Some(target_block), ..Default::default() });