Skip to content
Snippets Groups Projects
Unverified Commit db3ff60b authored by Ludovic_Domingues's avatar Ludovic_Domingues Committed by GitHub
Browse files

Migrating polkadot-runtime-common slots benchmarking to v2 (#6614)


#Description
Migrated polkadot-runtime-parachains slots benchmarking to the new
benchmarking syntax v2.
This is part of #6202

---------

Co-authored-by: default avatarGiuseppe Re <giuseppe.re@parity.io>
Co-authored-by: default avatarseemantaggarwal <32275622+seemantaggarwal@users.noreply.github.com>
Co-authored-by: default avatarBastian Köcher <git@kchr.de>
parent d85147d0
No related merge requests found
Pipeline #513371 waiting for manual action with stages
in 50 minutes and 41 seconds
...@@ -149,7 +149,7 @@ pub mod pallet { ...@@ -149,7 +149,7 @@ pub mod pallet {
if let Some((lease_period, first_block)) = Self::lease_period_index(n) { if let Some((lease_period, first_block)) = Self::lease_period_index(n) {
// If we're beginning a new lease period then handle that. // If we're beginning a new lease period then handle that.
if first_block { if first_block {
return Self::manage_lease_period_start(lease_period) return Self::manage_lease_period_start(lease_period);
} }
} }
...@@ -237,7 +237,7 @@ impl<T: Config> Pallet<T> { ...@@ -237,7 +237,7 @@ impl<T: Config> Pallet<T> {
let mut parachains = Vec::new(); let mut parachains = Vec::new();
for (para, mut lease_periods) in Leases::<T>::iter() { for (para, mut lease_periods) in Leases::<T>::iter() {
if lease_periods.is_empty() { if lease_periods.is_empty() {
continue continue;
} }
// ^^ should never be empty since we would have deleted the entry otherwise. // ^^ should never be empty since we would have deleted the entry otherwise.
...@@ -381,7 +381,7 @@ impl<T: Config> Leaser<BlockNumberFor<T>> for Pallet<T> { ...@@ -381,7 +381,7 @@ impl<T: Config> Leaser<BlockNumberFor<T>> for Pallet<T> {
// attempt. // attempt.
// //
// We bail, not giving any lease and leave it for governance to sort out. // We bail, not giving any lease and leave it for governance to sort out.
return Err(LeaseError::AlreadyLeased) return Err(LeaseError::AlreadyLeased);
} }
} else if d.len() == i { } else if d.len() == i {
// Doesn't exist. This is usual. // Doesn't exist. This is usual.
...@@ -488,7 +488,7 @@ impl<T: Config> Leaser<BlockNumberFor<T>> for Pallet<T> { ...@@ -488,7 +488,7 @@ impl<T: Config> Leaser<BlockNumberFor<T>> for Pallet<T> {
for slot in offset..=offset + period_count { for slot in offset..=offset + period_count {
if let Some(Some(_)) = leases.get(slot) { if let Some(Some(_)) = leases.get(slot) {
// If there exists any lease period, we exit early and return true. // If there exists any lease period, we exit early and return true.
return true return true;
} }
} }
...@@ -962,7 +962,7 @@ mod benchmarking { ...@@ -962,7 +962,7 @@ mod benchmarking {
use polkadot_runtime_parachains::paras; use polkadot_runtime_parachains::paras;
use sp_runtime::traits::{Bounded, One}; use sp_runtime::traits::{Bounded, One};
use frame_benchmarking::{account, benchmarks, whitelisted_caller, BenchmarkError}; use frame_benchmarking::v2::*;
use crate::slots::Pallet as Slots; use crate::slots::Pallet as Slots;
...@@ -998,10 +998,15 @@ mod benchmarking { ...@@ -998,10 +998,15 @@ mod benchmarking {
(para, leaser) (para, leaser)
} }
benchmarks! { #[benchmarks(
where_clause { where T: paras::Config } where T: paras::Config,
)]
force_lease { mod benchmarks {
use super::*;
#[benchmark]
fn force_lease() -> Result<(), BenchmarkError> {
// If there is an offset, we need to be on that block to be able to do lease things. // If there is an offset, we need to be on that block to be able to do lease things.
frame_system::Pallet::<T>::set_block_number(T::LeaseOffset::get() + One::one()); frame_system::Pallet::<T>::set_block_number(T::LeaseOffset::get() + One::one());
let para = ParaId::from(1337); let para = ParaId::from(1337);
...@@ -1012,23 +1017,32 @@ mod benchmarking { ...@@ -1012,23 +1017,32 @@ mod benchmarking {
let period_count = 3u32.into(); let period_count = 3u32.into();
let origin = let origin =
T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
}: _<T::RuntimeOrigin>(origin, para, leaser.clone(), amount, period_begin, period_count)
verify {
assert_last_event::<T>(Event::<T>::Leased {
para_id: para,
leaser, period_begin,
period_count,
extra_reserved: amount,
total_amount: amount,
}.into());
}
// Worst case scenario, T on-demand parachains onboard, and C lease holding parachains offboard. #[extrinsic_call]
manage_lease_period_start { _(origin as T::RuntimeOrigin, para, leaser.clone(), amount, period_begin, period_count);
// Assume reasonable maximum of 100 paras at any time
let c in 0 .. 100; assert_last_event::<T>(
let t in 0 .. 100; Event::<T>::Leased {
para_id: para,
leaser,
period_begin,
period_count,
extra_reserved: amount,
total_amount: amount,
}
.into(),
);
Ok(())
}
// Worst case scenario, T on-demand parachains onboard, and C lease holding parachains
// offboard. Assume reasonable maximum of 100 paras at any time
#[benchmark]
fn manage_lease_period_start(
c: Linear<0, 100>,
t: Linear<0, 100>,
) -> Result<(), BenchmarkError> {
let period_begin = 1u32.into(); let period_begin = 1u32.into();
let period_count = 4u32.into(); let period_count = 4u32.into();
...@@ -1036,9 +1050,7 @@ mod benchmarking { ...@@ -1036,9 +1050,7 @@ mod benchmarking {
frame_system::Pallet::<T>::set_block_number(T::LeaseOffset::get() + One::one()); frame_system::Pallet::<T>::set_block_number(T::LeaseOffset::get() + One::one());
// Make T parathreads (on-demand parachains) // Make T parathreads (on-demand parachains)
let paras_info = (0..t).map(|i| { let paras_info = (0..t).map(|i| register_a_parathread::<T>(i)).collect::<Vec<_>>();
register_a_parathread::<T>(i)
}).collect::<Vec<_>>();
T::Registrar::execute_pending_transitions(); T::Registrar::execute_pending_transitions();
...@@ -1053,43 +1065,48 @@ mod benchmarking { ...@@ -1053,43 +1065,48 @@ mod benchmarking {
T::Registrar::execute_pending_transitions(); T::Registrar::execute_pending_transitions();
// C lease holding parachains are downgrading to on-demand parachains // C lease holding parachains are downgrading to on-demand parachains
for i in 200 .. 200 + c { for i in 200..200 + c {
let (para, leaser) = register_a_parathread::<T>(i); let (para, _) = register_a_parathread::<T>(i);
T::Registrar::make_parachain(para)?; T::Registrar::make_parachain(para)?;
} }
T::Registrar::execute_pending_transitions(); T::Registrar::execute_pending_transitions();
for i in 0 .. t { for i in 0..t {
assert!(T::Registrar::is_parathread(ParaId::from(i))); assert!(T::Registrar::is_parathread(ParaId::from(i)));
} }
for i in 200 .. 200 + c { for i in 200..200 + c {
assert!(T::Registrar::is_parachain(ParaId::from(i))); assert!(T::Registrar::is_parachain(ParaId::from(i)));
} }
}: { #[block]
Slots::<T>::manage_lease_period_start(period_begin); {
} verify { let _ = Slots::<T>::manage_lease_period_start(period_begin);
}
// All paras should have switched. // All paras should have switched.
T::Registrar::execute_pending_transitions(); T::Registrar::execute_pending_transitions();
for i in 0 .. t { for i in 0..t {
assert!(T::Registrar::is_parachain(ParaId::from(i))); assert!(T::Registrar::is_parachain(ParaId::from(i)));
} }
for i in 200 .. 200 + c { for i in 200..200 + c {
assert!(T::Registrar::is_parathread(ParaId::from(i))); assert!(T::Registrar::is_parathread(ParaId::from(i)));
} }
Ok(())
} }
// Assume that at most 8 people have deposits for leases on a parachain. // Assume that at most 8 people have deposits for leases on a parachain.
// This would cover at least 4 years of leases in the worst case scenario. // This would cover at least 4 years of leases in the worst case scenario.
clear_all_leases { #[benchmark]
fn clear_all_leases() -> Result<(), BenchmarkError> {
let max_people = 8; let max_people = 8;
let (para, _) = register_a_parathread::<T>(1); let (para, _) = register_a_parathread::<T>(1);
// If there is an offset, we need to be on that block to be able to do lease things. // If there is an offset, we need to be on that block to be able to do lease things.
frame_system::Pallet::<T>::set_block_number(T::LeaseOffset::get() + One::one()); frame_system::Pallet::<T>::set_block_number(T::LeaseOffset::get() + One::one());
for i in 0 .. max_people { for i in 0..max_people {
let leaser = account("lease_deposit", i, 0); let leaser = account("lease_deposit", i, 0);
let amount = T::Currency::minimum_balance(); let amount = T::Currency::minimum_balance();
T::Currency::make_free_balance_be(&leaser, BalanceOf::<T>::max_value()); T::Currency::make_free_balance_be(&leaser, BalanceOf::<T>::max_value());
...@@ -1102,31 +1119,45 @@ mod benchmarking { ...@@ -1102,31 +1119,45 @@ mod benchmarking {
Slots::<T>::force_lease(origin, para, leaser, amount, period_begin, period_count)?; Slots::<T>::force_lease(origin, para, leaser, amount, period_begin, period_count)?;
} }
for i in 0 .. max_people { for i in 0..max_people {
let leaser = account("lease_deposit", i, 0); let leaser = account("lease_deposit", i, 0);
assert_eq!(T::Currency::reserved_balance(&leaser), T::Currency::minimum_balance()); assert_eq!(T::Currency::reserved_balance(&leaser), T::Currency::minimum_balance());
} }
let origin = let origin =
T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
}: _<T::RuntimeOrigin>(origin, para)
verify { #[extrinsic_call]
for i in 0 .. max_people { _(origin as T::RuntimeOrigin, para);
for i in 0..max_people {
let leaser = account("lease_deposit", i, 0); let leaser = account("lease_deposit", i, 0);
assert_eq!(T::Currency::reserved_balance(&leaser), 0u32.into()); assert_eq!(T::Currency::reserved_balance(&leaser), 0u32.into());
} }
Ok(())
} }
trigger_onboard { #[benchmark]
fn trigger_onboard() -> Result<(), BenchmarkError> {
// get a parachain into a bad state where they did not onboard // get a parachain into a bad state where they did not onboard
let (para, _) = register_a_parathread::<T>(1); let (para, _) = register_a_parathread::<T>(1);
Leases::<T>::insert(para, vec![Some((account::<T::AccountId>("lease_insert", 0, 0), BalanceOf::<T>::default()))]); Leases::<T>::insert(
para,
vec![Some((
account::<T::AccountId>("lease_insert", 0, 0),
BalanceOf::<T>::default(),
))],
);
assert!(T::Registrar::is_parathread(para)); assert!(T::Registrar::is_parathread(para));
let caller = whitelisted_caller(); let caller = whitelisted_caller();
}: _(RawOrigin::Signed(caller), para)
verify { #[extrinsic_call]
_(RawOrigin::Signed(caller), para);
T::Registrar::execute_pending_transitions(); T::Registrar::execute_pending_transitions();
assert!(T::Registrar::is_parachain(para)); assert!(T::Registrar::is_parachain(para));
Ok(())
} }
impl_benchmark_test_suite!( impl_benchmark_test_suite!(
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment