Struct frame_support::migrations::VersionedMigration
source · pub struct VersionedMigration<const FROM: u16, const TO: u16, Inner, Pallet, Weight> { /* private fields */ }
Expand description
Handles storage migration pallet versioning.
VersionedMigration
allows developers to write migrations without worrying about checking and
setting storage versions. Instead, the developer wraps their migration in this struct which
takes care of version handling using best practices.
It takes 5 type parameters:
From
: The version being upgraded from.To
: The version being upgraded to.Inner
: An implementation ofUncheckedOnRuntimeUpgrade
.Pallet
: The Pallet being upgraded.Weight
: The runtime’s RuntimeDbWeight implementation.
When a VersionedMigration
on_runtime_upgrade
, pre_upgrade
, or post_upgrade
method is
called, the on-chain version of the pallet is compared to From
. If they match, the Inner
UncheckedOnRuntimeUpgrade
is called and the pallets on-chain version is set to To
after the migration. Otherwise, a warning is logged notifying the developer that the upgrade was
a noop and should probably be removed.
By not bounding Inner
with OnRuntimeUpgrade
, we prevent developers from
accidentally using the unchecked version of the migration in a runtime upgrade instead of
VersionedMigration
.
§Examples
// In file defining migrations
/// Private module containing *version unchecked* migration logic.
///
/// Should only be used by the [`VersionedMigration`] type in this module to create something to
/// export.
///
/// We keep this private so the unversioned migration cannot accidentally be used in any runtimes.
///
/// For more about this pattern of keeping items private, see
/// - https://github.com/rust-lang/rust/issues/30905
/// - https://internals.rust-lang.org/t/lang-team-minutes-private-in-public-rules/4504/40
mod version_unchecked {
use super::*;
pub struct VersionUncheckedMigrateV5ToV6<T>(sp_std::marker::PhantomData<T>);
impl<T: Config> UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV5ToV6<T> {
// `UncheckedOnRuntimeUpgrade` implementation...
}
}
pub type MigrateV5ToV6<T, I> =
VersionedMigration<
5,
6,
VersionUncheckedMigrateV5ToV6<T, I>,
crate::pallet::Pallet<T, I>,
<T as frame_system::Config>::DbWeight
>;
// Migrations tuple to pass to the Executive pallet:
pub type Migrations = (
// other migrations...
MigrateV5ToV6<T, ()>,
// other migrations...
);
Trait Implementations§
source§impl<const FROM: u16, const TO: u16, Inner: UncheckedOnRuntimeUpgrade, Pallet: GetStorageVersion<InCodeStorageVersion = StorageVersion> + PalletInfoAccess, DbWeight: Get<RuntimeDbWeight>> OnRuntimeUpgrade for VersionedMigration<FROM, TO, Inner, Pallet, DbWeight>
impl<const FROM: u16, const TO: u16, Inner: UncheckedOnRuntimeUpgrade, Pallet: GetStorageVersion<InCodeStorageVersion = StorageVersion> + PalletInfoAccess, DbWeight: Get<RuntimeDbWeight>> OnRuntimeUpgrade for VersionedMigration<FROM, TO, Inner, Pallet, DbWeight>
Implementation of the OnRuntimeUpgrade
trait for VersionedMigration
.
Its main function is to perform the runtime upgrade in on_runtime_upgrade
only if the on-chain
version of the pallets storage matches From
, and after the upgrade set the on-chain storage to
To
. If the versions do not match, it writes a log notifying the developer that the migration
is a noop.
source§fn on_runtime_upgrade() -> Weight
fn on_runtime_upgrade() -> Weight
Executes the versioned runtime upgrade.
First checks if the pallets on-chain storage version matches the version of this upgrade. If
it matches, it calls Inner::on_runtime_upgrade
, updates the on-chain version, and returns
the weight. If it does not match, it writes a log notifying the developer that the migration
is a noop.
Auto Trait Implementations§
impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> Freeze for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> RefUnwindSafe for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> Send for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> Sync for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> Unpin for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> UnwindSafe for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read moresource§impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
type Error = <U as TryFromKey<T>>::Error
fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>
source§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.source§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.