mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 05:51:02 +00:00
Better identifier and logging for runtime upgrades (#8123)
* A clean new attempt * Checkpoint to move remote. * A lot of dependency wiring to make it feature gated. * bad macro, bad macro. * Undo the DB mess. * Update frame/support/src/traits.rs Co-authored-by: Alexander Popiak <alexander.popiak@parity.io> * Apply suggestions from code review Co-authored-by: Alexander Popiak <alexander.popiak@parity.io> * unbreak the build * Better logging and ids for migrations * Fix doc. * Test * Update frame/try-runtime/src/lib.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update utils/frame/try-runtime/cli/Cargo.toml Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> * Update frame/try-runtime/Cargo.toml Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> * Address most review grumbles. * Fix build * Add some comments * Remove allowing one pallet at a time. * Rework the PR * nit * Slightly better error handling. * Remove files * Update utils/frame/remote-externalities/src/lib.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update frame/support/src/dispatch.rs * Update frame/support/src/dispatch.rs * Fix test * Make extension trait. * Bring back try-runtime/std * remove bincode * Remove warning * Change test features Co-authored-by: Alexander Popiak <alexander.popiak@parity.io> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com>
This commit is contained in:
@@ -80,18 +80,18 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// // FRAME pallets.
|
||||
/// #[weight = 0]
|
||||
/// fn my_function(origin, var: u64) -> dispatch::DispatchResult {
|
||||
/// // Your implementation
|
||||
/// Ok(())
|
||||
/// // Your implementation
|
||||
/// Ok(())
|
||||
/// }
|
||||
///
|
||||
/// // Public functions are both dispatchable and available to other
|
||||
/// // Public functions are both dispatchable and available to other
|
||||
/// // FRAME pallets.
|
||||
/// #[weight = 0]
|
||||
/// pub fn my_public_function(origin) -> dispatch::DispatchResult {
|
||||
/// pub fn my_public_function(origin) -> dispatch::DispatchResult {
|
||||
/// // Your implementation
|
||||
/// Ok(())
|
||||
/// Ok(())
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// # fn main() {}
|
||||
/// ```
|
||||
@@ -99,8 +99,10 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// The declaration is set with the header where:
|
||||
///
|
||||
/// * `Module`: The struct generated by the macro, with type `Config`.
|
||||
/// * `Call`: The enum generated for every pallet, which implements [`Callable`](./dispatch/trait.Callable.html).
|
||||
/// * `origin`: Alias of `T::Origin`, declared by the [`impl_outer_origin!`](./macro.impl_outer_origin.html) macro.
|
||||
/// * `Call`: The enum generated for every pallet, which implements
|
||||
/// [`Callable`](./dispatch/trait.Callable.html).
|
||||
/// * `origin`: Alias of `T::Origin`, declared by the
|
||||
/// [`impl_outer_origin!`](./macro.impl_outer_origin.html) macro.
|
||||
/// * `Result`: The expected return type from pallet functions.
|
||||
///
|
||||
/// The first parameter of dispatchable functions must always be `origin`.
|
||||
@@ -119,15 +121,15 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// pub struct Module<T: Config> for enum Call where origin: T::Origin {
|
||||
/// #[weight = 0]
|
||||
/// fn my_long_function(origin) -> dispatch::DispatchResult {
|
||||
/// // Your implementation
|
||||
/// // Your implementation
|
||||
/// Ok(())
|
||||
/// }
|
||||
///
|
||||
/// #[weight = 0]
|
||||
/// fn my_short_function(origin) {
|
||||
/// // Your implementation
|
||||
/// // Your implementation
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// # fn main() {}
|
||||
/// ```
|
||||
@@ -184,7 +186,7 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// #[weight = 0]
|
||||
/// #[transactional]
|
||||
/// fn my_short_function(origin) {
|
||||
/// // Your implementation
|
||||
/// // Your implementation
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
@@ -203,12 +205,12 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// decl_module! {
|
||||
/// pub struct Module<T: Config> for enum Call where origin: T::Origin {
|
||||
/// #[weight = 0]
|
||||
/// fn my_privileged_function(origin) -> dispatch::DispatchResult {
|
||||
/// fn my_privileged_function(origin) -> dispatch::DispatchResult {
|
||||
/// ensure_root(origin)?;
|
||||
/// // Your implementation
|
||||
/// // Your implementation
|
||||
/// Ok(())
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// # fn main() {}
|
||||
/// ```
|
||||
@@ -218,15 +220,17 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// Attributes on functions are supported, but must be in the order of:
|
||||
/// 1. Optional #\[doc\] attribute.
|
||||
/// 2. #\[weight\] attribute.
|
||||
/// 3. Optional function attributes, for instance #\[transactional\]. Those function attributes will be written
|
||||
/// only on the dispatchable functions implemented on `Module`, not on the `Call` enum variant.
|
||||
/// 3. Optional function attributes, for instance #\[transactional\]. Those function attributes will
|
||||
/// be written only on the dispatchable functions implemented on `Module`, not on the `Call` enum
|
||||
/// variant.
|
||||
///
|
||||
/// ## Multiple Module Instances Example
|
||||
///
|
||||
/// A Substrate module can be built such that multiple instances of the same module can be used within a single
|
||||
/// runtime. For example, the [Balances module](../pallet_balances/index.html) can be added multiple times to your
|
||||
/// runtime in order to support multiple, independent currencies for your blockchain. Here is an example of how
|
||||
/// you would declare such a module using the `decl_module!` macro:
|
||||
/// A Substrate module can be built such that multiple instances of the same module can be used
|
||||
/// within a single runtime. For example, the [Balances module](../pallet_balances/index.html) can
|
||||
/// be added multiple times to your runtime in order to support multiple, independent currencies for
|
||||
/// your blockchain. Here is an example of how you would declare such a module using the
|
||||
/// `decl_module!` macro:
|
||||
///
|
||||
/// ```
|
||||
/// # #[macro_use]
|
||||
@@ -251,10 +255,10 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
///
|
||||
/// ## Where clause
|
||||
///
|
||||
/// Besides the default `origin: T::Origin`, you can also pass other bounds to the module declaration.
|
||||
/// This where bound will be replicated to all types generated by this macro. The chaining of multiple
|
||||
/// trait bounds with `+` is not supported. If multiple bounds for one type are required, it needs to
|
||||
/// be split up into multiple bounds.
|
||||
/// Besides the default `origin: T::Origin`, you can also pass other bounds to the module
|
||||
/// declaration. This where bound will be replicated to all types generated by this macro. The
|
||||
/// chaining of multiple trait bounds with `+` is not supported. If multiple bounds for one type are
|
||||
/// required, it needs to be split up into multiple bounds.
|
||||
///
|
||||
/// ```
|
||||
/// # #[macro_use]
|
||||
@@ -276,16 +280,18 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// The following are reserved function signatures:
|
||||
///
|
||||
/// * `deposit_event`: Helper function for depositing an [event](https://docs.substrate.dev/docs/event-enum).
|
||||
/// The default behavior is to call `deposit_event` from the [System module](../frame_system/index.html).
|
||||
/// However, you can write your own implementation for events in your runtime. To use the default behavior,
|
||||
/// add `fn deposit_event() = default;` to your `Module`.
|
||||
/// The default behavior is to call `deposit_event` from the [System
|
||||
/// module](../frame_system/index.html). However, you can write your own implementation for events
|
||||
/// in your runtime. To use the default behavior, add `fn deposit_event() = default;` to your
|
||||
/// `Module`.
|
||||
///
|
||||
/// The following reserved functions also take the block number (with type `T::BlockNumber`) as an optional input:
|
||||
/// The following reserved functions also take the block number (with type `T::BlockNumber`) as an
|
||||
/// optional input:
|
||||
///
|
||||
/// * `on_runtime_upgrade`: Executes at the beginning of a block prior to on_initialize when there
|
||||
/// is a runtime upgrade. This allows each module to upgrade its storage before the storage items are used.
|
||||
/// As such, **calling other modules must be avoided**!! Using this function will implement the
|
||||
/// [`OnRuntimeUpgrade`](../sp_runtime/traits/trait.OnRuntimeUpgrade.html) trait.
|
||||
/// is a runtime upgrade. This allows each module to upgrade its storage before the storage items
|
||||
/// are used. As such, **calling other modules must be avoided**!! Using this function will
|
||||
/// implement the [`OnRuntimeUpgrade`](../sp_runtime/traits/trait.OnRuntimeUpgrade.html) trait.
|
||||
/// Function signature must be `fn on_runtime_upgrade() -> frame_support::weights::Weight`.
|
||||
///
|
||||
/// * `on_initialize`: Executes at the beginning of a block. Using this function will
|
||||
@@ -300,11 +306,11 @@ impl<T> Parameter for T where T: Codec + EncodeLike + Clone + Eq + fmt::Debug {}
|
||||
/// * `fn on_finalize(n: BlockNumber) -> frame_support::weights::Weight` or
|
||||
/// * `fn on_finalize() -> frame_support::weights::Weight`
|
||||
///
|
||||
/// * `offchain_worker`: Executes at the beginning of a block and produces extrinsics for a future block
|
||||
/// upon completion. Using this function will implement the
|
||||
/// * `offchain_worker`: Executes at the beginning of a block and produces extrinsics for a future
|
||||
/// block upon completion. Using this function will implement the
|
||||
/// [`OffchainWorker`](./traits/trait.OffchainWorker.html) trait.
|
||||
/// * `integrity_test`: Executes in a test generated by `construct_runtime`, note it doesn't
|
||||
/// execute in an externalities-provided environment. Implement
|
||||
/// * `integrity_test`: Executes in a test generated by `construct_runtime`, note it doesn't execute
|
||||
/// in an externalities-provided environment. Implement
|
||||
/// [`IntegrityTest`](./trait.IntegrityTest.html) trait.
|
||||
#[macro_export]
|
||||
macro_rules! decl_module {
|
||||
@@ -1325,13 +1331,27 @@ macro_rules! decl_module {
|
||||
$crate::sp_tracing::enter_span!($crate::sp_tracing::trace_span!("on_runtime_upgrade"));
|
||||
let result: $return = (|| { $( $impl )* })();
|
||||
|
||||
$crate::crate_to_pallet_version!()
|
||||
let new_storage_version = $crate::crate_to_pallet_version!();
|
||||
new_storage_version
|
||||
.put_into_storage::<<$trait_instance as $system::Config>::PalletInfo, Self>();
|
||||
|
||||
let additional_write = <
|
||||
<$trait_instance as $system::Config>::DbWeight as $crate::traits::Get<_>
|
||||
>::get().writes(1);
|
||||
|
||||
let pallet_name = <<
|
||||
$trait_instance
|
||||
as
|
||||
$system::Config
|
||||
>::PalletInfo as $crate::traits::PalletInfo>::name::<Self>().expect("pallet will have name in the runtime; qed");
|
||||
|
||||
$crate::debug::info!(
|
||||
target: $crate::LOG_TARGET,
|
||||
"⚠️ running migration for {} and setting new storage version to {:?}",
|
||||
pallet_name,
|
||||
new_storage_version,
|
||||
);
|
||||
|
||||
result.saturating_add(additional_write)
|
||||
}
|
||||
|
||||
@@ -1359,9 +1379,23 @@ macro_rules! decl_module {
|
||||
fn on_runtime_upgrade() -> $crate::dispatch::Weight {
|
||||
$crate::sp_tracing::enter_span!($crate::sp_tracing::trace_span!("on_runtime_upgrade"));
|
||||
|
||||
$crate::crate_to_pallet_version!()
|
||||
let new_storage_version = $crate::crate_to_pallet_version!();
|
||||
new_storage_version
|
||||
.put_into_storage::<<$trait_instance as $system::Config>::PalletInfo, Self>();
|
||||
|
||||
let pallet_name = <<
|
||||
$trait_instance
|
||||
as
|
||||
$system::Config
|
||||
>::PalletInfo as $crate::traits::PalletInfo>::name::<Self>().expect("pallet will have name in the runtime; qed");
|
||||
|
||||
$crate::debug::info!(
|
||||
target: $crate::LOG_TARGET,
|
||||
"✅ no migration for '{}' and setting new storage version to {:?}",
|
||||
pallet_name,
|
||||
new_storage_version,
|
||||
);
|
||||
|
||||
<
|
||||
<$trait_instance as $system::Config>::DbWeight as $crate::traits::Get<_>
|
||||
>::get().writes(1)
|
||||
|
||||
Reference in New Issue
Block a user