cumulus_pallet_parachain_system/
migration.rs1use crate::{
18 Config, LastProcessedHrmpMessage, Pallet, ReservedDmpWeightOverride, ReservedXcmpWeightOverride,
19};
20use frame_support::{
21 pallet_prelude::*,
22 traits::{Get, OnRuntimeUpgrade, StorageVersion},
23 weights::Weight,
24};
25
26pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(4);
28
29pub use v4::MigrateV3ToV4;
30
31pub mod v4 {
33 use super::*;
34 use crate::parachain_inherent::{InboundHrmpMessageId, InboundMessageId};
35 use frame_support::traits::UncheckedOnRuntimeUpgrade;
36
37 mod unversioned {
38 use super::*;
39
40 pub struct UncheckedMigrateV3ToV4<T: Config>(PhantomData<T>);
41 }
42
43 impl<T: Config> UncheckedOnRuntimeUpgrade for unversioned::UncheckedMigrateV3ToV4<T> {
44 fn on_runtime_upgrade() -> frame_support::weights::Weight {
45 let result =
46 LastProcessedHrmpMessage::<T>::translate(|maybe_pre: Option<InboundMessageId>| {
47 maybe_pre.map(|pre| InboundHrmpMessageId::Generic(pre))
48 });
49 if result.is_err() {
50 log::error!(
51 target: "parachain_system",
52 "unexpected error when performing translation of the LastProcessedHrmpMessage to the new InboundMessageId type"
53 );
54 }
55
56 T::DbWeight::get().reads_writes(1, 1)
57 }
58 }
59
60 pub type MigrateV3ToV4<T> = frame_support::migrations::VersionedMigration<
63 3,
64 4,
65 unversioned::UncheckedMigrateV3ToV4<T>,
66 Pallet<T>,
67 <T as frame_system::Config>::DbWeight,
68 >;
69}
70
71pub mod v3 {
72 use super::*;
73 use crate::parachain_inherent::InboundMessageId;
74
75 #[frame_support::storage_alias]
76 pub type LastProcessedHrmpMessage<T: Config> = StorageValue<Pallet<T>, InboundMessageId>;
77
78 pub struct Migration<T: Config>(PhantomData<T>);
80
81 impl<T: Config> OnRuntimeUpgrade for Migration<T> {
82 fn on_runtime_upgrade() -> Weight {
83 let mut weight: Weight = T::DbWeight::get().reads(2);
84
85 if StorageVersion::get::<Pallet<T>>() == 0 {
86 weight = weight
87 .saturating_add(v1::migrate::<T>())
88 .saturating_add(T::DbWeight::get().writes(1));
89 StorageVersion::new(1).put::<Pallet<T>>();
90 }
91
92 if StorageVersion::get::<Pallet<T>>() == 1 {
93 weight = weight
94 .saturating_add(v2::migrate::<T>())
95 .saturating_add(T::DbWeight::get().writes(1));
96 StorageVersion::new(2).put::<Pallet<T>>();
97 }
98
99 if StorageVersion::get::<Pallet<T>>() == 2 {
100 crate::PoVMessagesTracker::<T>::kill();
102 weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 1));
103 StorageVersion::new(3).put::<Pallet<T>>();
104 }
105
106 weight
107 }
108 }
109}
110
111mod v2 {
113 use super::*;
114 const DEFAULT_POV_SIZE: u64 = 64 * 1024; pub fn migrate<T: Config>() -> Weight {
117 let translate = |pre: u64| -> Weight { Weight::from_parts(pre, DEFAULT_POV_SIZE) };
118
119 if ReservedXcmpWeightOverride::<T>::translate(|pre| pre.map(translate)).is_err() {
120 log::error!(
121 target: "parachain_system",
122 "unexpected error when performing translation of the ReservedXcmpWeightOverride type during storage upgrade to v2"
123 );
124 }
125
126 if ReservedDmpWeightOverride::<T>::translate(|pre| pre.map(translate)).is_err() {
127 log::error!(
128 target: "parachain_system",
129 "unexpected error when performing translation of the ReservedDmpWeightOverride type during storage upgrade to v2"
130 );
131 }
132
133 T::DbWeight::get().reads_writes(2, 2)
134 }
135}
136
137mod v1 {
140 use crate::{Config, Pallet};
141 use frame_support::{migration::clear_storage_prefix, pallet_prelude::*};
142
143 pub fn migrate<T: Config>() -> Weight {
144 let _ =
145 clear_storage_prefix(<Pallet<T>>::name().as_bytes(), b"LastUpgrade", b"", None, None);
146 T::DbWeight::get().writes(1)
147 }
148}
149
150#[cfg(all(feature = "try-runtime", test))]
151mod tests {
152 use super::*;
153 use crate::{
154 mock::{new_test_ext, Test},
155 parachain_inherent::{InboundHrmpMessageId, InboundMessageId},
156 };
157 use frame_support::traits::OnRuntimeUpgrade;
158
159 #[test]
160 #[allow(deprecated)]
161 fn test_migrate_v3_to_v4() {
162 new_test_ext().execute_with(|| {
163 let storage_version = StorageVersion::new(3);
165 storage_version.put::<Pallet<Test>>();
166 frame_support::storage::unhashed::kill(
167 &v3::LastProcessedHrmpMessage::<Test>::hashed_key(),
168 );
169 let bytes = v4::MigrateV3ToV4::<Test>::pre_upgrade();
170 assert!(bytes.is_ok());
171 v4::MigrateV3ToV4::<Test>::on_runtime_upgrade();
172 assert!(v4::MigrateV3ToV4::<Test>::post_upgrade(bytes.unwrap()).is_ok());
173 let post = crate::LastProcessedHrmpMessage::<Test>::get();
174 assert_eq!(post, None);
175
176 let storage_version = StorageVersion::new(3);
178 storage_version.put::<Pallet<Test>>();
179 let pre = InboundMessageId { sent_at: 321, reverse_idx: 123 };
180 frame_support::storage::unhashed::put_raw(
181 &v3::LastProcessedHrmpMessage::<Test>::hashed_key(),
182 &pre.encode(),
183 );
184 let bytes = v4::MigrateV3ToV4::<Test>::pre_upgrade();
185 assert!(bytes.is_ok());
186 v4::MigrateV3ToV4::<Test>::on_runtime_upgrade();
187 assert!(v4::MigrateV3ToV4::<Test>::post_upgrade(bytes.unwrap()).is_ok());
188 let post = crate::LastProcessedHrmpMessage::<Test>::get();
189 assert_eq!(post, Some(InboundHrmpMessageId::Generic(pre)));
190 });
191 }
192}