Add retry mechanics to pallet-scheduler (#3060)

Fixes #3014 

This PR adds retry mechanics to `pallet-scheduler`, as described in the
issue above.

Users can now set a retry configuration for a task so that, in case its
scheduled run fails, it will be retried after a number of blocks, for a
specified number of times or until it succeeds.

If a retried task runs successfully before running out of retries, its
remaining retry counter will be reset to the initial value. If a retried
task runs out of retries, it will be removed from the schedule.

Tasks which need to be scheduled for a retry are still subject to weight
metering and agenda space, same as a regular task. Periodic tasks will
have their periodic schedule put on hold while the task is retrying.

---------

Signed-off-by: georgepisaltu <george.pisaltu@parity.io>
Co-authored-by: command-bot <>
This commit is contained in:
georgepisaltu
2024-02-16 12:59:10 +02:00
committed by GitHub
parent ad68a05079
commit 9346019dad
9 changed files with 2292 additions and 377 deletions
@@ -1,42 +1,41 @@
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// This file is part of Cumulus.
// 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.
// Cumulus is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Cumulus is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
//! Autogenerated weights for `pallet_scheduler`
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! DATE: 2024-01-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024
//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-westend-dev")`, DB CACHE: 1024
// Executed Command:
// ./target/production/polkadot-parachain
// target/production/polkadot-parachain
// benchmark
// pallet
// --chain=collectives-polkadot-dev
// --wasm-execution=compiled
// --pallet=pallet_scheduler
// --no-storage-info
// --no-median-slopes
// --no-min-squares
// --extrinsic=*
// --steps=50
// --repeat=20
// --json
// --header=./file_header.txt
// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/
// --extrinsic=*
// --wasm-execution=compiled
// --heap-pages=4096
// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json
// --pallet=pallet_scheduler
// --chain=collectives-westend-dev
// --header=./cumulus/file_header.txt
// --output=./cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
@@ -55,8 +54,8 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `31`
// Estimated: `1489`
// Minimum execution time: 3_441_000 picoseconds.
Weight::from_parts(3_604_000, 0)
// Minimum execution time: 2_475_000 picoseconds.
Weight::from_parts(2_644_000, 0)
.saturating_add(Weight::from_parts(0, 1489))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
@@ -68,11 +67,11 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `77 + s * (177 ±0)`
// Estimated: `159279`
// Minimum execution time: 2_879_000 picoseconds.
Weight::from_parts(2_963_000, 0)
// Minimum execution time: 2_898_000 picoseconds.
Weight::from_parts(1_532_342, 0)
.saturating_add(Weight::from_parts(0, 159279))
// Standard Error: 3_764
.saturating_add(Weight::from_parts(909_557, 0).saturating_mul(s.into()))
// Standard Error: 4_736
.saturating_add(Weight::from_parts(412_374, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
@@ -80,25 +79,27 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_172_000 picoseconds.
Weight::from_parts(5_294_000, 0)
// Minimum execution time: 3_171_000 picoseconds.
Weight::from_parts(3_349_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
/// Storage: `Preimage::PreimageFor` (r:1 w:1)
/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`)
/// Storage: `Preimage::StatusFor` (r:1 w:1)
/// Storage: `Preimage::StatusFor` (r:1 w:0)
/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// The range of component `s` is `[128, 4194304]`.
fn service_task_fetched(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `213 + s * (1 ±0)`
// Estimated: `3678 + s * (1 ±0)`
// Minimum execution time: 19_704_000 picoseconds.
Weight::from_parts(19_903_000, 0)
.saturating_add(Weight::from_parts(0, 3678))
// Standard Error: 5
.saturating_add(Weight::from_parts(1_394, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
// Measured: `246 + s * (1 ±0)`
// Estimated: `3711 + s * (1 ±0)`
// Minimum execution time: 17_329_000 picoseconds.
Weight::from_parts(17_604_000, 0)
.saturating_add(Weight::from_parts(0, 3711))
// Standard Error: 1
.saturating_add(Weight::from_parts(1_256, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(2))
.saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into()))
}
@@ -108,8 +109,8 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 6_359_000 picoseconds.
Weight::from_parts(6_599_000, 0)
// Minimum execution time: 4_503_000 picoseconds.
Weight::from_parts(4_677_000, 0)
.saturating_add(Weight::from_parts(0, 0))
.saturating_add(T::DbWeight::get().writes(1))
}
@@ -117,24 +118,24 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_217_000 picoseconds.
Weight::from_parts(5_333_000, 0)
// Minimum execution time: 3_145_000 picoseconds.
Weight::from_parts(3_252_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
fn execute_dispatch_signed() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_406_000 picoseconds.
Weight::from_parts(2_541_000, 0)
// Minimum execution time: 1_804_000 picoseconds.
Weight::from_parts(1_891_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
fn execute_dispatch_unsigned() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_370_000 picoseconds.
Weight::from_parts(2_561_000, 0)
// Minimum execution time: 1_706_000 picoseconds.
Weight::from_parts(1_776_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
/// Storage: `Scheduler::Agenda` (r:1 w:1)
@@ -144,11 +145,11 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `77 + s * (177 ±0)`
// Estimated: `159279`
// Minimum execution time: 11_784_000 picoseconds.
Weight::from_parts(5_574_404, 0)
// Minimum execution time: 8_629_000 picoseconds.
Weight::from_parts(6_707_232, 0)
.saturating_add(Weight::from_parts(0, 159279))
// Standard Error: 7_217
.saturating_add(Weight::from_parts(1_035_248, 0).saturating_mul(s.into()))
// Standard Error: 5_580
.saturating_add(Weight::from_parts(471_827, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
@@ -161,11 +162,11 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `77 + s * (177 ±0)`
// Estimated: `159279`
// Minimum execution time: 16_373_000 picoseconds.
Weight::from_parts(3_088_135, 0)
// Minimum execution time: 12_675_000 picoseconds.
Weight::from_parts(7_791_682, 0)
.saturating_add(Weight::from_parts(0, 159279))
// Standard Error: 7_095
.saturating_add(Weight::from_parts(1_745_270, 0).saturating_mul(s.into()))
// Standard Error: 5_381
.saturating_add(Weight::from_parts(653_023, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(2))
}
@@ -178,11 +179,11 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `468 + s * (179 ±0)`
// Estimated: `159279`
// Minimum execution time: 14_822_000 picoseconds.
Weight::from_parts(9_591_402, 0)
// Minimum execution time: 11_908_000 picoseconds.
Weight::from_parts(11_833_059, 0)
.saturating_add(Weight::from_parts(0, 159279))
// Standard Error: 7_151
.saturating_add(Weight::from_parts(1_058_408, 0).saturating_mul(s.into()))
// Standard Error: 5_662
.saturating_add(Weight::from_parts(482_816, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
@@ -195,12 +196,91 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `509 + s * (179 ±0)`
// Estimated: `159279`
// Minimum execution time: 18_541_000 picoseconds.
Weight::from_parts(6_522_239, 0)
// Minimum execution time: 15_506_000 picoseconds.
Weight::from_parts(11_372_975, 0)
.saturating_add(Weight::from_parts(0, 159279))
// Standard Error: 8_349
.saturating_add(Weight::from_parts(1_760_431, 0).saturating_mul(s.into()))
// Standard Error: 5_765
.saturating_add(Weight::from_parts(656_322, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: `Scheduler::Retries` (r:1 w:2)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 200]`.
fn schedule_retry(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `159`
// Estimated: `159279`
// Minimum execution time: 14_069_000 picoseconds.
Weight::from_parts(14_868_345, 0)
.saturating_add(Weight::from_parts(0, 159279))
// Standard Error: 425
.saturating_add(Weight::from_parts(33_468, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(4))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `77 + s * (177 ±0)`
// Estimated: `159279`
// Minimum execution time: 7_550_000 picoseconds.
Weight::from_parts(6_735_955, 0)
.saturating_add(Weight::from_parts(0, 159279))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `513 + s * (179 ±0)`
// Estimated: `159279`
// Minimum execution time: 11_017_000 picoseconds.
Weight::from_parts(11_749_385, 0)
.saturating_add(Weight::from_parts(0, 159279))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `77 + s * (177 ±0)`
// Estimated: `159279`
// Minimum execution time: 7_550_000 picoseconds.
Weight::from_parts(6_735_955, 0)
.saturating_add(Weight::from_parts(0, 159279))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `513 + s * (179 ±0)`
// Estimated: `159279`
// Minimum execution time: 11_017_000 picoseconds.
Weight::from_parts(11_749_385, 0)
.saturating_add(Weight::from_parts(0, 159279))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
}
@@ -17,24 +17,25 @@
//! Autogenerated weights for `pallet_scheduler`
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2023-05-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! DATE: 2024-01-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz`
//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 1024
//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024
// Executed Command:
// ./target/production/polkadot
// target/production/polkadot
// benchmark
// pallet
// --chain=rococo-dev
// --steps=50
// --repeat=20
// --pallet=pallet_scheduler
// --extrinsic=*
// --execution=wasm
// --wasm-execution=compiled
// --header=./file_header.txt
// --output=./runtime/rococo/src/weights/
// --heap-pages=4096
// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json
// --pallet=pallet_scheduler
// --chain=rococo-dev
// --header=./polkadot/file_header.txt
// --output=./polkadot/runtime/rococo/src/weights/
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
@@ -47,30 +48,30 @@ use core::marker::PhantomData;
/// Weight functions for `pallet_scheduler`.
pub struct WeightInfo<T>(PhantomData<T>);
impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
/// Storage: Scheduler IncompleteSince (r:1 w:1)
/// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen)
/// Storage: `Scheduler::IncompleteSince` (r:1 w:1)
/// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
fn service_agendas_base() -> Weight {
// Proof Size summary in bytes:
// Measured: `69`
// Measured: `68`
// Estimated: `1489`
// Minimum execution time: 4_741_000 picoseconds.
Weight::from_parts(4_939_000, 0)
// Minimum execution time: 2_869_000 picoseconds.
Weight::from_parts(3_109_000, 0)
.saturating_add(Weight::from_parts(0, 1489))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 50]`.
fn service_agenda_base(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Measured: `115 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 4_504_000 picoseconds.
Weight::from_parts(7_569_333, 0)
// Minimum execution time: 3_326_000 picoseconds.
Weight::from_parts(5_818_563, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 1_818
.saturating_add(Weight::from_parts(771_180, 0).saturating_mul(s.into()))
// Standard Error: 1_261
.saturating_add(Weight::from_parts(336_446, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
@@ -78,36 +79,38 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_709_000 picoseconds.
Weight::from_parts(5_929_000, 0)
// Minimum execution time: 3_007_000 picoseconds.
Weight::from_parts(3_197_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
/// Storage: Preimage PreimageFor (r:1 w:1)
/// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured)
/// Storage: Preimage StatusFor (r:1 w:1)
/// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen)
/// Storage: `Preimage::PreimageFor` (r:1 w:1)
/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`)
/// Storage: `Preimage::StatusFor` (r:1 w:0)
/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// The range of component `s` is `[128, 4194304]`.
fn service_task_fetched(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `251 + s * (1 ±0)`
// Estimated: `3716 + s * (1 ±0)`
// Minimum execution time: 20_710_000 picoseconds.
Weight::from_parts(20_918_000, 0)
// Minimum execution time: 16_590_000 picoseconds.
Weight::from_parts(16_869_000, 0)
.saturating_add(Weight::from_parts(0, 3716))
// Standard Error: 9
.saturating_add(Weight::from_parts(1_257, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(Weight::from_parts(1_308, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(2))
.saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into()))
}
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
fn service_task_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 7_262_000 picoseconds.
Weight::from_parts(7_412_000, 0)
// Minimum execution time: 4_320_000 picoseconds.
Weight::from_parts(4_594_000, 0)
.saturating_add(Weight::from_parts(0, 0))
.saturating_add(T::DbWeight::get().writes(1))
}
@@ -115,90 +118,173 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_774_000 picoseconds.
Weight::from_parts(5_887_000, 0)
// Minimum execution time: 2_956_000 picoseconds.
Weight::from_parts(3_216_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
fn execute_dispatch_signed() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_777_000 picoseconds.
Weight::from_parts(2_865_000, 0)
// Minimum execution time: 1_824_000 picoseconds.
Weight::from_parts(1_929_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
fn execute_dispatch_unsigned() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_739_000 picoseconds.
Weight::from_parts(2_827_000, 0)
// Minimum execution time: 1_749_000 picoseconds.
Weight::from_parts(1_916_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 49]`.
fn schedule(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Measured: `115 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 14_788_000 picoseconds.
Weight::from_parts(17_705_748, 0)
// Minimum execution time: 9_086_000 picoseconds.
Weight::from_parts(11_733_696, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 1_703
.saturating_add(Weight::from_parts(760_991, 0).saturating_mul(s.into()))
// Standard Error: 1_362
.saturating_add(Weight::from_parts(375_266, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn cancel(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Measured: `115 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 18_716_000 picoseconds.
Weight::from_parts(18_220_022, 0)
// Minimum execution time: 12_716_000 picoseconds.
Weight::from_parts(12_529_180, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 1_508
.saturating_add(Weight::from_parts(1_357_835, 0).saturating_mul(s.into()))
// Standard Error: 867
.saturating_add(Weight::from_parts(548_188, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 49]`.
fn schedule_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `293 + s * (185 ±0)`
// Measured: `292 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 17_719_000 picoseconds.
Weight::from_parts(21_657_806, 0)
// Minimum execution time: 12_053_000 picoseconds.
Weight::from_parts(15_358_056, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 2_645
.saturating_add(Weight::from_parts(794_184, 0).saturating_mul(s.into()))
// Standard Error: 3_176
.saturating_add(Weight::from_parts(421_589, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn cancel_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `319 + s * (185 ±0)`
// Measured: `318 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 20_225_000 picoseconds.
Weight::from_parts(20_494_405, 0)
// Minimum execution time: 14_803_000 picoseconds.
Weight::from_parts(15_805_714, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 1_890
.saturating_add(Weight::from_parts(1_379_025, 0).saturating_mul(s.into()))
// Standard Error: 2_597
.saturating_add(Weight::from_parts(611_053, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: `Scheduler::Retries` (r:1 w:2)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn schedule_retry(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `196`
// Estimated: `42428`
// Minimum execution time: 13_156_000 picoseconds.
Weight::from_parts(13_801_287, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 568
.saturating_add(Weight::from_parts(35_441, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(4))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn set_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `115 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 7_912_000 picoseconds.
Weight::from_parts(8_081_460, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn set_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `324 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 10_673_000 picoseconds.
Weight::from_parts(12_212_185, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn cancel_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `115 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 7_912_000 picoseconds.
Weight::from_parts(8_081_460, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn cancel_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `324 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 10_673_000 picoseconds.
Weight::from_parts(12_212_185, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
}
@@ -17,27 +17,25 @@
//! Autogenerated weights for `pallet_scheduler`
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! DATE: 2024-01-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `runner--ss9ysm1-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 1024
//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024
// Executed Command:
// ./target/production/polkadot
// target/production/polkadot
// benchmark
// pallet
// --chain=westend-dev
// --steps=50
// --repeat=20
// --no-storage-info
// --no-median-slopes
// --no-min-squares
// --pallet=pallet_scheduler
// --extrinsic=*
// --execution=wasm
// --wasm-execution=compiled
// --header=./file_header.txt
// --output=./runtime/westend/src/weights/
// --heap-pages=4096
// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json
// --pallet=pallet_scheduler
// --chain=westend-dev
// --header=./polkadot/file_header.txt
// --output=./polkadot/runtime/westend/src/weights/
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
@@ -50,30 +48,30 @@ use core::marker::PhantomData;
/// Weight functions for `pallet_scheduler`.
pub struct WeightInfo<T>(PhantomData<T>);
impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
/// Storage: Scheduler IncompleteSince (r:1 w:1)
/// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen)
/// Storage: `Scheduler::IncompleteSince` (r:1 w:1)
/// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
fn service_agendas_base() -> Weight {
// Proof Size summary in bytes:
// Measured: `69`
// Estimated: `1489`
// Minimum execution time: 3_991_000 picoseconds.
Weight::from_parts(4_160_000, 0)
// Minimum execution time: 3_220_000 picoseconds.
Weight::from_parts(3_512_000, 0)
.saturating_add(Weight::from_parts(0, 1489))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 50]`.
fn service_agenda_base(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 3_647_000 picoseconds.
Weight::from_parts(6_608_270, 0)
// Minimum execution time: 3_565_000 picoseconds.
Weight::from_parts(6_102_216, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 2_516
.saturating_add(Weight::from_parts(892_866, 0).saturating_mul(s.into()))
// Standard Error: 1_413
.saturating_add(Weight::from_parts(339_016, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
@@ -81,36 +79,38 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_552_000 picoseconds.
Weight::from_parts(5_836_000, 0)
// Minimum execution time: 2_940_000 picoseconds.
Weight::from_parts(3_070_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
/// Storage: Preimage PreimageFor (r:1 w:1)
/// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured)
/// Storage: Preimage StatusFor (r:1 w:1)
/// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen)
/// Storage: `Preimage::PreimageFor` (r:1 w:1)
/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`)
/// Storage: `Preimage::StatusFor` (r:1 w:0)
/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// The range of component `s` is `[128, 4194304]`.
fn service_task_fetched(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `217 + s * (1 ±0)`
// Estimated: `3682 + s * (1 ±0)`
// Minimum execution time: 20_583_000 picoseconds.
Weight::from_parts(20_771_000, 0)
// Minimum execution time: 16_602_000 picoseconds.
Weight::from_parts(16_834_000, 0)
.saturating_add(Weight::from_parts(0, 3682))
// Standard Error: 11
.saturating_add(Weight::from_parts(2_250, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
// Standard Error: 10
.saturating_add(Weight::from_parts(1_307, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(2))
.saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into()))
}
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
fn service_task_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 7_271_000 picoseconds.
Weight::from_parts(7_447_000, 0)
// Minimum execution time: 4_202_000 picoseconds.
Weight::from_parts(4_383_000, 0)
.saturating_add(Weight::from_parts(0, 0))
.saturating_add(T::DbWeight::get().writes(1))
}
@@ -118,90 +118,169 @@ impl<T: frame_system::Config> pallet_scheduler::WeightInfo for WeightInfo<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_547_000 picoseconds.
Weight::from_parts(5_776_000, 0)
// Minimum execution time: 2_917_000 picoseconds.
Weight::from_parts(3_043_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
fn execute_dispatch_signed() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_480_000 picoseconds.
Weight::from_parts(2_628_000, 0)
// Minimum execution time: 1_707_000 picoseconds.
Weight::from_parts(1_802_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
fn execute_dispatch_unsigned() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_479_000 picoseconds.
Weight::from_parts(2_626_000, 0)
// Minimum execution time: 1_671_000 picoseconds.
Weight::from_parts(1_796_000, 0)
.saturating_add(Weight::from_parts(0, 0))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 49]`.
fn schedule(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 13_350_000 picoseconds.
Weight::from_parts(15_289_847, 0)
// Minimum execution time: 9_313_000 picoseconds.
Weight::from_parts(12_146_613, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 5_375
.saturating_add(Weight::from_parts(974_567, 0).saturating_mul(s.into()))
// Standard Error: 1_381
.saturating_add(Weight::from_parts(360_418, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn cancel(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 17_646_000 picoseconds.
Weight::from_parts(15_858_434, 0)
// Minimum execution time: 13_079_000 picoseconds.
Weight::from_parts(12_921_017, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 5_354
.saturating_add(Weight::from_parts(1_697_642, 0).saturating_mul(s.into()))
// Standard Error: 1_112
.saturating_add(Weight::from_parts(538_089, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 49]`.
fn schedule_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `293 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 16_419_000 picoseconds.
Weight::from_parts(19_868_760, 0)
// Minimum execution time: 12_458_000 picoseconds.
Weight::from_parts(16_009_539, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 6_915
.saturating_add(Weight::from_parts(1_010_225, 0).saturating_mul(s.into()))
// Standard Error: 2_260
.saturating_add(Weight::from_parts(399_245, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn cancel_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `319 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 19_574_000 picoseconds.
Weight::from_parts(18_453_197, 0)
// Minimum execution time: 15_173_000 picoseconds.
Weight::from_parts(15_602_728, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 6_009
.saturating_add(Weight::from_parts(1_707_130, 0).saturating_mul(s.into()))
// Standard Error: 1_302
.saturating_add(Weight::from_parts(557_878, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: `Scheduler::Retries` (r:1 w:2)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 50]`.
fn schedule_retry(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `197`
// Estimated: `42428`
// Minimum execution time: 13_531_000 picoseconds.
Weight::from_parts(13_985_249, 0)
.saturating_add(Weight::from_parts(0, 42428))
// Standard Error: 619
.saturating_add(Weight::from_parts(39_068, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(4))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 8_050_000 picoseconds.
Weight::from_parts(8_440_627, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `325 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 10_876_000 picoseconds.
Weight::from_parts(11_708_172, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `116 + s * (177 ±0)`
// Estimated: `42428`
// Minimum execution time: 8_050_000 picoseconds.
Weight::from_parts(8_440_627, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `325 + s * (185 ±0)`
// Estimated: `42428`
// Minimum execution time: 10_876_000 picoseconds.
Weight::from_parts(11_708_172, 0)
.saturating_add(Weight::from_parts(0, 42428))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
}
+15
View File
@@ -0,0 +1,15 @@
# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
title: Add retry mechanics to `pallet-scheduler`
doc:
- audience: Runtime Dev
description: |
This PR adds retry mechanics to pallet-scheduler, as described in the issue above.
Users can now set a retry configuration for a task so that, in case its scheduled run fails, it will be retried after a number of blocks, for a specified number of times or until it succeeds.
If a retried task runs successfully before running out of retries, its remaining retry counter will be reset to the initial value. If a retried task runs out of retries, it will be removed from the schedule.
Tasks which need to be scheduled for a retry are still subject to weight metering and agenda space, same as a regular task. Periodic tasks will have their periodic schedule put on hold while the task is retrying.
crates:
- name: pallet-scheduler
+110 -1
View File
@@ -22,12 +22,13 @@ use frame_benchmarking::v1::{account, benchmarks, BenchmarkError};
use frame_support::{
ensure,
traits::{schedule::Priority, BoundedInline},
weights::WeightMeter,
};
use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin};
use sp_std::{prelude::*, vec};
use crate::Pallet as Scheduler;
use frame_system::Call as SystemCall;
use frame_system::{Call as SystemCall, EventRecord};
const SEED: u32 = 0;
@@ -35,6 +36,14 @@ const BLOCK_NUMBER: u32 = 2;
type SystemOrigin<T> = <T as frame_system::Config>::RuntimeOrigin;
fn assert_last_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) {
let events = frame_system::Pallet::<T>::events();
let system_event: <T as frame_system::Config>::RuntimeEvent = generic_event.into();
// compare to the last event record
let EventRecord { event, .. } = &events[events.len() - 1];
assert_eq!(event, &system_event);
}
/// Add `n` items to the schedule.
///
/// For `resolved`:
@@ -306,5 +315,105 @@ benchmarks! {
);
}
schedule_retry {
let s in 1 .. T::MaxScheduledPerBlock::get();
let when = BLOCK_NUMBER.into();
fill_schedule::<T>(when, s)?;
let name = u32_to_name(s - 1);
let address = Lookup::<T>::get(name).unwrap();
let period: BlockNumberFor<T> = 1u32.into();
let root: <T as Config>::PalletsOrigin = frame_system::RawOrigin::Root.into();
let retry_config = RetryConfig { total_retries: 10, remaining: 10, period };
Retries::<T>::insert(address, retry_config);
let (mut when, index) = address;
let task = Agenda::<T>::get(when)[index as usize].clone().unwrap();
let mut weight_counter = WeightMeter::with_limit(T::MaximumWeight::get());
}: {
Scheduler::<T>::schedule_retry(&mut weight_counter, when, when, index, &task, retry_config);
} verify {
when = when + BlockNumberFor::<T>::one();
assert_eq!(
Retries::<T>::get((when, 0)),
Some(RetryConfig { total_retries: 10, remaining: 9, period })
);
}
set_retry {
let s = T::MaxScheduledPerBlock::get();
let when = BLOCK_NUMBER.into();
fill_schedule::<T>(when, s)?;
let name = u32_to_name(s - 1);
let address = Lookup::<T>::get(name).unwrap();
let (when, index) = address;
let period = BlockNumberFor::<T>::one();
}: _(RawOrigin::Root, (when, index), 10, period)
verify {
assert_eq!(
Retries::<T>::get((when, index)),
Some(RetryConfig { total_retries: 10, remaining: 10, period })
);
assert_last_event::<T>(
Event::RetrySet { task: address, id: None, period, retries: 10 }.into(),
);
}
set_retry_named {
let s = T::MaxScheduledPerBlock::get();
let when = BLOCK_NUMBER.into();
fill_schedule::<T>(when, s)?;
let name = u32_to_name(s - 1);
let address = Lookup::<T>::get(name).unwrap();
let (when, index) = address;
let period = BlockNumberFor::<T>::one();
}: _(RawOrigin::Root, name, 10, period)
verify {
assert_eq!(
Retries::<T>::get((when, index)),
Some(RetryConfig { total_retries: 10, remaining: 10, period })
);
assert_last_event::<T>(
Event::RetrySet { task: address, id: Some(name), period, retries: 10 }.into(),
);
}
cancel_retry {
let s = T::MaxScheduledPerBlock::get();
let when = BLOCK_NUMBER.into();
fill_schedule::<T>(when, s)?;
let name = u32_to_name(s - 1);
let address = Lookup::<T>::get(name).unwrap();
let (when, index) = address;
let period = BlockNumberFor::<T>::one();
assert!(Scheduler::<T>::set_retry(RawOrigin::Root.into(), (when, index), 10, period).is_ok());
}: _(RawOrigin::Root, (when, index))
verify {
assert!(!Retries::<T>::contains_key((when, index)));
assert_last_event::<T>(
Event::RetryCancelled { task: address, id: None }.into(),
);
}
cancel_retry_named {
let s = T::MaxScheduledPerBlock::get();
let when = BLOCK_NUMBER.into();
fill_schedule::<T>(when, s)?;
let name = u32_to_name(s - 1);
let address = Lookup::<T>::get(name).unwrap();
let (when, index) = address;
let period = BlockNumberFor::<T>::one();
assert!(Scheduler::<T>::set_retry_named(RawOrigin::Root.into(), name, 10, period).is_ok());
}: _(RawOrigin::Root, name)
verify {
assert!(!Retries::<T>::contains_key((when, index)));
assert_last_event::<T>(
Event::RetryCancelled { task: address, id: Some(name) }.into(),
);
}
impl_benchmark_test_suite!(Scheduler, crate::mock::new_test_ext(), crate::mock::Test);
}
+254 -13
View File
@@ -122,6 +122,17 @@ pub type CallOrHashOf<T> =
pub type BoundedCallOf<T> =
Bounded<<T as Config>::RuntimeCall, <T as frame_system::Config>::Hashing>;
/// The configuration of the retry mechanism for a given task along with its current state.
#[derive(Clone, Copy, RuntimeDebug, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)]
pub struct RetryConfig<Period> {
/// Initial amount of retries allowed.
total_retries: u8,
/// Amount of retries left.
remaining: u8,
/// Period of time between retry attempts.
period: Period,
}
#[cfg_attr(any(feature = "std", test), derive(PartialEq, Eq))]
#[derive(Clone, RuntimeDebug, Encode, Decode)]
struct ScheduledV1<Call, BlockNumber> {
@@ -148,6 +159,26 @@ pub struct Scheduled<Name, Call, BlockNumber, PalletsOrigin, AccountId> {
_phantom: PhantomData<AccountId>,
}
impl<Name, Call, BlockNumber, PalletsOrigin, AccountId>
Scheduled<Name, Call, BlockNumber, PalletsOrigin, AccountId>
where
Call: Clone,
PalletsOrigin: Clone,
{
/// Create a new task to be used for retry attempts of the original one. The cloned task will
/// have the same `priority`, `call` and `origin`, but will always be non-periodic and unnamed.
pub fn as_retry(&self) -> Self {
Self {
maybe_id: None,
priority: self.priority,
call: self.call.clone(),
maybe_periodic: None,
origin: self.origin.clone(),
_phantom: Default::default(),
}
}
}
use crate::{Scheduled as ScheduledV3, Scheduled as ScheduledV2};
pub type ScheduledV2Of<T> = ScheduledV2<
@@ -273,6 +304,16 @@ pub mod pallet {
ValueQuery,
>;
/// Retry configurations for items to be executed, indexed by task address.
#[pallet::storage]
pub type Retries<T: Config> = StorageMap<
_,
Blake2_128Concat,
TaskAddress<BlockNumberFor<T>>,
RetryConfig<BlockNumberFor<T>>,
OptionQuery,
>;
/// Lookup from a name to the block number and index of the task.
///
/// For v3 -> v4 the previously unbounded identities are Blake2-256 hashed to form the v4
@@ -295,10 +336,22 @@ pub mod pallet {
id: Option<TaskName>,
result: DispatchResult,
},
/// Set a retry configuration for some task.
RetrySet {
task: TaskAddress<BlockNumberFor<T>>,
id: Option<TaskName>,
period: BlockNumberFor<T>,
retries: u8,
},
/// Cancel a retry configuration for some task.
RetryCancelled { task: TaskAddress<BlockNumberFor<T>>, id: Option<TaskName> },
/// The call for the provided hash was not found so the task has been aborted.
CallUnavailable { task: TaskAddress<BlockNumberFor<T>>, id: Option<TaskName> },
/// The given task was unable to be renewed since the agenda is full at that block.
PeriodicFailed { task: TaskAddress<BlockNumberFor<T>>, id: Option<TaskName> },
/// The given task was unable to be retried since the agenda is full at that block or there
/// was not enough weight to reschedule it.
RetryFailed { task: TaskAddress<BlockNumberFor<T>>, id: Option<TaskName> },
/// The given task can never be executed since it is overweight.
PermanentlyOverweight { task: TaskAddress<BlockNumberFor<T>>, id: Option<TaskName> },
}
@@ -440,6 +493,111 @@ pub mod pallet {
)?;
Ok(())
}
/// Set a retry configuration for a task so that, in case its scheduled run fails, it will
/// be retried after `period` blocks, for a total amount of `retries` retries or until it
/// succeeds.
///
/// Tasks which need to be scheduled for a retry are still subject to weight metering and
/// agenda space, same as a regular task. If a periodic task fails, it will be scheduled
/// normally while the task is retrying.
///
/// Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic
/// clones of the original task. Their retry configuration will be derived from the
/// original task's configuration, but will have a lower value for `remaining` than the
/// original `total_retries`.
#[pallet::call_index(6)]
#[pallet::weight(<T as Config>::WeightInfo::set_retry())]
pub fn set_retry(
origin: OriginFor<T>,
task: TaskAddress<BlockNumberFor<T>>,
retries: u8,
period: BlockNumberFor<T>,
) -> DispatchResult {
T::ScheduleOrigin::ensure_origin(origin.clone())?;
let origin = <T as Config>::RuntimeOrigin::from(origin);
let (when, index) = task;
let agenda = Agenda::<T>::get(when);
let scheduled = agenda
.get(index as usize)
.and_then(Option::as_ref)
.ok_or(Error::<T>::NotFound)?;
Self::ensure_privilege(origin.caller(), &scheduled.origin)?;
Retries::<T>::insert(
(when, index),
RetryConfig { total_retries: retries, remaining: retries, period },
);
Self::deposit_event(Event::RetrySet { task, id: None, period, retries });
Ok(())
}
/// Set a retry configuration for a named task so that, in case its scheduled run fails, it
/// will be retried after `period` blocks, for a total amount of `retries` retries or until
/// it succeeds.
///
/// Tasks which need to be scheduled for a retry are still subject to weight metering and
/// agenda space, same as a regular task. If a periodic task fails, it will be scheduled
/// normally while the task is retrying.
///
/// Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic
/// clones of the original task. Their retry configuration will be derived from the
/// original task's configuration, but will have a lower value for `remaining` than the
/// original `total_retries`.
#[pallet::call_index(7)]
#[pallet::weight(<T as Config>::WeightInfo::set_retry_named())]
pub fn set_retry_named(
origin: OriginFor<T>,
id: TaskName,
retries: u8,
period: BlockNumberFor<T>,
) -> DispatchResult {
T::ScheduleOrigin::ensure_origin(origin.clone())?;
let origin = <T as Config>::RuntimeOrigin::from(origin);
let (when, agenda_index) = Lookup::<T>::get(&id).ok_or(Error::<T>::NotFound)?;
let agenda = Agenda::<T>::get(when);
let scheduled = agenda
.get(agenda_index as usize)
.and_then(Option::as_ref)
.ok_or(Error::<T>::NotFound)?;
Self::ensure_privilege(origin.caller(), &scheduled.origin)?;
Retries::<T>::insert(
(when, agenda_index),
RetryConfig { total_retries: retries, remaining: retries, period },
);
Self::deposit_event(Event::RetrySet {
task: (when, agenda_index),
id: Some(id),
period,
retries,
});
Ok(())
}
/// Removes the retry configuration of a task.
#[pallet::call_index(8)]
#[pallet::weight(<T as Config>::WeightInfo::cancel_retry())]
pub fn cancel_retry(
origin: OriginFor<T>,
task: TaskAddress<BlockNumberFor<T>>,
) -> DispatchResult {
T::ScheduleOrigin::ensure_origin(origin.clone())?;
let origin = <T as Config>::RuntimeOrigin::from(origin);
Self::do_cancel_retry(origin.caller(), task)?;
Self::deposit_event(Event::RetryCancelled { task, id: None });
Ok(())
}
/// Cancel the retry configuration of a named task.
#[pallet::call_index(9)]
#[pallet::weight(<T as Config>::WeightInfo::cancel_retry_named())]
pub fn cancel_retry_named(origin: OriginFor<T>, id: TaskName) -> DispatchResult {
T::ScheduleOrigin::ensure_origin(origin.clone())?;
let origin = <T as Config>::RuntimeOrigin::from(origin);
let task = Lookup::<T>::get(&id).ok_or(Error::<T>::NotFound)?;
Self::do_cancel_retry(origin.caller(), task)?;
Self::deposit_event(Event::RetryCancelled { task, id: Some(id) });
Ok(())
}
}
}
@@ -838,12 +996,7 @@ impl<T: Config> Pallet<T> {
Ok(None),
|s| -> Result<Option<Scheduled<_, _, _, _, _>>, DispatchError> {
if let (Some(ref o), Some(ref s)) = (origin, s.borrow()) {
if matches!(
T::OriginPrivilegeCmp::cmp_privilege(o, &s.origin),
Some(Ordering::Less) | None
) {
return Err(BadOrigin.into())
}
Self::ensure_privilege(o, &s.origin)?;
};
Ok(s.take())
},
@@ -854,6 +1007,7 @@ impl<T: Config> Pallet<T> {
if let Some(id) = s.maybe_id {
Lookup::<T>::remove(id);
}
Retries::<T>::remove((when, index));
Self::cleanup_agenda(when);
Self::deposit_event(Event::Canceled { when, index });
Ok(())
@@ -931,12 +1085,8 @@ impl<T: Config> Pallet<T> {
Agenda::<T>::try_mutate(when, |agenda| -> DispatchResult {
if let Some(s) = agenda.get_mut(i) {
if let (Some(ref o), Some(ref s)) = (origin, s.borrow()) {
if matches!(
T::OriginPrivilegeCmp::cmp_privilege(o, &s.origin),
Some(Ordering::Less) | None
) {
return Err(BadOrigin.into())
}
Self::ensure_privilege(o, &s.origin)?;
Retries::<T>::remove((when, index));
T::Preimages::drop(&s.call);
}
*s = None;
@@ -973,6 +1123,20 @@ impl<T: Config> Pallet<T> {
Self::deposit_event(Event::Canceled { when, index });
Self::place_task(new_time, task).map_err(|x| x.0)
}
fn do_cancel_retry(
origin: &T::PalletsOrigin,
(when, index): TaskAddress<BlockNumberFor<T>>,
) -> Result<(), DispatchError> {
let agenda = Agenda::<T>::get(when);
let scheduled = agenda
.get(index as usize)
.and_then(Option::as_ref)
.ok_or(Error::<T>::NotFound)?;
Self::ensure_privilege(origin, &scheduled.origin)?;
Retries::<T>::remove((when, index));
Ok(())
}
}
enum ServiceTaskError {
@@ -1124,11 +1288,21 @@ impl<T: Config> Pallet<T> {
},
Err(()) => Err((Overweight, Some(task))),
Ok(result) => {
let failed = result.is_err();
let maybe_retry_config = Retries::<T>::take((when, agenda_index));
Self::deposit_event(Event::Dispatched {
task: (when, agenda_index),
id: task.maybe_id,
result,
});
match maybe_retry_config {
Some(retry_config) if failed => {
Self::schedule_retry(weight, now, when, agenda_index, &task, retry_config);
},
_ => {},
}
if let &Some((period, count)) = &task.maybe_periodic {
if count > 1 {
task.maybe_periodic = Some((period, count - 1));
@@ -1137,7 +1311,10 @@ impl<T: Config> Pallet<T> {
}
let wake = now.saturating_add(period);
match Self::place_task(wake, task) {
Ok(_) => {},
Ok(new_address) =>
if let Some(retry_config) = maybe_retry_config {
Retries::<T>::insert(new_address, retry_config);
},
Err((_, task)) => {
// TODO: Leave task in storage somewhere for it to be rescheduled
// manually.
@@ -1192,6 +1369,70 @@ impl<T: Config> Pallet<T> {
let _ = weight.try_consume(call_weight);
Ok(result)
}
/// Check if a task has a retry configuration in place and, if so, try to reschedule it.
///
/// Possible causes for failure to schedule a retry for a task:
/// - there wasn't enough weight to run the task reschedule logic
/// - there was no retry configuration in place
/// - there were no more retry attempts left
/// - the agenda was full.
fn schedule_retry(
weight: &mut WeightMeter,
now: BlockNumberFor<T>,
when: BlockNumberFor<T>,
agenda_index: u32,
task: &ScheduledOf<T>,
retry_config: RetryConfig<BlockNumberFor<T>>,
) {
if weight
.try_consume(T::WeightInfo::schedule_retry(T::MaxScheduledPerBlock::get()))
.is_err()
{
Self::deposit_event(Event::RetryFailed {
task: (when, agenda_index),
id: task.maybe_id,
});
return;
}
let RetryConfig { total_retries, mut remaining, period } = retry_config;
remaining = match remaining.checked_sub(1) {
Some(n) => n,
None => return,
};
let wake = now.saturating_add(period);
match Self::place_task(wake, task.as_retry()) {
Ok(address) => {
// Reinsert the retry config to the new address of the task after it was
// placed.
Retries::<T>::insert(address, RetryConfig { total_retries, remaining, period });
},
Err((_, task)) => {
// TODO: Leave task in storage somewhere for it to be
// rescheduled manually.
T::Preimages::drop(&task.call);
Self::deposit_event(Event::RetryFailed {
task: (when, agenda_index),
id: task.maybe_id,
});
},
}
}
/// Ensure that `left` has at least the same level of privilege or higher than `right`.
///
/// Returns an error if `left` has a lower level of privilege or the two cannot be compared.
fn ensure_privilege(
left: &<T as Config>::PalletsOrigin,
right: &<T as Config>::PalletsOrigin,
) -> Result<(), DispatchError> {
if matches!(T::OriginPrivilegeCmp::cmp_privilege(left, right), Some(Ordering::Less) | None)
{
return Err(BadOrigin.into());
}
Ok(())
}
}
impl<T: Config> schedule::v2::Anon<BlockNumberFor<T>, <T as Config>::RuntimeCall, T::PalletsOrigin>
+40
View File
@@ -51,6 +51,17 @@ pub mod logger {
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::storage]
pub type Threshold<T: Config> = StorageValue<_, (BlockNumberFor<T>, BlockNumberFor<T>)>;
#[pallet::error]
pub enum Error<T> {
/// Under the threshold.
TooEarly,
/// Over the threshold.
TooLate,
}
#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {}
@@ -89,6 +100,20 @@ pub mod logger {
});
Ok(())
}
#[pallet::call_index(2)]
#[pallet::weight(*weight)]
pub fn timed_log(origin: OriginFor<T>, i: u32, weight: Weight) -> DispatchResult {
let now = frame_system::Pallet::<T>::block_number();
let (start, end) = Threshold::<T>::get().unwrap_or((0u32.into(), u32::MAX.into()));
ensure!(now >= start, Error::<T>::TooEarly);
ensure!(now <= end, Error::<T>::TooLate);
Self::deposit_event(Event::Logged(i, weight));
Log::mutate(|log| {
log.push((origin.caller().clone(), i));
});
Ok(())
}
}
}
@@ -198,6 +223,21 @@ impl WeightInfo for TestWeightInfo {
fn cancel_named(_s: u32) -> Weight {
Weight::from_parts(50, 0)
}
fn schedule_retry(_s: u32) -> Weight {
Weight::from_parts(100000, 0)
}
fn set_retry() -> Weight {
Weight::from_parts(50, 0)
}
fn set_retry_named() -> Weight {
Weight::from_parts(50, 0)
}
fn cancel_retry() -> Weight {
Weight::from_parts(50, 0)
}
fn cancel_retry_named() -> Weight {
Weight::from_parts(50, 0)
}
}
parameter_types! {
pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) *
File diff suppressed because it is too large Load Diff
+311 -147
View File
@@ -15,32 +15,29 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//! Autogenerated weights for pallet_scheduler
//! Autogenerated weights for `pallet_scheduler`
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! DATE: 2024-01-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024
//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024`
// Executed Command:
// ./target/production/substrate
// target/production/substrate-node
// benchmark
// pallet
// --chain=dev
// --steps=50
// --repeat=20
// --pallet=pallet_scheduler
// --no-storage-info
// --no-median-slopes
// --no-min-squares
// --extrinsic=*
// --execution=wasm
// --wasm-execution=compiled
// --heap-pages=4096
// --output=./frame/scheduler/src/weights.rs
// --header=./HEADER-APACHE2
// --template=./.maintain/frame-weight-template.hbs
// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json
// --pallet=pallet_scheduler
// --chain=dev
// --header=./substrate/HEADER-APACHE2
// --output=./substrate/frame/scheduler/src/weights.rs
// --template=./substrate/.maintain/frame-weight-template.hbs
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
@@ -50,7 +47,7 @@
use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};
use core::marker::PhantomData;
/// Weight functions needed for pallet_scheduler.
/// Weight functions needed for `pallet_scheduler`.
pub trait WeightInfo {
fn service_agendas_base() -> Weight;
fn service_agenda_base(s: u32, ) -> Weight;
@@ -64,33 +61,38 @@ pub trait WeightInfo {
fn cancel(s: u32, ) -> Weight;
fn schedule_named(s: u32, ) -> Weight;
fn cancel_named(s: u32, ) -> Weight;
fn schedule_retry(s: u32, ) -> Weight;
fn set_retry() -> Weight;
fn set_retry_named() -> Weight;
fn cancel_retry() -> Weight;
fn cancel_retry_named() -> Weight;
}
/// Weights for pallet_scheduler using the Substrate node and recommended hardware.
/// Weights for `pallet_scheduler` using the Substrate node and recommended hardware.
pub struct SubstrateWeight<T>(PhantomData<T>);
impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
/// Storage: Scheduler IncompleteSince (r:1 w:1)
/// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen)
/// Storage: `Scheduler::IncompleteSince` (r:1 w:1)
/// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
fn service_agendas_base() -> Weight {
// Proof Size summary in bytes:
// Measured: `31`
// Estimated: `1489`
// Minimum execution time: 3_991_000 picoseconds.
Weight::from_parts(4_174_000, 1489)
// Minimum execution time: 3_040_000 picoseconds.
Weight::from_parts(3_202_000, 1489)
.saturating_add(T::DbWeight::get().reads(1_u64))
.saturating_add(T::DbWeight::get().writes(1_u64))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 512]`.
fn service_agenda_base(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 3_581_000 picoseconds.
Weight::from_parts(7_413_174, 110487)
// Standard Error: 971
.saturating_add(Weight::from_parts(348_077, 0).saturating_mul(s.into()))
// Minimum execution time: 3_462_000 picoseconds.
Weight::from_parts(6_262_125, 110487)
// Standard Error: 536
.saturating_add(Weight::from_parts(332_570, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1_u64))
.saturating_add(T::DbWeight::get().writes(1_u64))
}
@@ -98,145 +100,226 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_250_000 picoseconds.
Weight::from_parts(5_549_000, 0)
// Minimum execution time: 3_425_000 picoseconds.
Weight::from_parts(3_680_000, 0)
}
/// Storage: Preimage PreimageFor (r:1 w:1)
/// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured)
/// Storage: Preimage StatusFor (r:1 w:1)
/// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen)
/// Storage: `Preimage::PreimageFor` (r:1 w:1)
/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`)
/// Storage: `Preimage::StatusFor` (r:1 w:0)
/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// The range of component `s` is `[128, 4194304]`.
fn service_task_fetched(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `179 + s * (1 ±0)`
// Estimated: `3644 + s * (1 ±0)`
// Minimum execution time: 20_089_000 picoseconds.
Weight::from_parts(20_376_000, 3644)
// Standard Error: 3
.saturating_add(Weight::from_parts(1_170, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2_u64))
// Measured: `246 + s * (1 ±0)`
// Estimated: `3711 + s * (1 ±0)`
// Minimum execution time: 17_564_000 picoseconds.
Weight::from_parts(17_887_000, 3711)
// Standard Error: 1
.saturating_add(Weight::from_parts(1_253, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(3_u64))
.saturating_add(T::DbWeight::get().writes(2_u64))
.saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into()))
}
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
fn service_task_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 6_998_000 picoseconds.
Weight::from_parts(7_303_000, 0)
// Minimum execution time: 4_934_000 picoseconds.
Weight::from_parts(5_275_000, 0)
.saturating_add(T::DbWeight::get().writes(1_u64))
}
fn service_task_periodic() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_078_000 picoseconds.
Weight::from_parts(5_315_000, 0)
// Minimum execution time: 3_348_000 picoseconds.
Weight::from_parts(3_561_000, 0)
}
/// Storage: `SafeMode::EnteredUntil` (r:1 w:0)
/// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
/// Storage: `TxPause::PausedCalls` (r:1 w:0)
/// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`)
fn execute_dispatch_signed() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_228_000 picoseconds.
Weight::from_parts(2_352_000, 0)
// Measured: `145`
// Estimated: `3997`
// Minimum execution time: 6_395_000 picoseconds.
Weight::from_parts(6_642_000, 3997)
.saturating_add(T::DbWeight::get().reads(2_u64))
}
fn execute_dispatch_unsigned() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_226_000 picoseconds.
Weight::from_parts(2_371_000, 0)
// Minimum execution time: 2_167_000 picoseconds.
Weight::from_parts(2_266_000, 0)
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 511]`.
fn schedule(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 12_683_000 picoseconds.
Weight::from_parts(16_951_846, 110487)
// Standard Error: 1_046
.saturating_add(Weight::from_parts(380_842, 0).saturating_mul(s.into()))
// Minimum execution time: 10_009_000 picoseconds.
Weight::from_parts(13_565_985, 110487)
// Standard Error: 575
.saturating_add(Weight::from_parts(354_760, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1_u64))
.saturating_add(T::DbWeight::get().writes(1_u64))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 512]`.
fn cancel(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 16_201_000 picoseconds.
Weight::from_parts(18_259_422, 110487)
// Standard Error: 1_344
.saturating_add(Weight::from_parts(545_863, 0).saturating_mul(s.into()))
// Minimum execution time: 14_048_000 picoseconds.
Weight::from_parts(15_141_696, 110487)
// Standard Error: 1_082
.saturating_add(Weight::from_parts(533_390, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(1_u64))
.saturating_add(T::DbWeight::get().writes(2_u64))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 511]`.
fn schedule_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `596 + s * (178 ±0)`
// Estimated: `110487`
// Minimum execution time: 16_180_000 picoseconds.
Weight::from_parts(25_128_925, 110487)
// Standard Error: 1_118
.saturating_add(Weight::from_parts(375_631, 0).saturating_mul(s.into()))
// Minimum execution time: 12_902_000 picoseconds.
Weight::from_parts(18_957_156, 110487)
// Standard Error: 792
.saturating_add(Weight::from_parts(361_909, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2_u64))
.saturating_add(T::DbWeight::get().writes(2_u64))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 512]`.
fn cancel_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `709 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 18_244_000 picoseconds.
Weight::from_parts(21_439_366, 110487)
// Standard Error: 1_084
.saturating_add(Weight::from_parts(557_691, 0).saturating_mul(s.into()))
// Minimum execution time: 15_933_000 picoseconds.
Weight::from_parts(18_091_415, 110487)
// Standard Error: 779
.saturating_add(Weight::from_parts(534_402, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2_u64))
.saturating_add(T::DbWeight::get().writes(2_u64))
}
/// Storage: `Scheduler::Retries` (r:1 w:2)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 512]`.
fn schedule_retry(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `159`
// Estimated: `110487`
// Minimum execution time: 14_155_000 picoseconds.
Weight::from_parts(16_447_031, 110487)
// Standard Error: 233
.saturating_add(Weight::from_parts(8_424, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(2_u64))
.saturating_add(T::DbWeight::get().writes(4_u64))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 8_130_000 picoseconds.
Weight::from_parts(9_047_554, 110487)
.saturating_add(T::DbWeight::get().reads(1_u64))
.saturating_add(T::DbWeight::get().writes(1_u64))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `647 + s * (178 ±0)`
// Estimated: `110487`
// Minimum execution time: 10_838_000 picoseconds.
Weight::from_parts(12_804_076, 110487)
.saturating_add(T::DbWeight::get().reads(2_u64))
.saturating_add(T::DbWeight::get().writes(1_u64))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 8_130_000 picoseconds.
Weight::from_parts(9_047_554, 110487)
.saturating_add(T::DbWeight::get().reads(1_u64))
.saturating_add(T::DbWeight::get().writes(1_u64))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `647 + s * (178 ±0)`
// Estimated: `110487`
// Minimum execution time: 10_838_000 picoseconds.
Weight::from_parts(12_804_076, 110487)
.saturating_add(T::DbWeight::get().reads(2_u64))
.saturating_add(T::DbWeight::get().writes(1_u64))
}
}
// For backwards compatibility and tests
// For backwards compatibility and tests.
impl WeightInfo for () {
/// Storage: Scheduler IncompleteSince (r:1 w:1)
/// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen)
/// Storage: `Scheduler::IncompleteSince` (r:1 w:1)
/// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
fn service_agendas_base() -> Weight {
// Proof Size summary in bytes:
// Measured: `31`
// Estimated: `1489`
// Minimum execution time: 3_991_000 picoseconds.
Weight::from_parts(4_174_000, 1489)
// Minimum execution time: 3_040_000 picoseconds.
Weight::from_parts(3_202_000, 1489)
.saturating_add(RocksDbWeight::get().reads(1_u64))
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 512]`.
fn service_agenda_base(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 3_581_000 picoseconds.
Weight::from_parts(7_413_174, 110487)
// Standard Error: 971
.saturating_add(Weight::from_parts(348_077, 0).saturating_mul(s.into()))
// Minimum execution time: 3_462_000 picoseconds.
Weight::from_parts(6_262_125, 110487)
// Standard Error: 536
.saturating_add(Weight::from_parts(332_570, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(1_u64))
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
@@ -244,117 +327,198 @@ impl WeightInfo for () {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_250_000 picoseconds.
Weight::from_parts(5_549_000, 0)
// Minimum execution time: 3_425_000 picoseconds.
Weight::from_parts(3_680_000, 0)
}
/// Storage: Preimage PreimageFor (r:1 w:1)
/// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured)
/// Storage: Preimage StatusFor (r:1 w:1)
/// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen)
/// Storage: `Preimage::PreimageFor` (r:1 w:1)
/// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`)
/// Storage: `Preimage::StatusFor` (r:1 w:0)
/// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// Storage: `Preimage::RequestStatusFor` (r:1 w:1)
/// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`)
/// The range of component `s` is `[128, 4194304]`.
fn service_task_fetched(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `179 + s * (1 ±0)`
// Estimated: `3644 + s * (1 ±0)`
// Minimum execution time: 20_089_000 picoseconds.
Weight::from_parts(20_376_000, 3644)
// Standard Error: 3
.saturating_add(Weight::from_parts(1_170, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(2_u64))
// Measured: `246 + s * (1 ±0)`
// Estimated: `3711 + s * (1 ±0)`
// Minimum execution time: 17_564_000 picoseconds.
Weight::from_parts(17_887_000, 3711)
// Standard Error: 1
.saturating_add(Weight::from_parts(1_253, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(3_u64))
.saturating_add(RocksDbWeight::get().writes(2_u64))
.saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into()))
}
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
fn service_task_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 6_998_000 picoseconds.
Weight::from_parts(7_303_000, 0)
// Minimum execution time: 4_934_000 picoseconds.
Weight::from_parts(5_275_000, 0)
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
fn service_task_periodic() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 5_078_000 picoseconds.
Weight::from_parts(5_315_000, 0)
// Minimum execution time: 3_348_000 picoseconds.
Weight::from_parts(3_561_000, 0)
}
/// Storage: `SafeMode::EnteredUntil` (r:1 w:0)
/// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
/// Storage: `TxPause::PausedCalls` (r:1 w:0)
/// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`)
fn execute_dispatch_signed() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_228_000 picoseconds.
Weight::from_parts(2_352_000, 0)
// Measured: `145`
// Estimated: `3997`
// Minimum execution time: 6_395_000 picoseconds.
Weight::from_parts(6_642_000, 3997)
.saturating_add(RocksDbWeight::get().reads(2_u64))
}
fn execute_dispatch_unsigned() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 2_226_000 picoseconds.
Weight::from_parts(2_371_000, 0)
// Minimum execution time: 2_167_000 picoseconds.
Weight::from_parts(2_266_000, 0)
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 511]`.
fn schedule(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 12_683_000 picoseconds.
Weight::from_parts(16_951_846, 110487)
// Standard Error: 1_046
.saturating_add(Weight::from_parts(380_842, 0).saturating_mul(s.into()))
// Minimum execution time: 10_009_000 picoseconds.
Weight::from_parts(13_565_985, 110487)
// Standard Error: 575
.saturating_add(Weight::from_parts(354_760, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(1_u64))
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: Scheduler Lookup (r:0 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 512]`.
fn cancel(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 16_201_000 picoseconds.
Weight::from_parts(18_259_422, 110487)
// Standard Error: 1_344
.saturating_add(Weight::from_parts(545_863, 0).saturating_mul(s.into()))
// Minimum execution time: 14_048_000 picoseconds.
Weight::from_parts(15_141_696, 110487)
// Standard Error: 1_082
.saturating_add(Weight::from_parts(533_390, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(1_u64))
.saturating_add(RocksDbWeight::get().writes(2_u64))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[0, 511]`.
fn schedule_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `596 + s * (178 ±0)`
// Estimated: `110487`
// Minimum execution time: 16_180_000 picoseconds.
Weight::from_parts(25_128_925, 110487)
// Standard Error: 1_118
.saturating_add(Weight::from_parts(375_631, 0).saturating_mul(s.into()))
// Minimum execution time: 12_902_000 picoseconds.
Weight::from_parts(18_957_156, 110487)
// Standard Error: 792
.saturating_add(Weight::from_parts(361_909, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(2_u64))
.saturating_add(RocksDbWeight::get().writes(2_u64))
}
/// Storage: Scheduler Lookup (r:1 w:1)
/// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen)
/// Storage: Scheduler Agenda (r:1 w:1)
/// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen)
/// Storage: `Scheduler::Lookup` (r:1 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 512]`.
fn cancel_named(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `709 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 18_244_000 picoseconds.
Weight::from_parts(21_439_366, 110487)
// Standard Error: 1_084
.saturating_add(Weight::from_parts(557_691, 0).saturating_mul(s.into()))
// Minimum execution time: 15_933_000 picoseconds.
Weight::from_parts(18_091_415, 110487)
// Standard Error: 779
.saturating_add(Weight::from_parts(534_402, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(2_u64))
.saturating_add(RocksDbWeight::get().writes(2_u64))
}
/// Storage: `Scheduler::Retries` (r:1 w:2)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:1)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Lookup` (r:0 w:1)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// The range of component `s` is `[1, 512]`.
fn schedule_retry(s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `159`
// Estimated: `110487`
// Minimum execution time: 14_155_000 picoseconds.
Weight::from_parts(16_447_031, 110487)
// Standard Error: 233
.saturating_add(Weight::from_parts(8_424, 0).saturating_mul(s.into()))
.saturating_add(RocksDbWeight::get().reads(2_u64))
.saturating_add(RocksDbWeight::get().writes(4_u64))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 8_130_000 picoseconds.
Weight::from_parts(9_047_554, 110487)
.saturating_add(RocksDbWeight::get().reads(1_u64))
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn set_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `647 + s * (178 ±0)`
// Estimated: `110487`
// Minimum execution time: 10_838_000 picoseconds.
Weight::from_parts(12_804_076, 110487)
.saturating_add(RocksDbWeight::get().reads(2_u64))
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry() -> Weight {
// Proof Size summary in bytes:
// Measured: `81 + s * (177 ±0)`
// Estimated: `110487`
// Minimum execution time: 8_130_000 picoseconds.
Weight::from_parts(9_047_554, 110487)
.saturating_add(RocksDbWeight::get().reads(1_u64))
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
/// Storage: `Scheduler::Lookup` (r:1 w:0)
/// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Agenda` (r:1 w:0)
/// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`)
/// Storage: `Scheduler::Retries` (r:0 w:1)
/// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`)
fn cancel_retry_named() -> Weight {
// Proof Size summary in bytes:
// Measured: `647 + s * (178 ±0)`
// Estimated: `110487`
// Minimum execution time: 10_838_000 picoseconds.
Weight::from_parts(12_804_076, 110487)
.saturating_add(RocksDbWeight::get().reads(2_u64))
.saturating_add(RocksDbWeight::get().writes(1_u64))
}
}