From 418e95d4c8b697e978d38b003780939595cccfc6 Mon Sep 17 00:00:00 2001 From: Liam Aharon <liam.aharon@hotmail.com> Date: Tue, 23 May 2023 18:47:27 +1000 Subject: [PATCH] Ensure all `StorageVersion`s on Rococo/Westend are correct and migration hooks pass (#7251) * set fastunstake storage version * fix configration migration hooks * set missing rococo versions * remove child bounties version set * future proof this configuration migration * simplify rococo migration * simplify westend version migration * typo * restore missing comments * set configuration storage version correctly * remove redundant preupgrade version check * fix version checks * remove redundant comment --- .../runtime/parachains/src/configuration.rs | 14 +++- .../parachains/src/configuration/migration.rs | 13 --- .../src/configuration/migration/v5.rs | 6 +- .../src/configuration/migration/v6.rs | 6 +- polkadot/runtime/rococo/src/lib.rs | 84 +++++++++++++++++++ polkadot/runtime/westend/src/lib.rs | 17 ++++ 6 files changed, 118 insertions(+), 22 deletions(-) diff --git a/polkadot/runtime/parachains/src/configuration.rs b/polkadot/runtime/parachains/src/configuration.rs index a5de197b969..05b0ca1fc53 100644 --- a/polkadot/runtime/parachains/src/configuration.rs +++ b/polkadot/runtime/parachains/src/configuration.rs @@ -473,8 +473,20 @@ impl WeightInfo for TestWeightInfo { pub mod pallet { use super::*; + /// The current storage version. + /// + /// v0-v1: <https://github.com/paritytech/polkadot/pull/3575> + /// v1-v2: <https://github.com/paritytech/polkadot/pull/4420> + /// v2-v3: <https://github.com/paritytech/polkadot/pull/6091> + /// v3-v4: <https://github.com/paritytech/polkadot/pull/6345> + /// v4-v5: <https://github.com/paritytech/polkadot/pull/6937> + /// + <https://github.com/paritytech/polkadot/pull/6961> + /// + <https://github.com/paritytech/polkadot/pull/6934> + /// v5-v6: <https://github.com/paritytech/polkadot/pull/6271> (remove UMP dispatch queue) + const STORAGE_VERSION: StorageVersion = StorageVersion::new(6); + #[pallet::pallet] - #[pallet::storage_version(migration::STORAGE_VERSION)] + #[pallet::storage_version(STORAGE_VERSION)] #[pallet::without_storage_info] pub struct Pallet<T>(_); diff --git a/polkadot/runtime/parachains/src/configuration/migration.rs b/polkadot/runtime/parachains/src/configuration/migration.rs index c41d4f3055b..e499854e118 100644 --- a/polkadot/runtime/parachains/src/configuration/migration.rs +++ b/polkadot/runtime/parachains/src/configuration/migration.rs @@ -16,20 +16,7 @@ //! A module that is responsible for migration of storage. -use frame_support::traits::StorageVersion; use primitives::ExecutorParams; -/// The current storage version. -/// -/// v0-v1: <https://github.com/paritytech/polkadot/pull/3575> -/// v1-v2: <https://github.com/paritytech/polkadot/pull/4420> -/// v2-v3: <https://github.com/paritytech/polkadot/pull/6091> -/// v3-v4: <https://github.com/paritytech/polkadot/pull/6345> -/// v4-v5: <https://github.com/paritytech/polkadot/pull/6937> -/// + <https://github.com/paritytech/polkadot/pull/6961> -/// + <https://github.com/paritytech/polkadot/pull/6934> -/// v5-v6: <https://github.com/paritytech/polkadot/pull/6271> (remove UMP dispatch queue) -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(6); - pub mod v5; pub mod v6; diff --git a/polkadot/runtime/parachains/src/configuration/migration/v5.rs b/polkadot/runtime/parachains/src/configuration/migration/v5.rs index f50d1a9d6fc..6a47ce51f71 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v5.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v5.rs @@ -262,8 +262,6 @@ impl<T: Config> OnRuntimeUpgrade for MigrateToV5<T> { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result<Vec<u8>, sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade()"); - - ensure!(StorageVersion::get::<Pallet<T>>() == 4, "The migration requires version 4"); Ok(Vec::new()) } @@ -285,8 +283,8 @@ impl<T: Config> OnRuntimeUpgrade for MigrateToV5<T> { fn post_upgrade(_state: Vec<u8>) -> Result<(), sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running post_upgrade()"); ensure!( - StorageVersion::get::<Pallet<T>>() == 5, - "Storage version should be 5 after the migration" + StorageVersion::get::<Pallet<T>>() >= 5, + "Storage version should be greater or equal to 5 after the migration" ); Ok(()) diff --git a/polkadot/runtime/parachains/src/configuration/migration/v6.rs b/polkadot/runtime/parachains/src/configuration/migration/v6.rs index 958d71950e3..67baea10a64 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v6.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v6.rs @@ -61,8 +61,6 @@ impl<T: Config> OnRuntimeUpgrade for MigrateToV6<T> { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result<Vec<u8>, sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade()"); - - ensure!(StorageVersion::get::<Pallet<T>>() == 5, "The migration requires version 4"); Ok(Vec::new()) } @@ -84,8 +82,8 @@ impl<T: Config> OnRuntimeUpgrade for MigrateToV6<T> { fn post_upgrade(_state: Vec<u8>) -> Result<(), sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running post_upgrade()"); ensure!( - StorageVersion::get::<Pallet<T>>() == 6, - "Storage version should be 6 after the migration" + StorageVersion::get::<Pallet<T>>() >= 6, + "Storage version should be >= 6 after the migration" ); Ok(()) diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 187efaabbd8..a0b05aef8d9 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -1527,6 +1527,7 @@ pub type Migrations = #[allow(deprecated, missing_docs)] pub mod migrations { use super::*; + use frame_support::traits::{GetStorageVersion, OnRuntimeUpgrade, StorageVersion}; pub type V0940 = (); pub type V0941 = (); // Node only release - no migrations. @@ -1535,8 +1536,91 @@ pub mod migrations { pallet_offences::migration::v1::MigrateToV1<Runtime>, ); + /// Migrations that set `StorageVersion`s we missed to set. + /// + /// It's *possible* that these pallets have not in fact been migrated to the versions being set, + /// which we should keep in mind in the future if we notice any strange behavior. + /// We opted to not check exactly what on-chain versions each pallet is at, since it would be + /// an involved effort, this is testnet, and no one has complained + /// (https://github.com/paritytech/polkadot/issues/6657#issuecomment-1552956439). + pub struct SetStorageVersions; + + impl OnRuntimeUpgrade for SetStorageVersions { + fn on_runtime_upgrade() -> Weight { + let mut writes = 0; + let mut reads = 0; + + // Council + if Council::on_chain_storage_version() < 4 { + // Safe to assume Council was created with V4 pallet. + StorageVersion::new(4).put::<Council>(); + writes += 1; + } + reads += 1; + + // Technical Committee + if TechnicalCommittee::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::<TechnicalCommittee>(); + writes += 1; + } + reads += 1; + + // PhragmenElection + if PhragmenElection::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::<PhragmenElection>(); + writes += 1; + } + reads += 1; + + // TechnicalMembership + if TechnicalMembership::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::<TechnicalMembership>(); + writes += 1; + } + reads += 1; + + // Scheduler + if Scheduler::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::<Scheduler>(); + writes += 1; + } + reads += 1; + + // Bounties + if Bounties::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::<Bounties>(); + writes += 1; + } + reads += 1; + + // Tips + if Tips::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::<Tips>(); + writes += 1; + } + reads += 1; + + // NisCounterpartBalances + if NisCounterpartBalances::on_chain_storage_version() < 1 { + StorageVersion::new(1).put::<NisCounterpartBalances>(); + writes += 1; + } + reads += 1; + + // Crowdloan + if Crowdloan::on_chain_storage_version() < 2 { + StorageVersion::new(2).put::<Crowdloan>(); + writes += 1; + } + reads += 1; + + RocksDbWeight::get().reads_writes(reads, writes) + } + } + /// Unreleased migrations. Add new ones here: pub type Unreleased = ( + SetStorageVersions, // Remove UMP dispatch queue <https://github.com/paritytech/polkadot/pull/6271> parachains_configuration::migration::v6::MigrateToV6<Runtime>, ump_migrations::UpdateUmpLimits, diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index be106af2a7a..7c747767620 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -1281,6 +1281,8 @@ pub type Migrations = /// The runtime migrations per release. #[allow(deprecated, missing_docs)] pub mod migrations { + use frame_support::traits::{GetStorageVersion, OnRuntimeUpgrade, StorageVersion}; + use super::*; pub type V0940 = ( @@ -1297,8 +1299,23 @@ pub mod migrations { pallet_offences::migration::v1::MigrateToV1<Runtime>, ); + /// Migrations that set `StorageVersion`s we missed to set. + pub struct SetStorageVersions; + + impl OnRuntimeUpgrade for SetStorageVersions { + fn on_runtime_upgrade() -> Weight { + if FastUnstake::on_chain_storage_version() < 1 { + StorageVersion::new(1).put::<FastUnstake>(); + return RocksDbWeight::get().reads_writes(1, 1) + } + + RocksDbWeight::get().reads(1) + } + } + /// Unreleased migrations. Add new ones here: pub type Unreleased = ( + SetStorageVersions, // Remove UMP dispatch queue <https://github.com/paritytech/polkadot/pull/6271> parachains_configuration::migration::v6::MigrateToV6<Runtime>, ump_migrations::UpdateUmpLimits, -- GitLab