domain_pallet_executive/
migrations.rsuse event_segments_migration::EventSegments;
use frame_support::traits::{Get, OnRuntimeUpgrade};
use frame_support::weights::Weight;
use frame_system::pallet::Config;
use frame_system::{EventRecord, Pallet as System};
pub struct StorageCheckedMigrateToEventSegments<T>(sp_std::marker::PhantomData<T>);
impl<T: Config> OnRuntimeUpgrade for StorageCheckedMigrateToEventSegments<T> {
fn on_runtime_upgrade() -> Weight {
if System::<T>::uncleared_event_count() > 0 && EventSegments::<T>::get(0).is_none() {
let weights = frame_system::migrations::migrate_from_events_to_event_segments::<T>();
weights + T::DbWeight::get().reads(2)
} else {
T::DbWeight::get().reads(2)
}
}
}
pub(super) mod event_segments_migration {
use super::{Config, EventRecord, System};
use frame_support::pallet_prelude::{OptionQuery, ValueQuery};
use frame_support::{storage_alias, Identity};
#[cfg(not(feature = "std"))]
use sp_std::boxed::Box;
#[cfg(not(feature = "std"))]
use sp_std::vec::Vec;
use core::primitive::u32 as EventIndex;
#[storage_alias]
pub(super) type Events<T: Config> = StorageValue<
System<T>,
Vec<
Box<
EventRecord<
<T as frame_system::Config>::RuntimeEvent,
<T as frame_system::Config>::Hash,
>,
>,
>,
ValueQuery,
>;
#[storage_alias]
pub(super) type EventSegments<T: Config> = StorageMap<
System<T>,
Identity,
EventIndex,
Vec<
Box<
EventRecord<
<T as frame_system::Config>::RuntimeEvent,
<T as frame_system::Config>::Hash,
>,
>,
>,
OptionQuery,
>;
#[storage_alias]
pub(super) type UnclearedEventCount<T: Config> =
StorageValue<System<T>, EventIndex, ValueQuery>;
}
#[cfg(test)]
mod tests {
use super::event_segments_migration::{Events, UnclearedEventCount};
use super::*;
use crate::mock::{new_test_ext, MockRuntime, RuntimeEvent};
use frame_support::weights::RuntimeDbWeight;
#[test]
fn test_system_event_segments_storage_migration() {
let event = Box::new(EventRecord {
phase: Default::default(),
event: RuntimeEvent::System(frame_system::Event::CodeUpdated),
topics: Default::default(),
});
let mut ext = new_test_ext();
ext.execute_with(|| {
UnclearedEventCount::<MockRuntime>::put(1);
});
ext.commit_all().unwrap();
ext.execute_with(|| {
let weights = StorageCheckedMigrateToEventSegments::<MockRuntime>::on_runtime_upgrade();
let db_weights: RuntimeDbWeight =
<MockRuntime as frame_system::Config>::DbWeight::get();
assert_eq!(weights, db_weights.reads_writes(2, 2));
assert_eq!(Events::<MockRuntime>::get(), Vec::new());
assert_eq!(EventSegments::<MockRuntime>::get(0), None);
assert_eq!(UnclearedEventCount::<MockRuntime>::get(), 0);
});
let mut ext = new_test_ext();
ext.execute_with(|| {
let weights = StorageCheckedMigrateToEventSegments::<MockRuntime>::on_runtime_upgrade();
let db_weights: RuntimeDbWeight =
<MockRuntime as frame_system::Config>::DbWeight::get();
assert_eq!(weights, db_weights.reads_writes(2, 0));
assert_eq!(Events::<MockRuntime>::get(), Vec::new());
assert_eq!(EventSegments::<MockRuntime>::get(0), None);
assert_eq!(UnclearedEventCount::<MockRuntime>::get(), 0);
});
let mut ext = new_test_ext();
ext.execute_with(|| {
EventSegments::<MockRuntime>::set(0, Some(vec![event.clone()]));
UnclearedEventCount::<MockRuntime>::put(1);
});
ext.commit_all().unwrap();
ext.execute_with(|| {
let weights = StorageCheckedMigrateToEventSegments::<MockRuntime>::on_runtime_upgrade();
let db_weights: RuntimeDbWeight =
<MockRuntime as frame_system::Config>::DbWeight::get();
assert_eq!(weights, db_weights.reads_writes(2, 0));
assert_eq!(Events::<MockRuntime>::get(), Vec::new());
assert_eq!(
EventSegments::<MockRuntime>::get(0),
Some(vec![event.clone()])
);
assert_eq!(UnclearedEventCount::<MockRuntime>::get(), 1);
});
let mut ext = new_test_ext();
ext.execute_with(|| {
EventSegments::<MockRuntime>::set(0, Some(vec![event.clone()]));
});
ext.commit_all().unwrap();
ext.execute_with(|| {
let weights = StorageCheckedMigrateToEventSegments::<MockRuntime>::on_runtime_upgrade();
let db_weights: RuntimeDbWeight =
<MockRuntime as frame_system::Config>::DbWeight::get();
assert_eq!(weights, db_weights.reads_writes(2, 0));
assert_eq!(Events::<MockRuntime>::get(), Vec::new());
assert_eq!(EventSegments::<MockRuntime>::get(0), Some(vec![event]));
assert_eq!(UnclearedEventCount::<MockRuntime>::get(), 0);
});
}
}