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