diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index a5de197b969d..05b0ca1fc538 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -473,8 +473,20 @@ impl WeightInfo for TestWeightInfo { pub mod pallet { use super::*; + /// The current storage version. + /// + /// v0-v1: + /// v1-v2: + /// v2-v3: + /// v3-v4: + /// v4-v5: + /// + + /// + + /// v5-v6: (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(_); diff --git a/runtime/parachains/src/configuration/migration.rs b/runtime/parachains/src/configuration/migration.rs index c41d4f3055b7..e499854e1188 100644 --- a/runtime/parachains/src/configuration/migration.rs +++ b/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: -/// v1-v2: -/// v2-v3: -/// v3-v4: -/// v4-v5: -/// + -/// + -/// v5-v6: (remove UMP dispatch queue) -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(6); - pub mod v5; pub mod v6; diff --git a/runtime/parachains/src/configuration/migration/v5.rs b/runtime/parachains/src/configuration/migration/v5.rs index f50d1a9d6fc4..6a47ce51f718 100644 --- a/runtime/parachains/src/configuration/migration/v5.rs +++ b/runtime/parachains/src/configuration/migration/v5.rs @@ -262,8 +262,6 @@ impl OnRuntimeUpgrade for MigrateToV5 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade()"); - - ensure!(StorageVersion::get::>() == 4, "The migration requires version 4"); Ok(Vec::new()) } @@ -285,8 +283,8 @@ impl OnRuntimeUpgrade for MigrateToV5 { fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running post_upgrade()"); ensure!( - StorageVersion::get::>() == 5, - "Storage version should be 5 after the migration" + StorageVersion::get::>() >= 5, + "Storage version should be greater or equal to 5 after the migration" ); Ok(()) diff --git a/runtime/parachains/src/configuration/migration/v6.rs b/runtime/parachains/src/configuration/migration/v6.rs index 958d71950e36..67baea10a64d 100644 --- a/runtime/parachains/src/configuration/migration/v6.rs +++ b/runtime/parachains/src/configuration/migration/v6.rs @@ -61,8 +61,6 @@ impl OnRuntimeUpgrade for MigrateToV6 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade()"); - - ensure!(StorageVersion::get::>() == 5, "The migration requires version 4"); Ok(Vec::new()) } @@ -84,8 +82,8 @@ impl OnRuntimeUpgrade for MigrateToV6 { fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running post_upgrade()"); ensure!( - StorageVersion::get::>() == 6, - "Storage version should be 6 after the migration" + StorageVersion::get::>() >= 6, + "Storage version should be >= 6 after the migration" ); Ok(()) diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 187efaabbd84..a0b05aef8d9a 100644 --- a/runtime/rococo/src/lib.rs +++ b/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, ); + /// 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::(); + writes += 1; + } + reads += 1; + + // Technical Committee + if TechnicalCommittee::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::(); + writes += 1; + } + reads += 1; + + // PhragmenElection + if PhragmenElection::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::(); + writes += 1; + } + reads += 1; + + // TechnicalMembership + if TechnicalMembership::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::(); + writes += 1; + } + reads += 1; + + // Scheduler + if Scheduler::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::(); + writes += 1; + } + reads += 1; + + // Bounties + if Bounties::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::(); + writes += 1; + } + reads += 1; + + // Tips + if Tips::on_chain_storage_version() < 4 { + StorageVersion::new(4).put::(); + writes += 1; + } + reads += 1; + + // NisCounterpartBalances + if NisCounterpartBalances::on_chain_storage_version() < 1 { + StorageVersion::new(1).put::(); + writes += 1; + } + reads += 1; + + // Crowdloan + if Crowdloan::on_chain_storage_version() < 2 { + StorageVersion::new(2).put::(); + writes += 1; + } + reads += 1; + + RocksDbWeight::get().reads_writes(reads, writes) + } + } + /// Unreleased migrations. Add new ones here: pub type Unreleased = ( + SetStorageVersions, // Remove UMP dispatch queue parachains_configuration::migration::v6::MigrateToV6, ump_migrations::UpdateUmpLimits, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index be106af2a7ad..7c7477676201 100644 --- a/runtime/westend/src/lib.rs +++ b/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, ); + /// 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::(); + 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 parachains_configuration::migration::v6::MigrateToV6, ump_migrations::UpdateUmpLimits,