diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs index fa0c2644421e..76ee06a87e8d 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use crate::*; +use crate::{xcm_config::LocationToAccountId, *}; use codec::{Decode, Encode}; use cumulus_pallet_parachain_system::RelaychainDataProvider; use cumulus_primitives_core::relay_chain; @@ -27,12 +27,14 @@ use frame_support::{ }, }; use frame_system::Pallet as System; -use pallet_broker::{CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf}; +use pallet_broker::{ + CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf, TaskId, +}; use parachains_common::{AccountId, Balance}; use rococo_runtime_constants::system_parachain::coretime; -use sp_runtime::traits::AccountIdConversion; +use sp_runtime::traits::{AccountIdConversion, MaybeConvert}; use xcm::latest::prelude::*; -use xcm_executor::traits::TransactAsset; +use xcm_executor::traits::{ConvertLocation, TransactAsset}; pub struct BurnCoretimeRevenue; impl OnUnbalanced> for BurnCoretimeRevenue { @@ -263,6 +265,15 @@ impl CoretimeInterface for CoretimeAllocator { } } +pub struct SovereignAccountOf; +impl MaybeConvert for SovereignAccountOf { + fn maybe_convert(id: TaskId) -> Option { + // Currently all tasks are parachains. + let location = Location::new(1, [Parachain(id)]); + LocationToAccountId::convert_location(&location) + } +} + impl pallet_broker::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -275,5 +286,7 @@ impl pallet_broker::Config for Runtime { type WeightInfo = weights::pallet_broker::WeightInfo; type PalletId = BrokerPalletId; type AdminOrigin = EnsureRoot; + type SovereignAccountOf = SovereignAccountOf; + type MaxAutoRenewals = ConstU32<100>; type PriceAdapter = pallet_broker::CenterTargetPrice; } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs index 83e80e2e91e7..35708f22de20 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs @@ -549,6 +549,44 @@ impl pallet_broker::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::PotentialRenewals` (r:1 w:2) + /// Proof: `Broker::PotentialRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Authorship::Author` (r:1 w:0) + /// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:0) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn enable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `914` + // Estimated: `4698` + // Minimum execution time: 51_938_000 picoseconds. + Weight::from_parts(55_025_000, 4698) + .saturating_add(T::DbWeight::get().reads(8_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + fn disable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `480` + // Estimated: `1516` + // Minimum execution time: 9_628_000 picoseconds. + Weight::from_parts(10_400_000, 1516) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs index 4f06e3e3669c..865ff68d4c65 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use crate::*; +use crate::{xcm_config::LocationToAccountId, *}; use codec::{Decode, Encode}; use cumulus_pallet_parachain_system::RelaychainDataProvider; use cumulus_primitives_core::relay_chain; @@ -28,13 +28,13 @@ use frame_support::{ }; use frame_system::Pallet as System; use pallet_broker::{ - CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf, Timeslice, + CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf, TaskId, Timeslice, }; use parachains_common::{AccountId, Balance}; -use sp_runtime::traits::AccountIdConversion; +use sp_runtime::traits::{AccountIdConversion, MaybeConvert}; use westend_runtime_constants::system_parachain::coretime; use xcm::latest::prelude::*; -use xcm_executor::traits::TransactAsset; +use xcm_executor::traits::{ConvertLocation, TransactAsset}; pub struct BurnCoretimeRevenue; impl OnUnbalanced> for BurnCoretimeRevenue { @@ -277,6 +277,15 @@ impl CoretimeInterface for CoretimeAllocator { } } +pub struct SovereignAccountOf; +impl MaybeConvert for SovereignAccountOf { + fn maybe_convert(id: TaskId) -> Option { + // Currently all tasks are parachains. + let location = Location::new(1, [Parachain(id)]); + LocationToAccountId::convert_location(&location) + } +} + impl pallet_broker::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -290,5 +299,7 @@ impl pallet_broker::Config for Runtime { type WeightInfo = weights::pallet_broker::WeightInfo; type PalletId = BrokerPalletId; type AdminOrigin = EnsureRoot; + type SovereignAccountOf = SovereignAccountOf; + type MaxAutoRenewals = ConstU32<20>; type PriceAdapter = pallet_broker::CenterTargetPrice; } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs index d130b306f7a5..74b1c4e47029 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs @@ -549,6 +549,44 @@ impl pallet_broker::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::PotentialRenewals` (r:1 w:2) + /// Proof: `Broker::PotentialRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Authorship::Author` (r:1 w:0) + /// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:0) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn enable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `914` + // Estimated: `4698` + // Minimum execution time: 51_938_000 picoseconds. + Weight::from_parts(55_025_000, 4698) + .saturating_add(T::DbWeight::get().reads(8_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + fn disable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `480` + // Estimated: `1516` + // Minimum execution time: 9_628_000 picoseconds. + Weight::from_parts(10_400_000, 1516) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn on_new_timeslice() -> Weight { diff --git a/prdoc/pr_4424.prdoc b/prdoc/pr_4424.prdoc new file mode 100644 index 000000000000..7131ebfca274 --- /dev/null +++ b/prdoc/pr_4424.prdoc @@ -0,0 +1,20 @@ +# 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: Coretime auto renewal + +doc: + - audience: Runtime User + description: | + With the additions in this PR, any task that utilizes a core that can be auto-renewed + can enable auto-renewal. The renewal is paid from the task's sovereign account. + The two new extrinsics for controlling auto-renewal are `enable_auto_renew` and + `disable_auto_renew`. + +crates: + - name: pallet-broker + bump: major + - name: coretime-rococo-runtime + bump: minor + - name: coretime-westend-runtime + bump: minor diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index fd8597563a02..a94838cf20c0 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -79,6 +79,7 @@ use pallet_nis::WithMaximumOf; use pallet_session::historical as pallet_session_historical; // Can't use `FungibleAdapter` here until Treasury pallet migrates to fungibles // +use pallet_broker::TaskId; #[allow(deprecated)] pub use pallet_transaction_payment::{CurrencyAdapter, Multiplier, TargetedFeeAdjustment}; use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; @@ -97,8 +98,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, NumberFor, - OpaqueKeys, SaturatedConversion, StaticLookup, + self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, + MaybeConvert, NumberFor, OpaqueKeys, SaturatedConversion, StaticLookup, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, @@ -2115,6 +2116,15 @@ impl CoretimeInterface for CoretimeProvider { } } +pub struct SovereignAccountOf; +// Dummy implementation which converts `TaskId` to `AccountId`. +impl MaybeConvert for SovereignAccountOf { + fn maybe_convert(task: TaskId) -> Option { + let mut account: [u8; 32] = [0; 32]; + account[..4].copy_from_slice(&task.to_le_bytes()); + Some(account.into()) + } +} impl pallet_broker::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -2127,6 +2137,8 @@ impl pallet_broker::Config for Runtime { type WeightInfo = (); type PalletId = BrokerPalletId; type AdminOrigin = EnsureRoot; + type SovereignAccountOf = SovereignAccountOf; + type MaxAutoRenewals = ConstU32<10>; type PriceAdapter = pallet_broker::CenterTargetPrice; } diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs index 33df56c95f65..595bf564f7e1 100644 --- a/substrate/frame/broker/src/benchmarking.rs +++ b/substrate/frame/broker/src/benchmarking.rs @@ -32,7 +32,10 @@ use frame_support::{ use frame_system::{Pallet as System, RawOrigin}; use sp_arithmetic::{traits::Zero, Perbill}; use sp_core::Get; -use sp_runtime::{traits::BlockNumberProvider, Saturating}; +use sp_runtime::{ + traits::{BlockNumberProvider, MaybeConvert}, + SaturatedConversion, Saturating, +}; const SEED: u32 = 0; const MAX_CORE_COUNT: u16 = 1_000; @@ -41,6 +44,10 @@ fn assert_last_event(generic_event: ::RuntimeEvent) { frame_system::Pallet::::assert_last_event(generic_event.into()); } +fn assert_has_event(generic_event: ::RuntimeEvent) { + frame_system::Pallet::::assert_has_event(generic_event.into()); +} + fn new_config_record() -> ConfigRecordOf { ConfigRecord { advance_notice: 2u32.into(), @@ -776,7 +783,7 @@ mod benches { } #[benchmark] - fn rotate_sale(n: Linear<0, { MAX_CORE_COUNT.into() }>) { + fn rotate_sale(n: Linear<0, { MAX_CORE_COUNT.into() }>) -> Result<(), BenchmarkError> { let core_count = n.try_into().unwrap(); let config = new_config_record::(); @@ -810,6 +817,27 @@ mod benches { // Assume Leases to be filled for worst case setup_leases::(T::MaxLeasedCores::get(), 1, 10); + // Assume max auto renewals for worst case. + (0..T::MaxAutoRenewals::get()).try_for_each(|indx| -> Result<(), BenchmarkError> { + let task = 1000 + indx; + let caller: T::AccountId = T::SovereignAccountOf::maybe_convert(task) + .expect("Failed to get sovereign account"); + T::Currency::set_balance( + &caller.clone(), + T::Currency::minimum_balance().saturating_add(100u32.into()), + ); + + let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + .map_err(|_| BenchmarkError::Weightless)?; + + Broker::::do_assign(region, None, task, Final) + .map_err(|_| BenchmarkError::Weightless)?; + + Broker::::do_enable_auto_renew(caller, region.core, task, None)?; + + Ok(()) + })?; + #[block] { Broker::::rotate_sale(sale.clone(), &config, &status); @@ -833,6 +861,30 @@ mod benches { } .into(), ); + + // Make sure all cores got renewed: + (0..T::MaxAutoRenewals::get()).for_each(|indx| { + let task = 1000 + indx; + let who = T::SovereignAccountOf::maybe_convert(task) + .expect("Failed to get sovereign account"); + assert_has_event::( + Event::Renewed { + who, + old_core: 10 + indx as u16, // first ten cores are allocated to leases. + core: 10 + indx as u16, + price: 10u32.saturated_into(), + begin: 7, + duration: 3, + workload: Schedule::truncate_from(vec![ScheduleItem { + assignment: Task(task), + mask: CoreMask::complete(), + }]), + } + .into(), + ); + }); + + Ok(()) } #[benchmark] @@ -960,6 +1012,101 @@ mod benches { Ok(()) } + #[benchmark] + fn enable_auto_renew() -> Result<(), BenchmarkError> { + let _core = setup_and_start_sale::()?; + + advance_to::(2); + + // We assume max auto renewals for worst case. + (0..T::MaxAutoRenewals::get() - 1).try_for_each(|indx| -> Result<(), BenchmarkError> { + let task = 1000 + indx; + let caller: T::AccountId = T::SovereignAccountOf::maybe_convert(task) + .expect("Failed to get sovereign account"); + T::Currency::set_balance( + &caller.clone(), + T::Currency::minimum_balance().saturating_add(100u32.into()), + ); + + let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + .map_err(|_| BenchmarkError::Weightless)?; + + Broker::::do_assign(region, None, task, Final) + .map_err(|_| BenchmarkError::Weightless)?; + + Broker::::do_enable_auto_renew(caller, region.core, task, Some(7))?; + + Ok(()) + })?; + + let caller: T::AccountId = + T::SovereignAccountOf::maybe_convert(2001).expect("Failed to get sovereign account"); + T::Currency::set_balance( + &caller.clone(), + T::Currency::minimum_balance().saturating_add(100u32.into()), + ); + + // The region for which we benchmark enable auto renew. + let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + .map_err(|_| BenchmarkError::Weightless)?; + Broker::::do_assign(region, None, 2001, Final) + .map_err(|_| BenchmarkError::Weightless)?; + + // The most 'intensive' path is when we renew the core upon enabling auto-renewal. + // Therefore, we advance to next bulk sale: + advance_to::(6); + + #[extrinsic_call] + _(RawOrigin::Signed(caller), region.core, 2001, None); + + assert_last_event::(Event::AutoRenewalEnabled { core: region.core, task: 2001 }.into()); + // Make sure we indeed renewed: + assert!(PotentialRenewals::::get(PotentialRenewalId { + core: region.core, + when: 10 // region end after renewal + }) + .is_some()); + + Ok(()) + } + + #[benchmark] + fn disable_auto_renew() -> Result<(), BenchmarkError> { + let _core = setup_and_start_sale::()?; + + advance_to::(2); + + // We assume max auto renewals for worst case. + (0..T::MaxAutoRenewals::get() - 1).try_for_each(|indx| -> Result<(), BenchmarkError> { + let task = 1000 + indx; + let caller: T::AccountId = T::SovereignAccountOf::maybe_convert(task) + .expect("Failed to get sovereign account"); + T::Currency::set_balance( + &caller.clone(), + T::Currency::minimum_balance().saturating_add(100u32.into()), + ); + + let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + .map_err(|_| BenchmarkError::Weightless)?; + + Broker::::do_assign(region, None, task, Final) + .map_err(|_| BenchmarkError::Weightless)?; + + Broker::::do_enable_auto_renew(caller, region.core, task, Some(7))?; + + Ok(()) + })?; + + let caller: T::AccountId = + T::SovereignAccountOf::maybe_convert(1000).expect("Failed to get sovereign account"); + #[extrinsic_call] + _(RawOrigin::Signed(caller), _core, 1000); + + assert_last_event::(Event::AutoRenewalDisabled { core: _core, task: 1000 }.into()); + + Ok(()) + } + #[benchmark] fn on_new_timeslice() -> Result<(), BenchmarkError> { setup_and_start_sale::()?; diff --git a/substrate/frame/broker/src/dispatchable_impls.rs b/substrate/frame/broker/src/dispatchable_impls.rs index a8ded084a801..5fbd957d7908 100644 --- a/substrate/frame/broker/src/dispatchable_impls.rs +++ b/substrate/frame/broker/src/dispatchable_impls.rs @@ -16,9 +16,8 @@ // limitations under the License. use super::*; -use coretime_interface::CoretimeInterface; use frame_support::{ - pallet_prelude::{DispatchResult, *}, + pallet_prelude::*, traits::{fungible::Mutate, tokens::Preservation::Expendable, DefensiveResult}, }; use sp_arithmetic::traits::{CheckedDiv, Saturating, Zero}; @@ -487,6 +486,72 @@ impl Pallet { Ok(()) } + pub(crate) fn do_enable_auto_renew( + sovereign_account: T::AccountId, + core: CoreIndex, + task: TaskId, + workload_end_hint: Option, + ) -> DispatchResult { + let sale = SaleInfo::::get().ok_or(Error::::NoSales)?; + + // Check if the core is expiring in the next bulk period; if so, we will renew it now. + // + // In case we renew it now, we don't need to check the workload end since we know it is + // eligible for renewal. + if PotentialRenewals::::get(PotentialRenewalId { core, when: sale.region_begin }) + .is_some() + { + Self::do_renew(sovereign_account.clone(), core)?; + } else if let Some(workload_end) = workload_end_hint { + ensure!( + PotentialRenewals::::get(PotentialRenewalId { core, when: workload_end }) + .is_some(), + Error::::NotAllowed + ); + } else { + return Err(Error::::NotAllowed.into()) + } + + // We are sorting auto renewals by `CoreIndex`. + AutoRenewals::::try_mutate(|renewals| { + let pos = renewals + .binary_search_by(|r: &AutoRenewalRecord| r.core.cmp(&core)) + .unwrap_or_else(|e| e); + renewals.try_insert( + pos, + AutoRenewalRecord { + core, + task, + next_renewal: workload_end_hint.unwrap_or(sale.region_end), + }, + ) + }) + .map_err(|_| Error::::TooManyAutoRenewals)?; + + Self::deposit_event(Event::AutoRenewalEnabled { core, task }); + Ok(()) + } + + pub(crate) fn do_disable_auto_renew(core: CoreIndex, task: TaskId) -> DispatchResult { + AutoRenewals::::try_mutate(|renewals| -> DispatchResult { + let pos = renewals + .binary_search_by(|r: &AutoRenewalRecord| r.core.cmp(&core)) + .map_err(|_| Error::::AutoRenewalNotEnabled)?; + + let renewal_record = renewals.get(pos).ok_or(Error::::AutoRenewalNotEnabled)?; + + ensure!( + renewal_record.core == core && renewal_record.task == task, + Error::::NoPermission + ); + renewals.remove(pos); + Ok(()) + })?; + + Self::deposit_event(Event::AutoRenewalDisabled { core, task }); + Ok(()) + } + pub(crate) fn ensure_cores_for_sale( status: &StatusRecord, sale: &SaleInfoRecordOf, diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs index 45c33c1bfa61..10745544fadf 100644 --- a/substrate/frame/broker/src/lib.rs +++ b/substrate/frame/broker/src/lib.rs @@ -65,7 +65,7 @@ pub mod pallet { PalletId, }; use frame_system::pallet_prelude::*; - use sp_runtime::traits::{Convert, ConvertBack}; + use sp_runtime::traits::{Convert, ConvertBack, MaybeConvert}; const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); @@ -101,6 +101,10 @@ pub mod pallet { type ConvertBalance: Convert, RelayBalanceOf> + ConvertBack, RelayBalanceOf>; + /// Type used for getting the associated account of a task. This account is controlled by + /// the task itself. + type SovereignAccountOf: MaybeConvert; + /// Identifier from which the internal Pot is generated. #[pallet::constant] type PalletId: Get; @@ -116,6 +120,9 @@ pub mod pallet { /// Maximum number of system cores. #[pallet::constant] type MaxReservedCores: Get; + + #[pallet::constant] + type MaxAutoRenewals: Get; } /// The current configuration of this pallet. @@ -176,6 +183,13 @@ pub mod pallet { #[pallet::storage] pub type CoreCountInbox = StorageValue<_, CoreIndex, OptionQuery>; + /// Keeping track of cores which have auto-renewal enabled. + /// + /// Sorted by `CoreIndex` to make the removal of cores from auto-renewal more efficient. + #[pallet::storage] + pub type AutoRenewals = + StorageValue<_, BoundedVec, ValueQuery>; + /// Received revenue info from the relay chain. #[pallet::storage] pub type RevenueInbox = StorageValue<_, OnDemandRevenueRecordOf, OptionQuery>; @@ -426,6 +440,33 @@ pub mod pallet { /// The core whose workload is no longer available to be renewed for `when`. core: CoreIndex, }, + AutoRenewalEnabled { + /// The core for which the renewal was enabled. + core: CoreIndex, + /// The task for which the renewal was enabled. + task: TaskId, + }, + AutoRenewalDisabled { + /// The core for which the renewal was disabled. + core: CoreIndex, + /// The task for which the renewal was disabled. + task: TaskId, + }, + /// Failed to auto-renew a core, likely due to the payer account not being sufficiently + /// funded. + AutoRenewalFailed { + /// The core for which the renewal failed. + core: CoreIndex, + /// The account which was supposed to pay for renewal. + /// + /// If `None` it indicates that we failed to get the sovereign account of a task. + payer: Option, + }, + /// The auto-renewal limit has been reached upon renewing cores. + /// + /// This should never happen, given that enable_auto_renew checks for this before enabling + /// auto-renewal. + AutoRenewalLimitReached, } #[pallet::error] @@ -492,6 +533,16 @@ pub mod pallet { InvalidConfig, /// The revenue must be claimed for 1 or more timeslices. NoClaimTimeslices, + /// The caller doesn't have the permission to enable or disable auto-renewal. + NoPermission, + /// We reached the limit for auto-renewals. + TooManyAutoRenewals, + /// Only cores which are assigned to a task can be auto-renewed. + NonTaskAutoRenewal, + /// Failed to get the sovereign account of a task. + SovereignAccountNotFound, + /// Attempted to disable auto-renewal for a core that didn't have it enabled. + AutoRenewalNotEnabled, } #[derive(frame_support::DefaultNoBound)] @@ -835,6 +886,62 @@ pub mod pallet { Ok(()) } + /// Extrinsic for enabling auto renewal. + /// + /// Callable by the sovereign account of the task on the specified core. This account + /// will be charged at the start of every bulk period for renewing core time. + /// + /// - `origin`: Must be the sovereign account of the task + /// - `core`: The core to which the task to be renewed is currently assigned. + /// - `task`: The task for which we want to enable auto renewal. + /// - `workload_end_hint`: should be used when enabling auto-renewal for a core that is not + /// expiring in the upcoming bulk period (e.g., due to holding a lease) since it would be + /// inefficient to look up when the core expires to schedule the next renewal. + #[pallet::call_index(21)] + #[pallet::weight(T::WeightInfo::enable_auto_renew())] + pub fn enable_auto_renew( + origin: OriginFor, + core: CoreIndex, + task: TaskId, + workload_end_hint: Option, + ) -> DispatchResult { + let who = ensure_signed(origin)?; + + let sovereign_account = T::SovereignAccountOf::maybe_convert(task) + .ok_or(Error::::SovereignAccountNotFound)?; + // Only the sovereign account of a task can enable auto renewal for its own core. + ensure!(who == sovereign_account, Error::::NoPermission); + + Self::do_enable_auto_renew(sovereign_account, core, task, workload_end_hint)?; + Ok(()) + } + + /// Extrinsic for disabling auto renewal. + /// + /// Callable by the sovereign account of the task on the specified core. + /// + /// - `origin`: Must be the sovereign account of the task. + /// - `core`: The core for which we want to disable auto renewal. + /// - `task`: The task for which we want to disable auto renewal. + #[pallet::call_index(22)] + #[pallet::weight(T::WeightInfo::disable_auto_renew())] + pub fn disable_auto_renew( + origin: OriginFor, + core: CoreIndex, + task: TaskId, + ) -> DispatchResult { + let who = ensure_signed(origin)?; + + let sovereign_account = T::SovereignAccountOf::maybe_convert(task) + .ok_or(Error::::SovereignAccountNotFound)?; + // Only the sovereign account of the task can disable auto-renewal. + ensure!(who == sovereign_account, Error::::NoPermission); + + Self::do_disable_auto_renew(core, task)?; + + Ok(()) + } + #[pallet::call_index(99)] #[pallet::weight(T::WeightInfo::swap_leases())] pub fn swap_leases(origin: OriginFor, id: TaskId, other: TaskId) -> DispatchResult { diff --git a/substrate/frame/broker/src/mock.rs b/substrate/frame/broker/src/mock.rs index 6b1d2bbf7015..42377eefdb22 100644 --- a/substrate/frame/broker/src/mock.rs +++ b/substrate/frame/broker/src/mock.rs @@ -32,7 +32,7 @@ use frame_system::{EnsureRoot, EnsureSignedBy}; use sp_arithmetic::Perbill; use sp_core::{ConstU32, ConstU64, Get}; use sp_runtime::{ - traits::{BlockNumberProvider, Identity}, + traits::{BlockNumberProvider, Identity, MaybeConvert}, BuildStorage, Saturating, }; @@ -180,6 +180,14 @@ ord_parameter_types! { } type EnsureOneOrRoot = EitherOfDiverse, EnsureSignedBy>; +// Dummy implementation which converts `TaskId` to `AccountId`. +pub struct SovereignAccountOf; +impl MaybeConvert for SovereignAccountOf { + fn maybe_convert(task: TaskId) -> Option { + Some(task.into()) + } +} + impl crate::Config for Test { type RuntimeEvent = RuntimeEvent; type Currency = ItemOf, ()>, (), u64>; @@ -192,6 +200,8 @@ impl crate::Config for Test { type WeightInfo = (); type PalletId = TestBrokerId; type AdminOrigin = EnsureOneOrRoot; + type SovereignAccountOf = SovereignAccountOf; + type MaxAutoRenewals = ConstU32<3>; type PriceAdapter = CenterTargetPrice>; } @@ -246,6 +256,10 @@ pub fn new_config() -> ConfigRecordOf { } } +pub fn endow(who: u64, amount: u64) { + assert_ok!(<::Currency as Mutate<_>>::mint_into(&who, amount)); +} + pub struct TestExt(ConfigRecordOf); #[allow(dead_code)] impl TestExt { @@ -298,7 +312,7 @@ impl TestExt { } pub fn endow(self, who: u64, amount: u64) -> Self { - assert_ok!(<::Currency as Mutate<_>>::mint_into(&who, amount)); + endow(who, amount); self } diff --git a/substrate/frame/broker/src/tests.rs b/substrate/frame/broker/src/tests.rs index 3ea68c5a74d6..f3fd5234e4ca 100644 --- a/substrate/frame/broker/src/tests.rs +++ b/substrate/frame/broker/src/tests.rs @@ -1530,6 +1530,294 @@ fn renewal_works_leases_ended_before_start_sales() { }); } +#[test] +fn enable_auto_renew_works() { + TestExt::new().endow(1, 1000).limit_cores_offered(Some(10)).execute_with(|| { + assert_ok!(Broker::do_start_sales(100, 5)); + advance_to(2); + let region_id = Broker::do_purchase(1, u64::max_value()).unwrap(); + let record = Regions::::get(region_id).unwrap(); + + // Cannot enable auto renewal with provisional finality: + assert_ok!(Broker::do_assign(region_id, Some(1), 1001, Provisional)); + assert_noop!( + Broker::do_enable_auto_renew(1001, region_id.core, 1001, Some(7)), + Error::::NotAllowed + ); + + // Eligible for renewal after final assignment: + assert_ok!(Broker::do_assign(region_id, Some(1), 1001, Final)); + assert!(PotentialRenewals::::get(PotentialRenewalId { + core: region_id.core, + when: record.end + }) + .is_some()); + + // Only the task's sovereign account can enable auto renewal. + assert_noop!( + Broker::enable_auto_renew(RuntimeOrigin::signed(1), region_id.core, 1001, Some(7)), + Error::::NoPermission + ); + + // Works when calling with the sovereign account: + assert_ok!(Broker::do_enable_auto_renew(1001, region_id.core, 1001, Some(7))); + assert_eq!( + AutoRenewals::::get().to_vec(), + vec![AutoRenewalRecord { core: 0, task: 1001, next_renewal: 7 }] + ); + System::assert_has_event( + Event::::AutoRenewalEnabled { core: region_id.core, task: 1001 }.into(), + ); + + // Enabling auto-renewal for more cores to ensure they are sorted based on core index. + let region_2 = Broker::do_purchase(1, u64::max_value()).unwrap(); + let region_3 = Broker::do_purchase(1, u64::max_value()).unwrap(); + assert_ok!(Broker::do_assign(region_2, Some(1), 1002, Final)); + assert_ok!(Broker::do_assign(region_3, Some(1), 1003, Final)); + assert_ok!(Broker::do_enable_auto_renew(1003, region_3.core, 1003, Some(7))); + assert_ok!(Broker::do_enable_auto_renew(1002, region_2.core, 1002, Some(7))); + + assert_eq!( + AutoRenewals::::get().to_vec(), + vec![ + AutoRenewalRecord { core: 0, task: 1001, next_renewal: 7 }, + AutoRenewalRecord { core: 1, task: 1002, next_renewal: 7 }, + AutoRenewalRecord { core: 2, task: 1003, next_renewal: 7 }, + ] + ); + + // Ensure that we cannot enable more auto renewals than `MaxAutoRenewals`. + // We already enabled it for three cores, and the limit is set to 3. + let region_4 = Broker::do_purchase(1, u64::max_value()).unwrap(); + assert_ok!(Broker::do_assign(region_4, Some(1), 1004, Final)); + + assert_noop!( + Broker::do_enable_auto_renew(1004, region_4.core, 1004, Some(7)), + Error::::TooManyAutoRenewals + ); + }); +} + +#[test] +fn enable_auto_renewal_works_for_legacy_leases() { + TestExt::new().endow(1, 1000).execute_with(|| { + // With this test, we ensure that we don't renew unnecessarily if the task has Coretime + // reserved (due to having a lease) + + assert_ok!(Broker::do_start_sales(100, 1)); + advance_to(2); + + let record = PotentialRenewalRecord { + price: 100, + completion: CompletionStatus::Complete( + vec![ScheduleItem { mask: CoreMask::complete(), assignment: Task(1001) }] + .try_into() + .unwrap(), + ), + }; + // For lease holding tasks, the renewal record is set for when the lease expires, which is + // likely further in the future than the start of the next sale. + PotentialRenewals::::insert(PotentialRenewalId { core: 0, when: 10 }, &record); + + endow(1001, 1000); + + // Will fail if we don't provide the end hint since it expects renewal record to be at next + // sale start. + assert_noop!(Broker::do_enable_auto_renew(1001, 0, 1001, None), Error::::NotAllowed); + + assert_ok!(Broker::do_enable_auto_renew(1001, 0, 1001, Some(10))); + assert_eq!( + AutoRenewals::::get().to_vec(), + vec![AutoRenewalRecord { core: 0, task: 1001, next_renewal: 10 },] + ); + System::assert_has_event(Event::::AutoRenewalEnabled { core: 0, task: 1001 }.into()); + + // Next cycle starting at 7. + advance_to(7); + + // Ensure that the renewal didn't happen by checking that the balance remained the same, as + // there is still no need to renew. + assert_eq!(balance(1001), 1000); + + // The next sale starts at 13. The renewal should happen now and the account should be + // charged. + advance_to(13); + assert_eq!(balance(1001), 900); + + // Make sure that the renewal happened: + System::assert_has_event( + Event::::Renewed { + who: 1001, // sovereign account + old_core: 0, + core: 0, + price: 100, + begin: 10, + duration: 3, + workload: Schedule::truncate_from(vec![ScheduleItem { + assignment: Task(1001), + mask: CoreMask::complete(), + }]), + } + .into(), + ); + }); +} + +#[test] +fn enable_auto_renew_renews() { + TestExt::new().endow(1, 1000).execute_with(|| { + assert_ok!(Broker::do_start_sales(100, 1)); + advance_to(2); + let region_id = Broker::do_purchase(1, u64::max_value()).unwrap(); + + assert_ok!(Broker::do_assign(region_id, Some(1), 1001, Final)); + // advance to next bulk sale: + advance_to(6); + + // Since we didn't renew for the next bulk period, enabling auto-renewal will renew, + // ensuring the task continues execution. + + // Will fail because we didn't fund the sovereign account: + assert_noop!( + Broker::do_enable_auto_renew(1001, region_id.core, 1001, None), + TokenError::FundsUnavailable + ); + + // Will succeed after funding the sovereign account: + endow(1001, 1000); + + assert_ok!(Broker::do_enable_auto_renew(1001, region_id.core, 1001, None)); + assert_eq!( + AutoRenewals::::get().to_vec(), + vec![AutoRenewalRecord { core: 0, task: 1001, next_renewal: 10 }] + ); + assert!(PotentialRenewals::::get(PotentialRenewalId { + core: region_id.core, + when: 10 + }) + .is_some()); + + System::assert_has_event( + Event::::AutoRenewalEnabled { core: region_id.core, task: 1001 }.into(), + ); + }); +} + +#[test] +fn auto_renewal_works() { + TestExt::new().endow(1, 1000).execute_with(|| { + assert_ok!(Broker::do_start_sales(100, 3)); + advance_to(2); + let region_1 = Broker::do_purchase(1, u64::max_value()).unwrap(); + let region_2 = Broker::do_purchase(1, u64::max_value()).unwrap(); + let region_3 = Broker::do_purchase(1, u64::max_value()).unwrap(); + + // Eligible for renewal after final assignment: + assert_ok!(Broker::do_assign(region_1, Some(1), 1001, Final)); + assert_ok!(Broker::do_assign(region_2, Some(1), 1002, Final)); + assert_ok!(Broker::do_assign(region_3, Some(1), 1003, Final)); + assert_ok!(Broker::do_enable_auto_renew(1001, region_1.core, 1001, Some(7))); + assert_ok!(Broker::do_enable_auto_renew(1002, region_2.core, 1002, Some(7))); + assert_ok!(Broker::do_enable_auto_renew(1003, region_3.core, 1003, Some(7))); + assert_eq!( + AutoRenewals::::get().to_vec(), + vec![ + AutoRenewalRecord { core: 0, task: 1001, next_renewal: 7 }, + AutoRenewalRecord { core: 1, task: 1002, next_renewal: 7 }, + AutoRenewalRecord { core: 2, task: 1003, next_renewal: 7 }, + ] + ); + + // We have to fund the sovereign account: + endow(1001, 1000); + // We skip funding the sovereign account of task 1002 on purpose. + endow(1003, 1000); + + // Next cycle starting at 7. + advance_to(7); + System::assert_has_event( + Event::::Renewed { + who: 1001, // sovereign account + old_core: 0, + core: 0, + price: 100, + begin: 7, + duration: 3, + workload: Schedule::truncate_from(vec![ScheduleItem { + assignment: Task(1001), + mask: CoreMask::complete(), + }]), + } + .into(), + ); + // Sovereign account wasn't funded so it fails: + System::assert_has_event( + Event::::AutoRenewalFailed { core: 1, payer: Some(1002) }.into(), + ); + System::assert_has_event( + Event::::Renewed { + who: 1003, // sovereign account + old_core: 2, + core: 1, // Core #1 didn't get renewed, so core #2 will take its place. + price: 100, + begin: 7, + duration: 3, + workload: Schedule::truncate_from(vec![ScheduleItem { + assignment: Task(1003), + mask: CoreMask::complete(), + }]), + } + .into(), + ); + + // Given that core #1 didn't get renewed due to the account not being sufficiently funded, + // Task (1003) will now be assigned to that core instead of core #2. + assert_eq!( + AutoRenewals::::get().to_vec(), + vec![ + AutoRenewalRecord { core: 0, task: 1001, next_renewal: 10 }, + AutoRenewalRecord { core: 1, task: 1003, next_renewal: 10 }, + ] + ); + }); +} + +#[test] +fn disable_auto_renew_works() { + TestExt::new().endow(1, 1000).limit_cores_offered(Some(10)).execute_with(|| { + assert_ok!(Broker::do_start_sales(100, 3)); + advance_to(2); + let region_id = Broker::do_purchase(1, u64::max_value()).unwrap(); + + // Eligible for renewal after final assignment: + assert_ok!(Broker::do_assign(region_id, Some(1), 1001, Final)); + + // Cannot disable auto-renewal if we don't have it enabled. + assert_noop!( + Broker::do_disable_auto_renew(region_id.core, 1001), + Error::::AutoRenewalNotEnabled + ); + + assert_ok!(Broker::do_enable_auto_renew(1001, region_id.core, 1001, Some(7))); + assert_eq!( + AutoRenewals::::get().to_vec(), + vec![AutoRenewalRecord { core: 0, task: 1001, next_renewal: 7 }] + ); + + // Only the sovereign account can disable: + assert_noop!( + Broker::disable_auto_renew(RuntimeOrigin::signed(1), 0, 1001), + Error::::NoPermission + ); + assert_ok!(Broker::do_disable_auto_renew(0, 1001)); + + assert_eq!(AutoRenewals::::get().to_vec(), vec![]); + System::assert_has_event( + Event::::AutoRenewalDisabled { core: region_id.core, task: 1001 }.into(), + ); + }); +} + #[test] fn start_sales_sets_correct_core_count() { TestExt::new().endow(1, 1000).execute_with(|| { diff --git a/substrate/frame/broker/src/tick_impls.rs b/substrate/frame/broker/src/tick_impls.rs index 71a1286d7391..8dbd5df57166 100644 --- a/substrate/frame/broker/src/tick_impls.rs +++ b/substrate/frame/broker/src/tick_impls.rs @@ -19,7 +19,7 @@ use super::*; use alloc::{vec, vec::Vec}; use frame_support::{pallet_prelude::*, traits::defensive_prelude::*, weights::WeightMeter}; use sp_arithmetic::traits::{One, SaturatedConversion, Saturating, Zero}; -use sp_runtime::traits::ConvertBack; +use sp_runtime::traits::{ConvertBack, MaybeConvert}; use CompletionStatus::Complete; impl Pallet { @@ -263,6 +263,9 @@ impl Pallet { }; SaleInfo::::put(&new_sale); + + Self::renew_cores(&new_sale); + Self::deposit_event(Event::SaleInitialized { sale_start, leadin_length, @@ -334,4 +337,50 @@ impl Pallet { T::Coretime::assign_core(core, rc_begin, assignment.clone(), None); Self::deposit_event(Event::::CoreAssigned { core, when: rc_begin, assignment }); } + + /// Renews all the cores which have auto-renewal enabled. + pub(crate) fn renew_cores(sale: &SaleInfoRecordOf) { + let renewals = AutoRenewals::::get(); + + let Ok(auto_renewals) = renewals + .into_iter() + .flat_map(|record| { + // Check if the next renewal is scheduled further in the future than the start of + // the next region beginning. If so, we skip the renewal for this core. + if sale.region_begin < record.next_renewal { + return Some(record) + } + + let Some(payer) = T::SovereignAccountOf::maybe_convert(record.task) else { + Self::deposit_event(Event::::AutoRenewalFailed { + core: record.core, + payer: None, + }); + return None + }; + + if let Ok(new_core_index) = Self::do_renew(payer.clone(), record.core) { + Some(AutoRenewalRecord { + core: new_core_index, + task: record.task, + next_renewal: sale.region_end, + }) + } else { + Self::deposit_event(Event::::AutoRenewalFailed { + core: record.core, + payer: Some(payer), + }); + + None + } + }) + .collect::>() + .try_into() + else { + Self::deposit_event(Event::::AutoRenewalLimitReached); + return; + }; + + AutoRenewals::::set(auto_renewals); + } } diff --git a/substrate/frame/broker/src/types.rs b/substrate/frame/broker/src/types.rs index dcfa9a77e4f3..10e6756bc90e 100644 --- a/substrate/frame/broker/src/types.rs +++ b/substrate/frame/broker/src/types.rs @@ -311,3 +311,16 @@ where Ok(()) } } + +/// A record containing information regarding auto-renewal for a specific core. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct AutoRenewalRecord { + /// The core for which auto renewal is enabled. + pub core: CoreIndex, + /// The task assigned to the core. We keep track of it so we don't have to look it up when + /// performing auto-renewal. + pub task: TaskId, + /// Specifies when the upcoming renewal should be performed. This is used for lease holding + /// tasks to ensure that the renewal process does not begin until the lease expires. + pub next_renewal: Timeslice, +} diff --git a/substrate/frame/broker/src/utility_impls.rs b/substrate/frame/broker/src/utility_impls.rs index 5c66ebb9674b..e937e0cbbec5 100644 --- a/substrate/frame/broker/src/utility_impls.rs +++ b/substrate/frame/broker/src/utility_impls.rs @@ -17,7 +17,7 @@ use super::*; use frame_support::{ - pallet_prelude::{DispatchResult, *}, + pallet_prelude::*, traits::{ fungible::Balanced, tokens::{Fortitude::Polite, Precision::Exact, Preservation::Expendable}, diff --git a/substrate/frame/broker/src/weights.rs b/substrate/frame/broker/src/weights.rs index 4889c2577ddd..2f25fddc2050 100644 --- a/substrate/frame/broker/src/weights.rs +++ b/substrate/frame/broker/src/weights.rs @@ -18,25 +18,27 @@ //! Autogenerated weights for `pallet_broker` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-x5tnzzy-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `sergej-B650-AORUS-ELITE-AX`, CPU: `AMD Ryzen 9 7900X3D 12-Core Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/release/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_broker +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_broker -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/broker/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -79,6 +81,8 @@ pub trait WeightInfo { fn do_tick_base() -> Weight; fn swap_leases() -> Weight; fn on_new_timeslice() -> Weight; + fn enable_auto_renew() -> Weight; + fn disable_auto_renew() -> Weight; } /// Weights for `pallet_broker` using the Substrate node and recommended hardware. @@ -90,8 +94,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_977_000 picoseconds. - Weight::from_parts(2_114_000, 0) + // Minimum execution time: 1_593_000 picoseconds. + Weight::from_parts(1_703_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Broker::Reservations` (r:1 w:1) @@ -100,8 +104,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `5016` // Estimated: `7496` - // Minimum execution time: 16_880_000 picoseconds. - Weight::from_parts(17_506_000, 7496) + // Minimum execution time: 12_864_000 picoseconds. + Weight::from_parts(13_174_000, 7496) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -111,8 +115,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6218` // Estimated: `7496` - // Minimum execution time: 15_569_000 picoseconds. - Weight::from_parts(16_123_000, 7496) + // Minimum execution time: 12_284_000 picoseconds. + Weight::from_parts(13_566_000, 7496) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -122,8 +126,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 8_962_000 picoseconds. - Weight::from_parts(9_389_000, 1526) + // Minimum execution time: 6_743_000 picoseconds. + Weight::from_parts(7_094_000, 1526) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -135,6 +139,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(101), added: 596, mode: `MaxEncodedLen`) /// Storage: `Broker::SaleInfo` (r:0 w:1) /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) /// Storage: `Broker::Status` (r:0 w:1) @@ -146,12 +152,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6330` // Estimated: `8499` - // Minimum execution time: 27_119_000 picoseconds. - Weight::from_parts(47_930_900, 8499) - // Standard Error: 464 - .saturating_add(Weight::from_parts(2_940, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(6_u64)) - .saturating_add(T::DbWeight::get().writes(15_u64)) + // Minimum execution time: 21_120_000 picoseconds. + Weight::from_parts(40_929_422, 8499) + // Standard Error: 471 + .saturating_add(Weight::from_parts(1_004, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(7_u64)) + .saturating_add(T::DbWeight::get().writes(16_u64)) } /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) @@ -167,8 +173,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `651` // Estimated: `2136` - // Minimum execution time: 42_429_000 picoseconds. - Weight::from_parts(43_538_000, 2136) + // Minimum execution time: 31_169_000 picoseconds. + Weight::from_parts(32_271_000, 2136) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -190,8 +196,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `769` // Estimated: `4698` - // Minimum execution time: 62_957_000 picoseconds. - Weight::from_parts(66_821_000, 4698) + // Minimum execution time: 44_945_000 picoseconds. + Weight::from_parts(47_119_000, 4698) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -201,8 +207,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 16_146_000 picoseconds. - Weight::from_parts(16_775_000, 3551) + // Minimum execution time: 11_562_000 picoseconds. + Weight::from_parts(11_943_000, 3551) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -212,8 +218,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 17_720_000 picoseconds. - Weight::from_parts(18_916_000, 3551) + // Minimum execution time: 13_075_000 picoseconds. + Weight::from_parts(13_616_000, 3551) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -223,8 +229,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 19_088_000 picoseconds. - Weight::from_parts(19_732_000, 3551) + // Minimum execution time: 13_695_000 picoseconds. + Weight::from_parts(14_658_000, 3551) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -240,8 +246,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `741` // Estimated: `4681` - // Minimum execution time: 30_522_000 picoseconds. - Weight::from_parts(31_573_000, 4681) + // Minimum execution time: 22_623_000 picoseconds. + Weight::from_parts(23_233_000, 4681) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -259,8 +265,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `776` // Estimated: `5996` - // Minimum execution time: 35_833_000 picoseconds. - Weight::from_parts(36_830_000, 5996) + // Minimum execution time: 26_901_000 picoseconds. + Weight::from_parts(27_472_000, 5996) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -273,12 +279,12 @@ impl WeightInfo for SubstrateWeight { /// The range of component `m` is `[1, 3]`. fn claim_revenue(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `859` + // Measured: `878` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 65_882_000 picoseconds. - Weight::from_parts(67_506_904, 6196) - // Standard Error: 49_386 - .saturating_add(Weight::from_parts(1_197_959, 0).saturating_mul(m.into())) + // Minimum execution time: 51_778_000 picoseconds. + Weight::from_parts(53_726_731, 6196) + // Standard Error: 45_279 + .saturating_add(Weight::from_parts(677_769, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5_u64)) @@ -290,8 +296,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 41_860_000 picoseconds. - Weight::from_parts(42_478_000, 3593) + // Minimum execution time: 31_790_000 picoseconds. + Weight::from_parts(32_601_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -303,8 +309,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `604` // Estimated: `3551` - // Minimum execution time: 32_593_000 picoseconds. - Weight::from_parts(35_399_000, 3551) + // Minimum execution time: 18_465_000 picoseconds. + Weight::from_parts(21_050_000, 3551) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -318,8 +324,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `601` // Estimated: `3533` - // Minimum execution time: 41_934_000 picoseconds. - Weight::from_parts(50_480_000, 3533) + // Minimum execution time: 23_825_000 picoseconds. + Weight::from_parts(26_250_000, 3533) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -333,10 +339,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn drop_history() -> Weight { // Proof Size summary in bytes: - // Measured: `995` + // Measured: `1014` // Estimated: `3593` - // Minimum execution time: 47_167_000 picoseconds. - Weight::from_parts(54_289_000, 3593) + // Minimum execution time: 28_103_000 picoseconds. + Weight::from_parts(32_622_000, 3593) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -348,20 +354,18 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `661` // Estimated: `4698` - // Minimum execution time: 29_755_000 picoseconds. - Weight::from_parts(32_857_000, 4698) + // Minimum execution time: 16_751_000 picoseconds. + Weight::from_parts(17_373_000, 4698) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// The range of component `n` is `[0, 1000]`. - fn request_core_count(n: u32, ) -> Weight { + fn request_core_count(_n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_793_000 picoseconds. - Weight::from_parts(4_086_907, 0) - // Standard Error: 14 - .saturating_add(Weight::from_parts(60, 0).saturating_mul(n.into())) + // Minimum execution time: 2_705_000 picoseconds. + Weight::from_parts(2_991_768, 0) } /// Storage: `Broker::CoreCountInbox` (r:1 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -370,13 +374,13 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `404` // Estimated: `1487` - // Minimum execution time: 6_262_000 picoseconds. - Weight::from_parts(6_734_896, 1487) + // Minimum execution time: 4_598_000 picoseconds. + Weight::from_parts(4_937_302, 1487) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: `Broker::RevenueInbox` (r:1 w:1) - /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:1 w:1) @@ -387,32 +391,20 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `829` - // Estimated: `3593` - // Minimum execution time: 39_812_000 picoseconds. - Weight::from_parts(41_227_000, 3593) + // Measured: `991` + // Estimated: `4456` + // Minimum execution time: 37_601_000 picoseconds. + Weight::from_parts(38_262_000, 4456) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: `Broker::InstaPoolIo` (r:3 w:3) - /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) - /// Storage: `Broker::Reservations` (r:1 w:0) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) - /// Storage: `Broker::Leases` (r:1 w:1) - /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) - /// Storage: `Broker::SaleInfo` (r:0 w:1) - /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) - /// Storage: `Broker::Workplan` (r:0 w:10) - /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn rotate_sale(_n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6281` - // Estimated: `8499` - // Minimum execution time: 34_576_000 picoseconds. - Weight::from_parts(36_303_629, 8499) - .saturating_add(T::DbWeight::get().reads(5_u64)) - .saturating_add(T::DbWeight::get().writes(15_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) } /// Storage: `Broker::InstaPoolIo` (r:1 w:0) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) @@ -422,8 +414,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `180` // Estimated: `3493` - // Minimum execution time: 6_978_000 picoseconds. - Weight::from_parts(7_206_000, 3493) + // Minimum execution time: 5_391_000 picoseconds. + Weight::from_parts(5_630_000, 3493) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -435,8 +427,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1423` // Estimated: `4681` - // Minimum execution time: 15_063_000 picoseconds. - Weight::from_parts(15_463_000, 4681) + // Minimum execution time: 10_249_000 picoseconds. + Weight::from_parts(10_529_000, 4681) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -444,8 +436,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 126_000 picoseconds. - Weight::from_parts(157_000, 0) + // Minimum execution time: 120_000 picoseconds. + Weight::from_parts(140_000, 0) } /// Storage: `Broker::CoreCountInbox` (r:0 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -453,8 +445,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_803_000 picoseconds. - Weight::from_parts(1_965_000, 0) + // Minimum execution time: 1_402_000 picoseconds. + Weight::from_parts(1_513_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Broker::RevenueInbox` (r:0 w:1) @@ -473,16 +465,16 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) /// Storage: `Broker::CoreCountInbox` (r:1 w:0) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `Broker::RevenueInbox` (r:1 w:0) - /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `441` - // Estimated: `1516` - // Minimum execution time: 9_313_000 picoseconds. - Weight::from_parts(9_699_000, 1516) + // Measured: `603` + // Estimated: `4068` + // Minimum execution time: 8_897_000 picoseconds. + Weight::from_parts(9_218_000, 4068) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Broker::Leases` (r:1 w:1) /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) @@ -490,8 +482,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 5_984_000 picoseconds. - Weight::from_parts(6_296_000, 1526) + // Minimum execution time: 4_678_000 picoseconds. + Weight::from_parts(4_920_000, 1526) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -502,6 +494,44 @@ impl WeightInfo for SubstrateWeight { // Minimum execution time: 229_000 picoseconds. Weight::from_parts(268_000, 0) } + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::PotentialRenewals` (r:1 w:2) + /// Proof: `Broker::PotentialRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Authorship::Author` (r:1 w:0) + /// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:0) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(101), added: 596, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn enable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `930` + // Estimated: `4698` + // Minimum execution time: 51_597_000 picoseconds. + Weight::from_parts(52_609_000, 4698) + .saturating_add(T::DbWeight::get().reads(8_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(101), added: 596, mode: `MaxEncodedLen`) + fn disable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `484` + // Estimated: `1586` + // Minimum execution time: 8_907_000 picoseconds. + Weight::from_parts(9_167_000, 1586) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } } // For backwards compatibility and tests. @@ -512,8 +542,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_977_000 picoseconds. - Weight::from_parts(2_114_000, 0) + // Minimum execution time: 1_593_000 picoseconds. + Weight::from_parts(1_703_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Broker::Reservations` (r:1 w:1) @@ -522,8 +552,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `5016` // Estimated: `7496` - // Minimum execution time: 16_880_000 picoseconds. - Weight::from_parts(17_506_000, 7496) + // Minimum execution time: 12_864_000 picoseconds. + Weight::from_parts(13_174_000, 7496) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -533,8 +563,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6218` // Estimated: `7496` - // Minimum execution time: 15_569_000 picoseconds. - Weight::from_parts(16_123_000, 7496) + // Minimum execution time: 12_284_000 picoseconds. + Weight::from_parts(13_566_000, 7496) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -544,8 +574,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 8_962_000 picoseconds. - Weight::from_parts(9_389_000, 1526) + // Minimum execution time: 6_743_000 picoseconds. + Weight::from_parts(7_094_000, 1526) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -557,6 +587,8 @@ impl WeightInfo for () { /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(101), added: 596, mode: `MaxEncodedLen`) /// Storage: `Broker::SaleInfo` (r:0 w:1) /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) /// Storage: `Broker::Status` (r:0 w:1) @@ -568,12 +600,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6330` // Estimated: `8499` - // Minimum execution time: 27_119_000 picoseconds. - Weight::from_parts(47_930_900, 8499) - // Standard Error: 464 - .saturating_add(Weight::from_parts(2_940, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(6_u64)) - .saturating_add(RocksDbWeight::get().writes(15_u64)) + // Minimum execution time: 21_120_000 picoseconds. + Weight::from_parts(40_929_422, 8499) + // Standard Error: 471 + .saturating_add(Weight::from_parts(1_004, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().writes(16_u64)) } /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) @@ -589,8 +621,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `651` // Estimated: `2136` - // Minimum execution time: 42_429_000 picoseconds. - Weight::from_parts(43_538_000, 2136) + // Minimum execution time: 31_169_000 picoseconds. + Weight::from_parts(32_271_000, 2136) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -612,8 +644,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `769` // Estimated: `4698` - // Minimum execution time: 62_957_000 picoseconds. - Weight::from_parts(66_821_000, 4698) + // Minimum execution time: 44_945_000 picoseconds. + Weight::from_parts(47_119_000, 4698) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -623,8 +655,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 16_146_000 picoseconds. - Weight::from_parts(16_775_000, 3551) + // Minimum execution time: 11_562_000 picoseconds. + Weight::from_parts(11_943_000, 3551) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -634,8 +666,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 17_720_000 picoseconds. - Weight::from_parts(18_916_000, 3551) + // Minimum execution time: 13_075_000 picoseconds. + Weight::from_parts(13_616_000, 3551) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -645,8 +677,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 19_088_000 picoseconds. - Weight::from_parts(19_732_000, 3551) + // Minimum execution time: 13_695_000 picoseconds. + Weight::from_parts(14_658_000, 3551) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -662,8 +694,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `741` // Estimated: `4681` - // Minimum execution time: 30_522_000 picoseconds. - Weight::from_parts(31_573_000, 4681) + // Minimum execution time: 22_623_000 picoseconds. + Weight::from_parts(23_233_000, 4681) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -681,8 +713,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `776` // Estimated: `5996` - // Minimum execution time: 35_833_000 picoseconds. - Weight::from_parts(36_830_000, 5996) + // Minimum execution time: 26_901_000 picoseconds. + Weight::from_parts(27_472_000, 5996) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -695,12 +727,12 @@ impl WeightInfo for () { /// The range of component `m` is `[1, 3]`. fn claim_revenue(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `859` + // Measured: `878` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 65_882_000 picoseconds. - Weight::from_parts(67_506_904, 6196) - // Standard Error: 49_386 - .saturating_add(Weight::from_parts(1_197_959, 0).saturating_mul(m.into())) + // Minimum execution time: 51_778_000 picoseconds. + Weight::from_parts(53_726_731, 6196) + // Standard Error: 45_279 + .saturating_add(Weight::from_parts(677_769, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(RocksDbWeight::get().writes(5_u64)) @@ -712,8 +744,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 41_860_000 picoseconds. - Weight::from_parts(42_478_000, 3593) + // Minimum execution time: 31_790_000 picoseconds. + Weight::from_parts(32_601_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -725,8 +757,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `604` // Estimated: `3551` - // Minimum execution time: 32_593_000 picoseconds. - Weight::from_parts(35_399_000, 3551) + // Minimum execution time: 18_465_000 picoseconds. + Weight::from_parts(21_050_000, 3551) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -740,8 +772,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `601` // Estimated: `3533` - // Minimum execution time: 41_934_000 picoseconds. - Weight::from_parts(50_480_000, 3533) + // Minimum execution time: 23_825_000 picoseconds. + Weight::from_parts(26_250_000, 3533) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -755,10 +787,10 @@ impl WeightInfo for () { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn drop_history() -> Weight { // Proof Size summary in bytes: - // Measured: `995` + // Measured: `1014` // Estimated: `3593` - // Minimum execution time: 47_167_000 picoseconds. - Weight::from_parts(54_289_000, 3593) + // Minimum execution time: 28_103_000 picoseconds. + Weight::from_parts(32_622_000, 3593) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -770,20 +802,18 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `661` // Estimated: `4698` - // Minimum execution time: 29_755_000 picoseconds. - Weight::from_parts(32_857_000, 4698) + // Minimum execution time: 16_751_000 picoseconds. + Weight::from_parts(17_373_000, 4698) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// The range of component `n` is `[0, 1000]`. - fn request_core_count(n: u32, ) -> Weight { + fn request_core_count(_n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_793_000 picoseconds. - Weight::from_parts(4_086_907, 0) - // Standard Error: 14 - .saturating_add(Weight::from_parts(60, 0).saturating_mul(n.into())) + // Minimum execution time: 2_705_000 picoseconds. + Weight::from_parts(2_991_768, 0) } /// Storage: `Broker::CoreCountInbox` (r:1 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -792,13 +822,13 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `404` // Estimated: `1487` - // Minimum execution time: 6_262_000 picoseconds. - Weight::from_parts(6_734_896, 1487) + // Minimum execution time: 4_598_000 picoseconds. + Weight::from_parts(4_937_302, 1487) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: `Broker::RevenueInbox` (r:1 w:1) - /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:1 w:1) @@ -809,32 +839,20 @@ impl WeightInfo for () { /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `829` - // Estimated: `3593` - // Minimum execution time: 39_812_000 picoseconds. - Weight::from_parts(41_227_000, 3593) + // Measured: `991` + // Estimated: `4456` + // Minimum execution time: 37_601_000 picoseconds. + Weight::from_parts(38_262_000, 4456) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: `Broker::InstaPoolIo` (r:3 w:3) - /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) - /// Storage: `Broker::Reservations` (r:1 w:0) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) - /// Storage: `Broker::Leases` (r:1 w:1) - /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) - /// Storage: `Broker::SaleInfo` (r:0 w:1) - /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) - /// Storage: `Broker::Workplan` (r:0 w:10) - /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn rotate_sale(_n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6281` - // Estimated: `8499` - // Minimum execution time: 34_576_000 picoseconds. - Weight::from_parts(36_303_629, 8499) - .saturating_add(RocksDbWeight::get().reads(5_u64)) - .saturating_add(RocksDbWeight::get().writes(15_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(0, 0) } /// Storage: `Broker::InstaPoolIo` (r:1 w:0) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) @@ -844,8 +862,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `180` // Estimated: `3493` - // Minimum execution time: 6_978_000 picoseconds. - Weight::from_parts(7_206_000, 3493) + // Minimum execution time: 5_391_000 picoseconds. + Weight::from_parts(5_630_000, 3493) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -857,8 +875,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1423` // Estimated: `4681` - // Minimum execution time: 15_063_000 picoseconds. - Weight::from_parts(15_463_000, 4681) + // Minimum execution time: 10_249_000 picoseconds. + Weight::from_parts(10_529_000, 4681) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -866,8 +884,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 126_000 picoseconds. - Weight::from_parts(157_000, 0) + // Minimum execution time: 120_000 picoseconds. + Weight::from_parts(140_000, 0) } /// Storage: `Broker::CoreCountInbox` (r:0 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -875,8 +893,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_803_000 picoseconds. - Weight::from_parts(1_965_000, 0) + // Minimum execution time: 1_402_000 picoseconds. + Weight::from_parts(1_513_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Broker::RevenueInbox` (r:0 w:1) @@ -895,16 +913,16 @@ impl WeightInfo for () { /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) /// Storage: `Broker::CoreCountInbox` (r:1 w:0) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `Broker::RevenueInbox` (r:1 w:0) - /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `441` - // Estimated: `1516` - // Minimum execution time: 9_313_000 picoseconds. - Weight::from_parts(9_699_000, 1516) + // Measured: `603` + // Estimated: `4068` + // Minimum execution time: 8_897_000 picoseconds. + Weight::from_parts(9_218_000, 4068) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Broker::Leases` (r:1 w:1) /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) @@ -912,8 +930,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 5_984_000 picoseconds. - Weight::from_parts(6_296_000, 1526) + // Minimum execution time: 4_678_000 picoseconds. + Weight::from_parts(4_920_000, 1526) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -924,4 +942,42 @@ impl WeightInfo for () { // Minimum execution time: 229_000 picoseconds. Weight::from_parts(268_000, 0) } -} + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::PotentialRenewals` (r:1 w:2) + /// Proof: `Broker::PotentialRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Authorship::Author` (r:1 w:0) + /// Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:0) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(101), added: 596, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn enable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `930` + // Estimated: `4698` + // Minimum execution time: 51_597_000 picoseconds. + Weight::from_parts(52_609_000, 4698) + .saturating_add(RocksDbWeight::get().reads(8_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } + /// Storage: `Broker::AutoRenewals` (r:1 w:1) + /// Proof: `Broker::AutoRenewals` (`max_values`: Some(1), `max_size`: Some(101), added: 596, mode: `MaxEncodedLen`) + fn disable_auto_renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `484` + // Estimated: `1586` + // Minimum execution time: 8_907_000 picoseconds. + Weight::from_parts(9_167_000, 1586) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} \ No newline at end of file