cumulus_pallet_dmp_queue/
migration.rs1use crate::*;
20use alloc::vec::Vec;
21use cumulus_primitives_core::relay_chain::BlockNumber as RelayBlockNumber;
22use frame_support::{pallet_prelude::*, storage_alias, traits::HandleMessage};
23
24pub(crate) const LOG: &str = "runtime::dmp-queue-export-xcms";
25
26#[derive(Copy, Clone, Eq, PartialEq, Default, Encode, Decode, RuntimeDebug, TypeInfo)]
28pub struct PageIndexData {
29 pub begin_used: PageCounter,
31 pub end_used: PageCounter,
33 pub overweight_count: OverweightIndex,
35}
36
37pub type OverweightIndex = u64;
39pub type PageCounter = u32;
41
42#[storage_alias]
44pub type PageIndex<T: Config> = StorageValue<Pallet<T>, PageIndexData, ValueQuery>;
45
46#[storage_alias]
48pub type Pages<T: Config> = StorageMap<
49 Pallet<T>,
50 Blake2_128Concat,
51 PageCounter,
52 Vec<(RelayBlockNumber, Vec<u8>)>,
53 ValueQuery,
54>;
55
56#[storage_alias]
58pub type Overweight<T: Config> = CountedStorageMap<
59 Pallet<T>,
60 Blake2_128Concat,
61 OverweightIndex,
62 (RelayBlockNumber, Vec<u8>),
63 OptionQuery,
64>;
65
66pub(crate) mod testing_only {
67 use super::*;
68
69 #[storage_alias]
73 pub type Configuration<T: Config> = StorageValue<Pallet<T>, u32>;
74}
75
76pub(crate) fn migrate_page<T: crate::Config>(p: PageCounter) -> Result<(), ()> {
78 let page = Pages::<T>::take(p);
79 log::debug!(target: LOG, "Migrating page #{p} with {} messages ...", page.len());
80 if page.is_empty() {
81 log::error!(target: LOG, "Page #{p}: EMPTY - storage corrupted?");
82 return Err(())
83 }
84
85 for (m, (block, msg)) in page.iter().enumerate() {
86 let Ok(bound) = BoundedVec::<u8, _>::try_from(msg.clone()) else {
87 log::error!(target: LOG, "[Page {p}] Message #{m}: TOO LONG - dropping");
88 continue
89 };
90
91 T::DmpSink::handle_message(bound.as_bounded_slice());
92 log::debug!(target: LOG, "[Page {p}] Migrated message #{m} from block {block}");
93 }
94
95 Ok(())
96}
97
98pub(crate) fn migrate_overweight<T: crate::Config>(i: OverweightIndex) -> Result<(), ()> {
100 let Some((block, msg)) = Overweight::<T>::take(i) else {
101 log::error!(target: LOG, "[Overweight {i}] Message: EMPTY - storage corrupted?");
102 return Err(())
103 };
104 let Ok(bound) = BoundedVec::<u8, _>::try_from(msg) else {
105 log::error!(target: LOG, "[Overweight {i}] Message: TOO LONG - dropping");
106 return Err(())
107 };
108
109 T::DmpSink::handle_message(bound.as_bounded_slice());
110 log::debug!(target: LOG, "[Overweight {i}] Migrated message from block {block}");
111
112 Ok(())
113}