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 of UncheckedOnRuntimeUpgrade.
  • 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>

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

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>
where Inner: RefUnwindSafe, Pallet: RefUnwindSafe, Weight: RefUnwindSafe,

§

impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> Send for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
where Inner: Send, Pallet: Send, Weight: Send,

§

impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> Sync for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
where Inner: Sync, Pallet: Sync, Weight: Sync,

§

impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> Unpin for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
where Inner: Unpin, Pallet: Unpin, Weight: Unpin,

§

impl<const FROM: u16, const TO: u16, Inner, Pallet, Weight> UnwindSafe for VersionedMigration<FROM, TO, Inner, Pallet, Weight>
where Inner: UnwindSafe, Pallet: UnwindSafe, Weight: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CheckedConversion for T

source§

fn checked_from<T>(t: T) -> Option<Self>
where Self: TryFrom<T>,

Convert from a value of T into an equivalent instance of Option<Self>. Read more
source§

fn checked_into<T>(self) -> Option<T>
where Self: TryInto<T>,

Consume self to return Some equivalent value of Option<T>. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
source§

impl<T, U> IntoKey<U> for T
where U: FromKey<T>,

source§

fn into_key(self) -> U

source§

impl<T> IsType<T> for T

source§

fn from_ref(t: &T) -> &T

Cast reference.
source§

fn into_ref(&self) -> &T

Cast reference.
source§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
source§

fn into_mut(&mut self) -> &mut T

Cast mutable reference.
source§

impl<T, Outer> IsWrappedBy<Outer> for T
where Outer: AsRef<T> + AsMut<T> + From<T>, T: From<Outer>,

source§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

source§

fn from_mut(outer: &mut Outer) -> &mut T

Get a mutable reference to the inner from the outer.

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatedConversion for T

source§

fn saturated_from<T>(t: T) -> Self
where Self: UniqueSaturatedFrom<T>,

Convert from a value of T into an equivalent instance of Self. Read more
source§

fn saturated_into<T>(self) -> T
where Self: UniqueSaturatedInto<T>,

Consume self to return an equivalent value of T. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoKey<U> for T
where U: TryFromKey<T>,

§

type Error = <U as TryFromKey<T>>::Error

source§

fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>

source§

impl<S, T> UncheckedInto<T> for S
where T: UncheckedFrom<S>,

source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
source§

impl<T, S> UniqueSaturatedInto<T> for S
where T: Bounded, S: TryInto<T>,

source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<T> JsonSchemaMaybe for T

source§

impl<T> MaybeRefUnwindSafe for T
where T: RefUnwindSafe,