From eb9458a70a29b90d887b4b2fc5be614fd6977011 Mon Sep 17 00:00:00 2001 From: Robert Hambrock Date: Sat, 10 Dec 2022 16:42:29 +0100 Subject: [PATCH 1/5] add mmr pallet migration stub --- frame/merkle-mountain-range/src/lib.rs | 2 + frame/merkle-mountain-range/src/migrations.rs | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 frame/merkle-mountain-range/src/migrations.rs diff --git a/frame/merkle-mountain-range/src/lib.rs b/frame/merkle-mountain-range/src/lib.rs index 46af84d218247..488d059d96fd4 100644 --- a/frame/merkle-mountain-range/src/lib.rs +++ b/frame/merkle-mountain-range/src/lib.rs @@ -69,6 +69,8 @@ pub use sp_mmr_primitives::{ self as primitives, utils::NodesUtils, Error, LeafDataProvider, LeafIndex, NodeIndex, }; +pub mod migrations; + #[cfg(feature = "runtime-benchmarks")] mod benchmarking; mod default_weights; diff --git a/frame/merkle-mountain-range/src/migrations.rs b/frame/merkle-mountain-range/src/migrations.rs new file mode 100644 index 0000000000000..cff827aca563a --- /dev/null +++ b/frame/merkle-mountain-range/src/migrations.rs @@ -0,0 +1,49 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod v1 { + use frame_support::{ + pallet_prelude::*, + traits::{GetStorageVersion, OnRuntimeUpgrade}, + }; + + use crate::*; + pub struct MigrateToV1(sp_std::marker::PhantomData); + impl OnRuntimeUpgrade for MigrateToV1 { + fn on_runtime_upgrade() -> Weight { + let current = Pallet::::current_storage_version(); + let onchain = Pallet::::on_chain_storage_version(); + + log::info!( + "Running migration with current storage version {:?} / onchain {:?}", + current, + onchain + ); + + if current == 1 && onchain == 0 { + + current.put::>(); + // TODO: adjust DbWeight + T::DbWeight::get().reads_writes(2, 1) + } else { + log::info!("Migration did not execute. This probably should be removed"); + // TODO: adjust DbWeight (but reads -> 1 should remain correct) + T::DbWeight::get().reads(1) + } + } + } +} From 6f507261c91fd20fed5ef53e204318514303c1f1 Mon Sep 17 00:00:00 2001 From: Robert Hambrock Date: Sat, 10 Dec 2022 16:43:45 +0100 Subject: [PATCH 2/5] add `try-runtime` checks --- frame/merkle-mountain-range/src/migrations.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frame/merkle-mountain-range/src/migrations.rs b/frame/merkle-mountain-range/src/migrations.rs index cff827aca563a..3c9dd50a94d50 100644 --- a/frame/merkle-mountain-range/src/migrations.rs +++ b/frame/merkle-mountain-range/src/migrations.rs @@ -45,5 +45,17 @@ pub mod v1 { T::DbWeight::get().reads(1) } } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, &'static str> { + assert_eq!(Pallet::::on_chain_storage_version(), 0); + Ok(Default::default()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_: Vec) -> Result<(), &'static str> { + assert_eq!(Pallet::::on_chain_storage_version(), 1); + Ok(()) + } } } From f63dc1f677f67f8caa9b92c3235a0a0a4b610899 Mon Sep 17 00:00:00 2001 From: Robert Hambrock Date: Sat, 10 Dec 2022 17:43:06 +0100 Subject: [PATCH 3/5] clear NumberOfLeaves & Nodes --- frame/merkle-mountain-range/src/migrations.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frame/merkle-mountain-range/src/migrations.rs b/frame/merkle-mountain-range/src/migrations.rs index 3c9dd50a94d50..3c82590913feb 100644 --- a/frame/merkle-mountain-range/src/migrations.rs +++ b/frame/merkle-mountain-range/src/migrations.rs @@ -35,8 +35,16 @@ pub mod v1 { ); if current == 1 && onchain == 0 { - + // update on-chain storage version current.put::>(); + + // reset all storage values + // TODO: RootHash should be overwritten correctly, but double-check + // RootHash::::set(); + NumberOfLeaves::::set(0); + // TODO: find reasonable limit for node clearing + let _ = Nodes::::clear(u32::max_value(), None); + // TODO: adjust DbWeight T::DbWeight::get().reads_writes(2, 1) } else { From e3efd51e932d0520f20f9f070e9d6bd87e4f57f1 Mon Sep 17 00:00:00 2001 From: Robert Hambrock Date: Mon, 12 Dec 2022 23:42:49 +0100 Subject: [PATCH 4/5] introduce & set storage version --- frame/merkle-mountain-range/src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frame/merkle-mountain-range/src/lib.rs b/frame/merkle-mountain-range/src/lib.rs index 488d059d96fd4..6b129472b0e64 100644 --- a/frame/merkle-mountain-range/src/lib.rs +++ b/frame/merkle-mountain-range/src/lib.rs @@ -122,8 +122,12 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; + /// The current storage version. + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(PhantomData<(T, I)>); /// This pallet's configuration trait From 0d3f0ecc4a567bc6e619358b66d354013ec24a1b Mon Sep 17 00:00:00 2001 From: Robert Hambrock Date: Tue, 13 Dec 2022 10:51:55 +0100 Subject: [PATCH 5/5] adjust db weights --- frame/merkle-mountain-range/src/migrations.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/frame/merkle-mountain-range/src/migrations.rs b/frame/merkle-mountain-range/src/migrations.rs index 3c82590913feb..ebb63eefcc02e 100644 --- a/frame/merkle-mountain-range/src/migrations.rs +++ b/frame/merkle-mountain-range/src/migrations.rs @@ -39,17 +39,14 @@ pub mod v1 { current.put::>(); // reset all storage values - // TODO: RootHash should be overwritten correctly, but double-check - // RootHash::::set(); NumberOfLeaves::::set(0); - // TODO: find reasonable limit for node clearing - let _ = Nodes::::clear(u32::max_value(), None); + let res = Nodes::::clear(u32::max_value(), None); - // TODO: adjust DbWeight - T::DbWeight::get().reads_writes(2, 1) + // (storage version + Nodes::clear, + // storage version write + NumberOfLeaves write + node key removals) + T::DbWeight::get().reads_writes(1 + res.loops as u64, 2 + res.unique as u64) } else { log::info!("Migration did not execute. This probably should be removed"); - // TODO: adjust DbWeight (but reads -> 1 should remain correct) T::DbWeight::get().reads(1) } }