diff --git a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs index 485e7211c1d2..2c553714d9f2 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs @@ -13,42 +13,50 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +#![cfg(feature = "runtime-benchmarks")] use super::*; use crate::{inclusion, ParaId}; use alloc::collections::btree_map::BTreeMap; use core::cmp::{max, min}; -use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; +use frame_benchmarking::v2::*; use frame_system::RawOrigin; use polkadot_primitives::v8::GroupIndex; use crate::builder::BenchBuilder; -benchmarks! { - enter_empty { - let scenario = BenchBuilder::::new() - .build(); +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn enter_empty() -> Result<(), BenchmarkError> { + let scenario = BenchBuilder::::new().build(); let mut benchmark = scenario.data.clone(); benchmark.bitfields.clear(); benchmark.backed_candidates.clear(); benchmark.disputes.clear(); - }: enter(RawOrigin::None, benchmark) - verify { + + #[extrinsic_call] + enter(RawOrigin::None, benchmark); + // Assert that the block was not discarded assert!(Included::::get().is_some()); + + Ok(()) } + // Variant over `v`, the number of dispute statements in a dispute statement set. This gives the // weight of a single dispute statement set. - enter_variable_disputes { - // The number of statements needs to be at least a third of the validator set size. - let v in 400..BenchBuilder::::fallback_max_validators(); - - let scenario = BenchBuilder::::new() - .set_dispute_sessions(&[2]) - .build(); + // The number of statements needs to be at least a third of the validator set size. + #[benchmark] + fn enter_variable_disputes( + v: Linear<400, { BenchBuilder::::fallback_max_validators() }>, + ) -> Result<(), BenchmarkError> { + let scenario = BenchBuilder::::new().set_dispute_sessions(&[2]).build(); let mut benchmark = scenario.data.clone(); let dispute = benchmark.disputes.pop().unwrap(); @@ -59,8 +67,10 @@ benchmarks! { benchmark.disputes.push(dispute); benchmark.disputes.get_mut(0).unwrap().statements.drain(v as usize..); - }: enter(RawOrigin::None, benchmark) - verify { + + #[extrinsic_call] + enter(RawOrigin::None, benchmark); + // Assert that the block was not discarded assert!(Included::::get().is_some()); @@ -71,14 +81,15 @@ benchmarks! { // Ensure that the votes are for the correct session assert_eq!(vote.session, scenario._session); + + Ok(()) } // The weight of one bitfield. - enter_bitfields { - let cores_with_backed: BTreeMap<_, _> - = vec![(0, BenchBuilder::::fallback_max_validators())] - .into_iter() - .collect(); + #[benchmark] + fn enter_bitfields() -> Result<(), BenchmarkError> { + let cores_with_backed: BTreeMap<_, _> = + vec![(0, BenchBuilder::::fallback_max_validators())].into_iter().collect(); let scenario = BenchBuilder::::new() .set_backed_and_concluding_paras(cores_with_backed) @@ -92,8 +103,10 @@ benchmarks! { benchmark.disputes.clear(); benchmark.bitfields.push(bitfield); - }: enter(RawOrigin::None, benchmark) - verify { + + #[extrinsic_call] + enter(RawOrigin::None, benchmark); + // Assert that the block was not discarded assert!(Included::::get().is_some()); // Assert that there are on-chain votes that got scraped @@ -102,18 +115,27 @@ benchmarks! { let vote = onchain_votes.unwrap(); // Ensure that the votes are for the correct session assert_eq!(vote.session, scenario._session); + + Ok(()) } // Variant over `v`, the amount of validity votes for a backed candidate. This gives the weight // of a single backed candidate. - enter_backed_candidates_variable { - let v in (BenchBuilder::::fallback_min_backing_votes()) - .. max(BenchBuilder::::fallback_min_backing_votes() + 1, BenchBuilder::::fallback_max_validators_per_core()); - - let cores_with_backed: BTreeMap<_, _> - = vec![(0, v)] // The backed candidate will have `v` validity votes. - .into_iter() - .collect(); + #[benchmark] + fn enter_backed_candidates_variable( + v: Linear< + { BenchBuilder::::fallback_min_backing_votes() }, + { + max( + BenchBuilder::::fallback_min_backing_votes() + 1, + BenchBuilder::::fallback_max_validators_per_core(), + ) + }, + >, + ) -> Result<(), BenchmarkError> { + let cores_with_backed: BTreeMap<_, _> = vec![(0, v)] // The backed candidate will have `v` validity votes. + .into_iter() + .collect(); let scenario = BenchBuilder::::new() .set_backed_in_inherent_paras(cores_with_backed.clone()) @@ -124,13 +146,18 @@ benchmarks! { // There is 1 backed, assert_eq!(benchmark.backed_candidates.len(), 1); // with `v` validity votes. - let votes = min(scheduler::Pallet::::group_validators(GroupIndex::from(0)).unwrap().len(), v as usize); + let votes = min( + scheduler::Pallet::::group_validators(GroupIndex::from(0)).unwrap().len(), + v as usize, + ); assert_eq!(benchmark.backed_candidates.get(0).unwrap().validity_votes().len(), votes); benchmark.bitfields.clear(); benchmark.disputes.clear(); - }: enter(RawOrigin::None, benchmark) - verify { + + #[extrinsic_call] + enter(RawOrigin::None, benchmark); + let max_validators_per_core = BenchBuilder::::fallback_max_validators_per_core(); // Assert that the block was not discarded assert!(Included::::get().is_some()); @@ -143,27 +170,27 @@ benchmarks! { // Ensure that there are an expected number of candidates let header = BenchBuilder::::header(scenario._block_number); // Traverse candidates and assert descriptors are as expected - for (para_id, backing_validators) in vote.backing_validators_per_candidate.iter().enumerate() { + for (para_id, backing_validators) in + vote.backing_validators_per_candidate.iter().enumerate() + { let descriptor = backing_validators.0.descriptor(); assert_eq!(ParaId::from(para_id), descriptor.para_id()); assert_eq!(header.hash(), descriptor.relay_parent()); assert_eq!(backing_validators.1.len(), votes); } - assert_eq!( - inclusion::PendingAvailability::::iter().count(), - cores_with_backed.len() - ); + assert_eq!(inclusion::PendingAvailability::::iter().count(), cores_with_backed.len()); + + Ok(()) } - enter_backed_candidate_code_upgrade { + #[benchmark] + fn enter_backed_candidate_code_upgrade() -> Result<(), BenchmarkError> { // For now we always assume worst case code size. In the future we could vary over this. let v = crate::configuration::ActiveConfig::::get().max_code_size; - let cores_with_backed: BTreeMap<_, _> - = vec![(0, BenchBuilder::::fallback_min_backing_votes())] - .into_iter() - .collect(); + let cores_with_backed: BTreeMap<_, _> = + vec![(0, BenchBuilder::::fallback_min_backing_votes())].into_iter().collect(); let scenario = BenchBuilder::::new() .set_backed_in_inherent_paras(cores_with_backed.clone()) @@ -174,21 +201,20 @@ benchmarks! { let votes = min( scheduler::Pallet::::group_validators(GroupIndex::from(0)).unwrap().len(), - BenchBuilder::::fallback_min_backing_votes() as usize + BenchBuilder::::fallback_min_backing_votes() as usize, ); // There is 1 backed assert_eq!(benchmark.backed_candidates.len(), 1); - assert_eq!( - benchmark.backed_candidates.get(0).unwrap().validity_votes().len(), - votes, - ); + assert_eq!(benchmark.backed_candidates.get(0).unwrap().validity_votes().len(), votes,); benchmark.bitfields.clear(); benchmark.disputes.clear(); crate::paras::benchmarking::generate_disordered_upgrades::(); - }: enter(RawOrigin::None, benchmark) - verify { + + #[extrinsic_call] + enter(RawOrigin::None, benchmark); + let max_validators_per_core = BenchBuilder::::fallback_max_validators_per_core(); // Assert that the block was not discarded assert!(Included::::get().is_some()); @@ -201,26 +227,22 @@ benchmarks! { // Ensure that there are an expected number of candidates let header = BenchBuilder::::header(scenario._block_number); // Traverse candidates and assert descriptors are as expected - for (para_id, backing_validators) - in vote.backing_validators_per_candidate.iter().enumerate() { - let descriptor = backing_validators.0.descriptor(); - assert_eq!(ParaId::from(para_id), descriptor.para_id()); - assert_eq!(header.hash(), descriptor.relay_parent()); - assert_eq!( - backing_validators.1.len(), - votes, - ); - } - - assert_eq!( - inclusion::PendingAvailability::::iter().count(), - cores_with_backed.len() - ); + for (para_id, backing_validators) in + vote.backing_validators_per_candidate.iter().enumerate() + { + let descriptor = backing_validators.0.descriptor(); + assert_eq!(ParaId::from(para_id), descriptor.para_id()); + assert_eq!(header.hash(), descriptor.relay_parent()); + assert_eq!(backing_validators.1.len(), votes,); + } + + assert_eq!(inclusion::PendingAvailability::::iter().count(), cores_with_backed.len()); + Ok(()) } -} -impl_benchmark_test_suite!( - Pallet, - crate::mock::new_test_ext(Default::default()), - crate::mock::Test -); + impl_benchmark_test_suite! { + Pallet, + crate::mock::new_test_ext(Default::default()), + crate::mock::Test + } +}