|
17 | 17 | // If you feel like getting in touch with us, you can do so at info@botlabs.org
|
18 | 18 |
|
19 | 19 | use frame_support::{
|
20 |
| - pallet_prelude::StorageVersion, |
21 |
| - traits::{GetStorageVersion, OnRuntimeUpgrade}, |
| 20 | + traits::{GetStorageVersion, OnRuntimeUpgrade, PalletInfoAccess, StorageVersion}, |
22 | 21 | weights::Weight,
|
23 | 22 | };
|
24 | 23 | use sp_core::Get;
|
25 |
| -use sp_std::marker::PhantomData; |
| 24 | +use sp_std::{fmt::Debug, marker::PhantomData}; |
| 25 | +use sp_weights::RuntimeDbWeight; |
26 | 26 |
|
27 | 27 | const LOG_TARGET: &str = "migration::BumpStorageVersion";
|
28 | 28 |
|
29 | 29 | /// There are some pallets without a storage version.
|
30 | 30 | /// Based on the changes in the PR <https://github.com/paritytech/substrate/pull/13417>,
|
31 | 31 | /// pallets without a storage version or with a wrong version throw an error
|
32 | 32 | /// in the try state tests.
|
33 |
| -pub struct BumpStorageVersion<T>(PhantomData<T>); |
34 |
| - |
35 |
| -const TARGET_PALLET_ASSETS_STORAGE_VERSION: StorageVersion = StorageVersion::new(1); |
| 33 | +pub struct BumpStorageVersion<T, W>(PhantomData<(T, W)>) |
| 34 | +where |
| 35 | + T: GetStorageVersion + PalletInfoAccess, |
| 36 | + T::CurrentStorageVersion: Debug + Into<StorageVersion>, |
| 37 | + StorageVersion: PartialOrd<T::CurrentStorageVersion>, |
| 38 | + W: Get<RuntimeDbWeight>; |
36 | 39 |
|
37 |
| -impl<T> OnRuntimeUpgrade for BumpStorageVersion<T> |
| 40 | +impl<T, W> OnRuntimeUpgrade for BumpStorageVersion<T, W> |
38 | 41 | where
|
39 |
| - T: pallet_assets::Config, |
| 42 | + T: GetStorageVersion + PalletInfoAccess, |
| 43 | + T::CurrentStorageVersion: Debug + Into<StorageVersion>, |
| 44 | + StorageVersion: PartialOrd<T::CurrentStorageVersion>, |
| 45 | + W: Get<RuntimeDbWeight>, |
40 | 46 | {
|
41 | 47 | #[cfg(feature = "try-runtime")]
|
42 | 48 | fn pre_upgrade() -> Result<sp_std::vec::Vec<u8>, sp_runtime::TryRuntimeError> {
|
43 |
| - if pallet_assets::Pallet::<T>::on_chain_storage_version() < TARGET_PALLET_ASSETS_STORAGE_VERSION { |
44 |
| - log::trace!(target: LOG_TARGET, "pallet_assets to be migrated to v1."); |
| 49 | + let (on_chain_version, current_version) = (T::on_chain_storage_version(), T::current_storage_version()); |
| 50 | + let pallet_name = T::name(); |
| 51 | + if on_chain_version < current_version { |
| 52 | + log::trace!(target: LOG_TARGET, "Pallet {:?} to be migrated from version {:?} to version {:?}.", pallet_name, on_chain_version, current_version); |
45 | 53 | } else {
|
46 |
| - log::trace!(target: LOG_TARGET, "pallet_assets already on v1. No migration will run."); |
| 54 | + log::trace!(target: LOG_TARGET, "Pallet {:?} already on latest version {:?}. No migration will run.", pallet_name, current_version); |
47 | 55 | }
|
48 | 56 | Ok([].into())
|
49 | 57 | }
|
50 | 58 |
|
51 | 59 | fn on_runtime_upgrade() -> Weight {
|
52 | 60 | log::info!(target: LOG_TARGET, "Initiating migration.");
|
53 | 61 |
|
54 |
| - if pallet_assets::Pallet::<T>::on_chain_storage_version() < TARGET_PALLET_ASSETS_STORAGE_VERSION { |
55 |
| - log::info!(target: LOG_TARGET, "pallet_assets to be migrated to v1."); |
56 |
| - TARGET_PALLET_ASSETS_STORAGE_VERSION.put::<pallet_assets::Pallet<T>>(); |
57 |
| - <T as frame_system::Config>::DbWeight::get().reads_writes(1, 1) |
| 62 | + let (on_chain_version, current_version) = (T::on_chain_storage_version(), T::current_storage_version()); |
| 63 | + let pallet_name = T::name(); |
| 64 | + |
| 65 | + if on_chain_version < current_version { |
| 66 | + log::trace!(target: LOG_TARGET, "Pallet {:?} to be migrated from version {:?} to version {:?}.", pallet_name, on_chain_version, current_version); |
| 67 | + current_version.into().put::<T>(); |
| 68 | + W::get().reads_writes(1, 1) |
58 | 69 | } else {
|
59 |
| - log::info!(target: LOG_TARGET, "pallet_assets already on v1. No migration will run."); |
60 |
| - <T as frame_system::Config>::DbWeight::get().reads(1) |
| 70 | + log::trace!(target: LOG_TARGET, "Pallet {:?} already on latest version {:?}. No migration will run.", pallet_name, current_version); |
| 71 | + W::get().reads(1) |
61 | 72 | }
|
62 | 73 | }
|
63 | 74 |
|
64 | 75 | #[cfg(feature = "try-runtime")]
|
65 | 76 | fn post_upgrade(_state: sp_std::vec::Vec<u8>) -> Result<(), sp_runtime::TryRuntimeError> {
|
66 |
| - if pallet_assets::Pallet::<T>::on_chain_storage_version() < TARGET_PALLET_ASSETS_STORAGE_VERSION { |
| 77 | + let (on_chain_version, current_version) = (T::on_chain_storage_version(), T::current_storage_version()); |
| 78 | + |
| 79 | + if on_chain_version < current_version { |
| 80 | + log::error!(target: LOG_TARGET, "Storage version for pallet {:?} was not updated to the latest version {:?}.", T::name(), current_version); |
67 | 81 | Err(sp_runtime::TryRuntimeError::Other(
|
68 |
| - "pallet_assets storage version was not updated to v1.", |
| 82 | + "Pallet storage version was not updated to the latest version.", |
69 | 83 | ))
|
70 | 84 | } else {
|
71 | 85 | Ok(())
|
|
0 commit comments