diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs index f29e7f3ed7c7c5eb55cbe80a2c428c112e58cd60..375553311ac2f1b462ee31997a40a050d4d67eb2 100644 --- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs +++ b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs @@ -380,6 +380,7 @@ fn build_polkadot_full_node( prepare_workers_hard_max_num: None, prepare_workers_soft_max_num: None, enable_approval_voting_parallel: false, + keep_finalized_for: None, }, )?; diff --git a/polkadot/cli/src/cli.rs b/polkadot/cli/src/cli.rs index 777bb9c60671244e56153cf666d8f4702d1abaf5..97081749996f819124640e27431eed3c556dede2 100644 --- a/polkadot/cli/src/cli.rs +++ b/polkadot/cli/src/cli.rs @@ -152,6 +152,11 @@ pub struct RunCmd { /// explicitly advised to. #[arg(long)] pub enable_approval_voting_parallel: bool, + + /// How long finalized data should be kept in the availability store (in hours). + /// Defaults to 25 hours for live networks and 1 hour for test networks. + #[arg(long)] + pub keep_finalized_for: Option<u32>, } #[allow(missing_docs)] diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs index 02c9b97150c2db9e831ad175da301d00a5c08a5f..6b716d48783bc29cc63d8d04fad7788d072d67ce 100644 --- a/polkadot/cli/src/command.rs +++ b/polkadot/cli/src/command.rs @@ -235,6 +235,7 @@ where prepare_workers_hard_max_num: cli.run.prepare_workers_hard_max_num, prepare_workers_soft_max_num: cli.run.prepare_workers_soft_max_num, enable_approval_voting_parallel: cli.run.enable_approval_voting_parallel, + keep_finalized_for: cli.run.keep_finalized_for, }, ) .map(|full| full.task_manager)?; diff --git a/polkadot/node/core/av-store/src/lib.rs b/polkadot/node/core/av-store/src/lib.rs index 9da2973773a01923b8108d73871f875fd1e96cb3..2621b13767171cc741b9cba7e008cf305d5f2985 100644 --- a/polkadot/node/core/av-store/src/lib.rs +++ b/polkadot/node/core/av-store/src/lib.rs @@ -75,9 +75,6 @@ const TOMBSTONE_VALUE: &[u8] = b" "; /// Unavailable blocks are kept for 1 hour. const KEEP_UNAVAILABLE_FOR: Duration = Duration::from_secs(60 * 60); -/// Finalized data is kept for 25 hours. -const KEEP_FINALIZED_FOR: Duration = Duration::from_secs(25 * 60 * 60); - /// The pruning interval. const PRUNING_INTERVAL: Duration = Duration::from_secs(60 * 5); @@ -423,16 +420,6 @@ struct PruningConfig { pruning_interval: Duration, } -impl Default for PruningConfig { - fn default() -> Self { - Self { - keep_unavailable_for: KEEP_UNAVAILABLE_FOR, - keep_finalized_for: KEEP_FINALIZED_FOR, - pruning_interval: PRUNING_INTERVAL, - } - } -} - /// Configuration for the availability store. #[derive(Debug, Clone, Copy)] pub struct Config { @@ -440,6 +427,8 @@ pub struct Config { pub col_data: u32, /// The column family for availability store meta information. pub col_meta: u32, + /// How long finalized data should be kept (in hours). + pub keep_finalized_for: u32, } trait Clock: Send + Sync { @@ -475,10 +464,16 @@ impl AvailabilityStoreSubsystem { sync_oracle: Box<dyn SyncOracle + Send + Sync>, metrics: Metrics, ) -> Self { + let pruning_config = PruningConfig { + keep_unavailable_for: KEEP_UNAVAILABLE_FOR, + keep_finalized_for: Duration::from_secs(config.keep_finalized_for as u64 * 3600), + pruning_interval: PRUNING_INTERVAL, + }; + Self::with_pruning_config_and_clock( db, config, - PruningConfig::default(), + pruning_config, Box::new(SystemClock), sync_oracle, metrics, diff --git a/polkadot/node/core/av-store/src/tests.rs b/polkadot/node/core/av-store/src/tests.rs index 80043e56976b1b75c76894f664d54c20d0813107..28b97c425b60d4d6365f3cd91318c551d7257e55 100644 --- a/polkadot/node/core/av-store/src/tests.rs +++ b/polkadot/node/core/av-store/src/tests.rs @@ -43,7 +43,7 @@ mod columns { pub const NUM_COLUMNS: u32 = 2; } -const TEST_CONFIG: Config = Config { col_data: columns::DATA, col_meta: columns::META }; +const TEST_CONFIG: Config = Config { col_data: columns::DATA, col_meta: columns::META, keep_finalized_for: 1 }; type VirtualOverseer = polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle<AvailabilityStoreMessage>; diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs index 820cce8d083a63903d7887247990545bce114315..26d70f47a84c855ead5f9e7a9a6f95c216bcf3b9 100644 --- a/polkadot/node/service/src/lib.rs +++ b/polkadot/node/service/src/lib.rs @@ -99,6 +99,7 @@ pub use sc_service::{ ChainSpec, Configuration, Error as SubstrateServiceError, PruningMode, Role, TFullBackend, TFullCallExecutor, TFullClient, TaskManager, TransactionPoolOptions, }; +use sc_chain_spec::ChainType; pub use sp_api::{ApiRef, ConstructRuntimeApi, Core as CoreApi, ProvideRuntimeApi}; pub use sp_consensus::{Proposal, SelectChain}; use sp_consensus_beefy::ecdsa_crypto; @@ -628,6 +629,8 @@ pub struct NewFullParams<OverseerGenerator: OverseerGen> { pub prepare_workers_soft_max_num: Option<usize>, /// An optional absolute number of pvf workers that can be spawned in the pvf prepare pool. pub prepare_workers_hard_max_num: Option<usize>, + /// How long finalized data should be kept in the availability store (in hours) + pub keep_finalized_for: Option<u32>, pub overseer_gen: OverseerGenerator, pub overseer_message_channel_capacity_override: Option<usize>, #[allow(dead_code)] @@ -691,11 +694,6 @@ impl IsParachainNode { } } -pub const AVAILABILITY_CONFIG: AvailabilityConfig = AvailabilityConfig { - col_data: parachains_db::REAL_COLUMNS.col_availability_data, - col_meta: parachains_db::REAL_COLUMNS.col_availability_meta, -}; - /// Create a new full node of arbitrary runtime and executor. /// /// This is an advanced feature and not recommended for general use. Generally, `build_full` is @@ -727,6 +725,7 @@ pub fn new_full< execute_workers_max_num, prepare_workers_soft_max_num, prepare_workers_hard_max_num, + keep_finalized_for, enable_approval_voting_parallel, }: NewFullParams<OverseerGenerator>, ) -> Result<NewFull, Error> { @@ -979,11 +978,23 @@ pub fn new_full< let fetch_chunks_threshold = if config.chain_spec.is_polkadot() { None } else { Some(FETCH_CHUNKS_THRESHOLD) }; + let availability_config = AvailabilityConfig { + col_data: parachains_db::REAL_COLUMNS.col_availability_data, + col_meta: parachains_db::REAL_COLUMNS.col_availability_meta, + keep_finalized_for: keep_finalized_for.unwrap_or_else(|| { + if matches!(config.chain_spec.chain_type(), ChainType::Live) { + 25 + } else { + 1 + } + }), + }; + Some(ExtendedOverseerGenArgs { keystore, parachains_db, candidate_validation_config, - availability_config: AVAILABILITY_CONFIG, + availability_config, pov_req_receiver, chunk_req_v1_receiver, chunk_req_v2_receiver, diff --git a/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs b/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs index 3300def2235ee0ea90f466316f9bc5a7a965869c..56332ee75a60e8ad24e78fc2340868036e5c60b6 100644 --- a/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs +++ b/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs @@ -26,7 +26,11 @@ mod columns { pub const NUM_COLUMNS: u32 = 2; } -const TEST_CONFIG: Config = Config { col_data: columns::DATA, col_meta: columns::META }; +const TEST_CONFIG: Config = Config { + col_data: columns::DATA, + col_meta: columns::META, + keep_finalized_for: 1, +}; pub fn new_av_store(dependencies: &TestEnvironmentDependencies) -> AvailabilityStoreSubsystem { let metrics = Metrics::try_register(&dependencies.registry).unwrap(); diff --git a/polkadot/node/test/service/src/lib.rs b/polkadot/node/test/service/src/lib.rs index 75fd0d9af3013c944a7feaf85a884ba212f42f23..dea2682b61b6db3e985db6f4f7ebb6097283c6a0 100644 --- a/polkadot/node/test/service/src/lib.rs +++ b/polkadot/node/test/service/src/lib.rs @@ -101,6 +101,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>( prepare_workers_hard_max_num: None, prepare_workers_soft_max_num: None, enable_approval_voting_parallel: false, + keep_finalized_for: None, }, ), sc_network::config::NetworkBackendType::Litep2p => @@ -123,6 +124,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>( prepare_workers_hard_max_num: None, prepare_workers_soft_max_num: None, enable_approval_voting_parallel: false, + keep_finalized_for: None, }, ), } diff --git a/polkadot/parachain/test-parachains/adder/collator/src/main.rs b/polkadot/parachain/test-parachains/adder/collator/src/main.rs index 416e58b0a8ac6868213a2b0f165a934ad5357c66..58fa3e841ef8ee68c57e02e39802b1b5787e24c8 100644 --- a/polkadot/parachain/test-parachains/adder/collator/src/main.rs +++ b/polkadot/parachain/test-parachains/adder/collator/src/main.rs @@ -98,6 +98,7 @@ fn main() -> Result<()> { prepare_workers_hard_max_num: None, prepare_workers_soft_max_num: None, enable_approval_voting_parallel: false, + keep_finalized_for: None, }, ) .map_err(|e| e.to_string())?; diff --git a/polkadot/parachain/test-parachains/undying/collator/src/main.rs b/polkadot/parachain/test-parachains/undying/collator/src/main.rs index 017eefe5ee31e1695272ac63ad43567604152f03..c77a7697a562633539a2ac301c7a9addf895c516 100644 --- a/polkadot/parachain/test-parachains/undying/collator/src/main.rs +++ b/polkadot/parachain/test-parachains/undying/collator/src/main.rs @@ -100,6 +100,7 @@ fn main() -> Result<()> { prepare_workers_hard_max_num: None, prepare_workers_soft_max_num: None, enable_approval_voting_parallel: false, + keep_finalized_for: None, }, ) .map_err(|e| e.to_string())?;