mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-20 12:51:02 +00:00
contracts: Multi block migrations (#14045)
* Frame Add translate_next This works similarly to to `translate` but only translate a single entry. This function will be useful in the context of multi-block migration. * Move to lazy migration * Updates * simplify MockMigration * wip * wip * add bench * add bench * fmt * fix bench * add . * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * Apply suggestions from code review Co-authored-by: Alexander Theißen <alex.theissen@me.com> * Scalfold v10 / v11 fix tests * PR comment * tweak pub use * wip * wip * wip * misc merge master * misc merge master * wip * rm tmp stuff * wip * wip * wip * wip * wip * fixes * add state * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix * fixed compilation * clean up logs * wip * Revert "Frame Add translate_next" This reverts commit 10318fc95c42b1f7f25efeb35e6d947ea02bed88. * Fix v10 logic * Apply suggestions from code review Co-authored-by: Alexander Theißen <alex.theissen@me.com> * wip * fixes * exercise del_queue * bump sample size * fmt * wip * blank line * fix lint * fix rustdoc job lint * PR comment do not use dangerous into() * Ad macros for updating mod visibility * Add doc * Add max_weight to integrity_test * fix compilation * Add no migration tests * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * fix clippy * PR review * Update frame/contracts/src/lib.rs Co-authored-by: Sasha Gryaznov <hi@agryaznov.com> * Fix master merge * fix merge 2 * fix tryruntime * fix lint --------- Co-authored-by: Alexander Theißen <alex.theissen@me.com> Co-authored-by: command-bot <> Co-authored-by: Sasha Gryaznov <hi@agryaznov.com>
This commit is contained in:
@@ -21,7 +21,6 @@
|
||||
|
||||
mod code;
|
||||
mod sandbox;
|
||||
|
||||
use self::{
|
||||
code::{
|
||||
body::{self, DynInstr::*},
|
||||
@@ -31,12 +30,13 @@ use self::{
|
||||
};
|
||||
use crate::{
|
||||
exec::{AccountIdOf, Key},
|
||||
migration::{v10, v11, v9, Migrate},
|
||||
wasm::CallFlags,
|
||||
Pallet as Contracts, *,
|
||||
};
|
||||
use codec::{Encode, MaxEncodedLen};
|
||||
use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller};
|
||||
use frame_support::weights::Weight;
|
||||
use frame_support::{pallet_prelude::StorageVersion, weights::Weight};
|
||||
use frame_system::RawOrigin;
|
||||
use sp_runtime::{
|
||||
traits::{Bounded, Hash},
|
||||
@@ -234,6 +234,94 @@ benchmarks! {
|
||||
Contracts::<T>::reinstrument_module(&mut module, &schedule)?;
|
||||
}
|
||||
|
||||
// This benchmarks the v9 migration step. (update codeStorage)
|
||||
#[pov_mode = Measured]
|
||||
v9_migration_step {
|
||||
let c in 0 .. Perbill::from_percent(49).mul_ceil(T::MaxCodeLen::get());
|
||||
v9::store_old_dummy_code::<T>(c as usize);
|
||||
let mut m = v9::Migration::<T>::default();
|
||||
}: {
|
||||
m.step();
|
||||
}
|
||||
|
||||
// This benchmarks the v10 migration step. (use dedicated deposit_account)
|
||||
#[pov_mode = Measured]
|
||||
v10_migration_step {
|
||||
let contract = <Contract<T>>::with_caller(
|
||||
whitelisted_caller(), WasmModule::dummy(), vec![],
|
||||
)?;
|
||||
|
||||
v10::store_old_contrat_info::<T>(contract.account_id.clone(), contract.info()?);
|
||||
let mut m = v10::Migration::<T>::default();
|
||||
}: {
|
||||
m.step();
|
||||
}
|
||||
|
||||
// This benchmarks the v11 migration step.
|
||||
#[pov_mode = Measured]
|
||||
v11_migration_step {
|
||||
let k in 0 .. 1024;
|
||||
v11::fill_old_queue::<T>(k as usize);
|
||||
let mut m = v11::Migration::<T>::default();
|
||||
}: {
|
||||
m.step();
|
||||
}
|
||||
|
||||
// This benchmarks the weight of executing Migration::migrate to execute a noop migration.
|
||||
#[pov_mode = Measured]
|
||||
migration_noop {
|
||||
assert_eq!(StorageVersion::get::<Pallet<T>>(), 2);
|
||||
}: {
|
||||
Migration::<T>::migrate(Weight::MAX)
|
||||
} verify {
|
||||
assert_eq!(StorageVersion::get::<Pallet<T>>(), 2);
|
||||
}
|
||||
|
||||
// This benchmarks the weight of executing Migration::migrate when there are no migration in progress.
|
||||
#[pov_mode = Measured]
|
||||
migrate {
|
||||
StorageVersion::new(0).put::<Pallet<T>>();
|
||||
<Migration::<T> as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade();
|
||||
let origin: RawOrigin<<T as frame_system::Config>::AccountId> = RawOrigin::Signed(whitelisted_caller());
|
||||
}: {
|
||||
<Contracts<T>>::migrate(origin.into(), Weight::MAX).unwrap()
|
||||
} verify {
|
||||
assert_eq!(StorageVersion::get::<Pallet<T>>(), 1);
|
||||
}
|
||||
|
||||
// This benchmarks the weight of running on_runtime_upgrade when there are no migration in progress.
|
||||
#[pov_mode = Measured]
|
||||
on_runtime_upgrade_noop {
|
||||
assert_eq!(StorageVersion::get::<Pallet<T>>(), 2);
|
||||
}: {
|
||||
<Migration::<T> as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade()
|
||||
} verify {
|
||||
assert!(MigrationInProgress::<T>::get().is_none());
|
||||
}
|
||||
|
||||
// This benchmarks the weight of running on_runtime_upgrade when there is a migration in progress.
|
||||
#[pov_mode = Measured]
|
||||
on_runtime_upgrade_in_progress {
|
||||
StorageVersion::new(0).put::<Pallet<T>>();
|
||||
let v = vec![42u8].try_into().ok();
|
||||
MigrationInProgress::<T>::set(v.clone());
|
||||
}: {
|
||||
<Migration::<T> as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade()
|
||||
} verify {
|
||||
assert!(MigrationInProgress::<T>::get().is_some());
|
||||
assert_eq!(MigrationInProgress::<T>::get(), v);
|
||||
}
|
||||
|
||||
// This benchmarks the weight of running on_runtime_upgrade when there is a migration to process.
|
||||
#[pov_mode = Measured]
|
||||
on_runtime_upgrade {
|
||||
StorageVersion::new(0).put::<Pallet<T>>();
|
||||
}: {
|
||||
<Migration::<T> as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade()
|
||||
} verify {
|
||||
assert!(MigrationInProgress::<T>::get().is_some());
|
||||
}
|
||||
|
||||
// This benchmarks the overhead of loading a code of size `c` byte from storage and into
|
||||
// the sandbox. This does **not** include the actual execution for which the gas meter
|
||||
// is responsible. This is achieved by generating all code to the `deploy` function
|
||||
|
||||
Reference in New Issue
Block a user