diff --git a/pallets/xcmp-queue/src/benchmarking.rs b/pallets/xcmp-queue/src/benchmarking.rs index 126cb55dbbd..e67da7b0d33 100644 --- a/pallets/xcmp-queue/src/benchmarking.rs +++ b/pallets/xcmp-queue/src/benchmarking.rs @@ -54,19 +54,27 @@ benchmarks! { // We set `deferred_to` to the current relay block number to make sure that the messages are serviced. let deferred_message = DeferredMessage { sent_at: relay_block, deferred_to: relay_block, sender: para_id, xcm }; let deferred_xcm_messages = vec![deferred_message.clone(); max_messages]; - crate::Pallet::::inject_deferred_messages(para_id, deferred_xcm_messages.try_into().unwrap()); - assert_eq!(crate::Pallet::::deferred_messages(para_id).len(), max_messages); + crate::Pallet::::inject_deferred_messages(para_id, (relay_block, 0), deferred_xcm_messages.try_into().unwrap()); + let max_buckets = T::MaxDeferredBuckets::get(); + let indices: Vec = (1..(max_buckets)).map(|i| (relay_block, i as u16)).collect(); + crate::Pallet::::inject_bare_deferred_indices(para_id, indices); + assert_eq!(crate::Pallet::::messages_deferred_to(para_id, (relay_block, 0)).len(), max_messages); + assert_eq!(crate::Pallet::::deferred_indices(para_id).len(), max_buckets as usize); // TODO: figure out how to get the weight of the xcm in a production runtime (Weigher not available) let weight = Weight::from_parts(1_000_000 - 1_000, 1024); assert!(crate::Pallet::::update_xcmp_max_individual_weight(RawOrigin::Root.into(), weight).is_ok()); - } :_(RawOrigin::Root, weight, para_id) + // account for the reads induced by trying to execute all `max_messages` + let weight_limit = weight.saturating_add(T::DbWeight::get().reads_writes(max_messages as u64 + 2, 2)); + } :_(RawOrigin::Root, weight_limit, para_id) verify { - assert_eq!(crate::Pallet::::deferred_messages(para_id).len(), 0); + assert_eq!(crate::Pallet::::messages_deferred_to(para_id, (relay_block, 0)).len(), 0); + assert_eq!(crate::Pallet::::deferred_indices(para_id).len(), max_buckets as usize - 1); + // worst case is placing the message in overweight, so check that they end up there assert!(Overweight::::contains_key(0)); assert!(Overweight::::contains_key((max_messages - 1) as u64)); } - discard_deferred { + discard_deferred_bucket { let para_id = ParaId::from(999); let xcm = construct_xcm::(); @@ -77,12 +85,57 @@ benchmarks! { let max_messages = T::MaxDeferredMessages::get() as usize; let deferred_message = DeferredMessage { sent_at, deferred_to, sender: para_id, xcm }; let deferred_xcm_messages = vec![deferred_message.clone(); max_messages]; - crate::Pallet::::inject_deferred_messages(para_id, deferred_xcm_messages.try_into().unwrap()); - assert_eq!(crate::Pallet::::deferred_messages(para_id).len(), max_messages); - } :_(RawOrigin::Root, para_id, sent_at, Some(deferred_to), Some(hash)) + crate::Pallet::::inject_deferred_messages(para_id, (deferred_to, 0), deferred_xcm_messages.try_into().unwrap()); + assert_eq!(crate::Pallet::::messages_deferred_to(para_id, (deferred_to, 0)).len(), max_messages); + } :discard_deferred(RawOrigin::Root, para_id, (deferred_to, 0), None) verify { - assert_eq!(crate::Pallet::::deferred_messages(para_id).len(), 0); + assert_eq!(crate::Pallet::::messages_deferred_to(para_id, (deferred_to, 0)).len(), 0); + } + discard_deferred_individual { + let para_id = ParaId::from(999); + + let xcm = construct_xcm::(); + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + + let sent_at = 1; + let deferred_to = 6; + let max_messages = T::MaxDeferredMessages::get() as usize; + let deferred_message = DeferredMessage { sent_at, deferred_to, sender: para_id, xcm }; + let deferred_xcm_messages = vec![deferred_message.clone(); max_messages]; + crate::Pallet::::inject_deferred_messages(para_id, (deferred_to, 0), deferred_xcm_messages.try_into().unwrap()); + assert_eq!(crate::Pallet::::messages_deferred_to(para_id, (deferred_to, 0)).len(), max_messages); + } :discard_deferred(RawOrigin::Root, para_id, (deferred_to, 0), Some(max_messages as u32 - 1)) + verify + { + let messages = crate::Pallet::::messages_deferred_to(para_id, (deferred_to, 0)); + assert_eq!(messages.len(), max_messages); + assert_eq!(messages[max_messages - 1], None); + } + try_place_in_deferred_queue { + let para_id = ParaId::from(999); + + let xcm = construct_xcm::(); + + let max_messages = T::MaxDeferredMessages::get() as usize; + let relay_block = T::RelayChainBlockNumberProvider::current_block_number(); + let max_buckets = T::MaxDeferredBuckets::get(); + let indices: Vec = (0..(max_buckets-1)).map(|i| (relay_block, i as u16)).collect(); + crate::Pallet::::inject_bare_deferred_indices(para_id, indices); + // We set the `deferred_to` to some time in the future. + let deferred_to = relay_block.saturating_add(20); + let deferred_message = DeferredMessage { sent_at: relay_block, deferred_to, sender: para_id, xcm }; + let num_injected = max_messages.saturating_sub(1); + let deferred_xcm_messages = vec![deferred_message.clone(); num_injected]; + let index = (deferred_to, max_buckets as u16); + crate::Pallet::::inject_deferred_messages(para_id, index, deferred_xcm_messages.try_into().unwrap()); + assert_eq!(crate::Pallet::::messages_deferred_to(para_id, index).len(), num_injected); + assert_eq!(crate::Pallet::::deferred_indices(para_id).len(), max_buckets as usize); + } :{ crate::Pallet::::try_place_in_deferred_queue(para_id, deferred_to, deferred_message).unwrap(); } + verify + { + assert_eq!(crate::Pallet::::messages_deferred_to(para_id, index).len(), max_messages); + assert_eq!(crate::Pallet::::deferred_indices(para_id).len(), max_buckets as usize); } } diff --git a/pallets/xcmp-queue/src/lib.rs b/pallets/xcmp-queue/src/lib.rs index 045f6880fbd..587afdc7119 100644 --- a/pallets/xcmp-queue/src/lib.rs +++ b/pallets/xcmp-queue/src/lib.rs @@ -36,6 +36,9 @@ mod tests; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; pub mod weights; +use core::ops::Sub; + +use frame_support::traits::Defensive; pub use weights::WeightInfo; use codec::{Decode, DecodeLimit, Encode}; @@ -54,9 +57,11 @@ use rand_chacha::{ ChaChaRng, }; use scale_info::TypeInfo; -use sp_core::bounded::BoundedVec; +use sp_core::bounded::{BoundedBTreeSet, BoundedVec}; use sp_runtime::traits::BlockNumberProvider; use sp_runtime::RuntimeDebug; +use sp_std::collections::btree_set::BTreeSet; +use sp_std::ops::Bound::Included; use sp_std::{convert::TryFrom, prelude::*}; use xcm::{latest::prelude::*, VersionedXcm, WrapVersion, MAX_XCM_DECODE_DEPTH}; use xcm_executor::traits::ConvertOrigin; @@ -83,6 +88,9 @@ const MAX_MESSAGES_PER_BLOCK: u8 = 10; // Maximum amount of messages that can exist in the overweight queue at any given time. const MAX_OVERWEIGHT_MESSAGES: u32 = 1000; +/// Type used to store deferred message buckets. +pub type DeferredIndex = (RelayBlockNumber, u16); + /// Determine whether to execute incoming messages directly or defer them by a certain amount /// of relay chain blocks. pub trait XcmDeferFilter { @@ -106,7 +114,7 @@ impl XcmDeferFilter for () { #[frame_support::pallet] pub mod pallet { use super::*; - use frame_support::pallet_prelude::*; + use frame_support::{pallet_prelude::*, Blake2_128Concat}; use frame_system::pallet_prelude::*; #[pallet::pallet] @@ -147,9 +155,12 @@ pub mod pallet { /// Filter logic to defer XCM message type XcmDeferFilter: XcmDeferFilter; - /// The maximum number of messages allowed in the deferred queue. + /// The maximum number of messages allowed in one bucket. type MaxDeferredMessages: Get; + /// The maximum number of deferred message buckets per parachain. + type MaxDeferredBuckets: Get; + /// Relay chain block number provider to allow processing deferred messages on idle type RelayChainBlockNumberProvider: BlockNumberProvider; @@ -326,6 +337,7 @@ pub mod pallet { /// /// - `origin`: Must pass `ExecuteDeferredOrigin`. /// - `weight_limit`: Maximum weight budget for deferred message execution. + /// - `para_id`: The queue to service. #[pallet::call_index(9)] #[pallet::weight((weight_limit.saturating_add(T::WeightInfo::service_deferred()), DispatchClass::Operational))] pub fn service_deferred( @@ -349,40 +361,104 @@ pub mod pallet { /// This extrinsic discards all deferred messages that match the given parameters. /// - /// Parameters set to `None` are not matched. - /// /// - `origin`: Must pass `ExecuteDeferredOrigin` /// - `para_id`: The parachain id where the deferred messages were sent from - /// - `sent_at`: The relay chain block number at which the deferred messages were sent - /// - `deferred_to`: The relay chain block number to which the deferred messages were deferred to execute - /// - `maybe_hash`: The hash of the deferred message - /// - #[pallet::call_index(10)] - #[pallet::weight((T::WeightInfo::discard_deferred(), DispatchClass::Operational))] + /// - `index`: The relay chain block number to which the messages were deferred as well as the bucket index. + /// - `maybe_position`: The position in the bucket of the message to be discarded. Will discard the whole bucket + /// if `None`. + #[pallet::call_index(11)] + #[pallet::weight(( + T::WeightInfo::discard_deferred_individual().max(T::WeightInfo::discard_deferred_bucket()), + DispatchClass::Operational + ))] pub fn discard_deferred( origin: OriginFor, para_id: ParaId, - sent_at: RelayBlockNumber, - deferred_to: Option, - maybe_hash: Option, - ) -> DispatchResultWithPostInfo { + index: DeferredIndex, + maybe_position: Option, + ) -> DispatchResult { T::ExecuteDeferredOrigin::ensure_origin(origin)?; - DeferredXcmMessages::::mutate_exists(para_id, |deferred| { - deferred.as_mut().map(|d| { - d.retain(|msg| { - // We discard all messages that match the given parameters. - !(msg.sent_at == sent_at - && (deferred_to.is_none() || Some(msg.deferred_to) == deferred_to) - && (maybe_hash.is_none() || { - let hash = msg.xcm.using_encoded(sp_io::hashing::blake2_256); - Some(hash) == maybe_hash - })) - }) - }); - }); + DeferredMessageBuckets::::mutate_exists(para_id, index, |deferred| { + if let Some(position) = maybe_position { + deferred + .as_mut() + .map( + |d: &mut BoundedVec< + Option::RuntimeCall>>, + ::MaxDeferredMessages, + >| { + d.get_mut(position as usize) + .map(|maybe_msg| { + if let Some(msg) = maybe_msg { + let hash = + msg.xcm.using_encoded(sp_io::hashing::blake2_256); + Self::deposit_event(Event::DeferredXcmDiscarded { + sender: para_id, + sent_at: msg.sent_at, + deferred_to: msg.deferred_to, + index, + position, + message_hash: Some(hash), + }); + *maybe_msg = None; + Ok(()) + } else { + Err(Error::::MessageNotFound) + } + }) + .unwrap_or(Err(Error::::MessageNotFound)) + }, + ) + .unwrap_or(Err(Error::::MessageNotFound)) + } else { + *deferred = None; + Self::deposit_event(Event::DeferredBucketDiscarded { sender: para_id, index }); + Ok(()) + } + })?; + Ok(()) + } + + /// Suspends execution of deferred XCM for the XCMP queue, regardless of the sender's origin. + /// + /// - `origin`: Must pass `ControllerOrigin`. + #[pallet::call_index(12)] + #[pallet::weight((T::DbWeight::get().writes(1), DispatchClass::Operational,))] + pub fn suspend_deferred_execution(origin: OriginFor) -> DispatchResult { + T::ControllerOrigin::ensure_origin(origin)?; - Ok(Some(Weight::from_parts(1_000_000, 0)).into()) + DeferredQueueSuspended::::put(true); + + Ok(()) + } + + /// Resumes execution of deferred XCM for the XCMP queue. + /// + /// Note that this function doesn't change the status of the in/out bound channels. + /// + /// - `origin`: Must pass `ControllerOrigin`. + #[pallet::call_index(13)] + #[pallet::weight((T::DbWeight::get().writes(1), DispatchClass::Operational,))] + pub fn resume_deferred_execution(origin: OriginFor) -> DispatchResult { + T::ControllerOrigin::ensure_origin(origin)?; + + DeferredQueueSuspended::::put(false); + + Ok(()) + } + + /// Set whether to defer all incoming XCMs (`Some(deferral_time)`) or not (`None`). + /// + /// - `origin`: Must pass `ControllerOrigin`. + #[pallet::call_index(14)] + #[pallet::weight((T::DbWeight::get().writes(1), DispatchClass::Operational,))] + pub fn set_defer_all_by(origin: OriginFor, maybe_defer_by: Option) -> DispatchResult { + T::ControllerOrigin::ensure_origin(origin)?; + + DeferAllBy::::mutate_exists(|d| { *d = maybe_defer_by; }); + + Ok(()) } } @@ -390,28 +466,15 @@ pub mod pallet { #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { /// Some XCM was executed ok. - Success { - message_hash: Option, - weight: Weight, - }, + Success { message_hash: Option, weight: Weight }, /// Some XCM failed. - Fail { - message_hash: Option, - error: XcmError, - weight: Weight, - }, + Fail { message_hash: Option, error: XcmError, weight: Weight }, /// Bad XCM version used. - BadVersion { - message_hash: Option, - }, + BadVersion { message_hash: Option }, /// Bad XCM format used. - BadFormat { - message_hash: Option, - }, + BadFormat { message_hash: Option }, /// An HRMP message was sent to a sibling parachain. - XcmpMessageSent { - message_hash: Option, - }, + XcmpMessageSent { message_hash: Option }, /// An XCM exceeded the individual message weight budget. OverweightEnqueued { sender: ParaId, @@ -420,24 +483,33 @@ pub mod pallet { required: Weight, }, /// An XCM from the overweight queue was executed with the given actual weight used. - OverweightServiced { - index: OverweightIndex, - used: Weight, - }, + OverweightServiced { index: OverweightIndex, used: Weight }, /// Some XCM was deferred for later execution XcmDeferred { sender: ParaId, sent_at: RelayBlockNumber, deferred_to: RelayBlockNumber, + index: DeferredIndex, + position: u32, message_hash: Option, }, - /// The deferred queue is full with xcm messages XcmDeferredQueueFull { sender: ParaId, sent_at: RelayBlockNumber, message_hash: Option, }, + /// The deferred message was successfully discarded. + DeferredXcmDiscarded { + sender: ParaId, + sent_at: RelayBlockNumber, + deferred_to: RelayBlockNumber, + index: DeferredIndex, + position: u32, + message_hash: Option, + }, + /// The deferred bucket was discarded. + DeferredBucketDiscarded { sender: ParaId, index: DeferredIndex }, } #[pallet::error] @@ -452,6 +524,8 @@ pub mod pallet { BadOverweightIndex, /// Provided weight is possibly not enough to execute the message. WeightOverLimit, + /// Indicated message is not present. + MessageNotFound, } /// Status of the inbound XCMP channels. @@ -471,14 +545,25 @@ pub mod pallet { ValueQuery, >; - /// Inbound aggregate XCMP messages per ParaId. #[pallet::storage] - #[pallet::getter(fn deferred_messages)] - pub(super) type DeferredXcmMessages = StorageMap< + #[pallet::getter(fn deferred_indices)] + pub(super) type DeferredIndices = StorageMap< _, Blake2_128Concat, ParaId, - BoundedVec, T::MaxDeferredMessages>, + BoundedBTreeSet, + ValueQuery, + >; + + #[pallet::storage] + #[pallet::getter(fn messages_deferred_to)] + pub(super) type DeferredMessageBuckets = StorageDoubleMap< + _, + Blake2_128Concat, + ParaId, + Blake2_128Concat, + DeferredIndex, + BoundedVec>, T::MaxDeferredMessages>, ValueQuery, >; @@ -523,6 +608,14 @@ pub mod pallet { /// Whether or not the XCMP queue is suspended from executing incoming XCMs or not. #[pallet::storage] pub(super) type QueueSuspended = StorageValue<_, bool, ValueQuery>; + + /// Whether or not the Deferred queue is suspended from executing XCMs or not. + #[pallet::storage] + pub(super) type DeferredQueueSuspended = StorageValue<_, bool, ValueQuery>; + + /// Whether or not and if so by how much to defer all incoming XCMs. + #[pallet::storage] + pub(super) type DeferAllBy = StorageValue<_, u32>; } #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, TypeInfo)] @@ -818,8 +911,11 @@ impl Pallet { MAX_XCM_DECODE_DEPTH, &mut remaining_fragments, ) { - let (defer_weight, defer) = - T::XcmDeferFilter::deferred_by(sender, sent_at, &xcm); + let (defer_weight, defer) = if let Some(defer) = DeferAllBy::::get() { + (Weight::zero(), Some(defer)) + } else { + T::XcmDeferFilter::deferred_by(sender, sent_at, &xcm) + }; weight_used.saturating_accrue(defer_weight); let weight = max_weight.saturating_sub(weight_used); if let Some(defer_by) = defer { @@ -828,15 +924,19 @@ impl Pallet { let deferred_to = relay_block.saturating_add(defer_by); let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let _ = DeferredXcmMessages::::try_append( + weight_used.saturating_accrue(T::WeightInfo::try_place_in_deferred_queue()); + let _ = Self::try_place_in_deferred_queue( sender, + deferred_to, DeferredMessage { sender, xcm, sent_at, deferred_to }, ) - .map(|()| { + .map(|(index, position)| { let e = Event::XcmDeferred { sender, sent_at, deferred_to, + index, + position, message_hash: Some(hash), }; Self::deposit_event(e); @@ -1127,33 +1227,24 @@ impl Pallet { max_individual_weight: Weight, ) -> Weight { let mut weight_used = Weight::zero(); - let mut unprocessed = Vec::new(); - let mut drain_iter = DeferredXcmMessages::::drain(); + if QueueSuspended::::get() || DeferredQueueSuspended::::get() { + return weight_used; + } + let mut keys = DeferredIndices::::iter_keys(); let mut processed_all_queues = false; while !processed_all_queues && max_weight.all_gt(weight_used) { - weight_used = weight_used.saturating_add(T::DbWeight::get().reads_writes(1, 1)); - if let Some((sender, mut deferred_messages)) = drain_iter.next() { - weight_used = weight_used.saturating_add(Self::process_deferred_messages( + if let Some(sender) = keys.next() { + weight_used.saturating_accrue(Self::service_deferred_queue( sender, - relay_chain_block_number, - &mut deferred_messages, max_weight.saturating_sub(weight_used), + relay_chain_block_number, max_individual_weight, )); - - // store unprocessed messages after `drain` is done to avoid interfering with the iterator - if !deferred_messages.is_empty() { - unprocessed.push((sender, deferred_messages)); - } } else { processed_all_queues = true; } } - for (sender, new_deferred_messages) in unprocessed { - DeferredXcmMessages::::insert(sender, new_deferred_messages); - } - weight_used } @@ -1165,48 +1256,111 @@ impl Pallet { max_individual_weight: Weight, ) -> Weight { let mut weight_used = Weight::zero(); + if QueueSuspended::::get() || DeferredQueueSuspended::::get() { + return weight_used; + } - let mut deferred_messages = DeferredXcmMessages::::get(sender); - weight_used = weight_used.saturating_add(Self::process_deferred_messages( - sender, - up_to_relay_block_number, - &mut deferred_messages, - max_weight.saturating_sub(weight_used), - max_individual_weight, - )); + weight_used.saturating_accrue(T::DbWeight::get().reads_writes(1, 1)); + let mut indices = DeferredIndices::::take(sender); - if deferred_messages.is_empty() { - DeferredXcmMessages::::remove(sender); - } else { - DeferredXcmMessages::::insert(sender, deferred_messages); + let indices_to_process = + indices.range((Included(&(0, 0)), Included(&(up_to_relay_block_number, u16::MAX)))); + let mut processed = BTreeSet::new(); + for index in indices_to_process { + weight_used.saturating_accrue(T::DbWeight::get().reads_writes(1, 1)); + if weight_used.any_gte(max_weight) { + break; + } + let remove = DeferredMessageBuckets::::mutate(sender, index, |bucket| { + weight_used.saturating_accrue(Self::process_deferred_messages( + sender, + bucket, + max_weight.saturating_sub(weight_used), + max_individual_weight, + )); + bucket.is_empty() || bucket.iter().all(|maybe_msg| maybe_msg.is_none()) + }); + if remove { + DeferredMessageBuckets::::remove(sender, index); + processed.insert(*index); + } + } + indices = BoundedBTreeSet::try_from(indices.into_inner().sub(&processed)) + .expect("Subtraction can only lead to a smaller set. qed."); + if !indices.is_empty() { + DeferredIndices::::insert(sender, indices); } weight_used } + /// Try to place a message in the deferred queue for `sender`. + /// Returns the index and position where the message was stored. + fn try_place_in_deferred_queue( + sender: ParaId, + deferred_to: RelayBlockNumber, + deferred_message: DeferredMessage, + ) -> Result<(DeferredIndex, u32), ()> { + DeferredIndices::::try_mutate(sender, |indices| { + let first_index_in_block = (deferred_to, 0_u16); + let (index, do_insert) = indices + .range((Included(&first_index_in_block), Included(&(deferred_to, u16::MAX)))) + .max() + .map(|index| (*index, false)) + .unwrap_or((first_index_in_block, true)); + if do_insert { + // no bucket yet for block `deferred_to`, create new one + indices.try_insert(index).map_err(|_| ())?; + } + let deferred_message = Some(deferred_message); + let position = + DeferredMessageBuckets::::decode_len(sender, index).unwrap_or(0) as u32; + let index_and_pos = if DeferredMessageBuckets::::try_append( + sender, + index, + &deferred_message, + ) + .is_ok() + { + (index, position) + } else { + // last bucket is full, create new one + let (deferred_to, block_index) = index; + let new_index = (deferred_to, block_index.checked_add(1).ok_or(())?); + indices.try_insert(new_index).map_err(|_| ())?; + let _ = + DeferredMessageBuckets::::try_append(sender, new_index, &deferred_message) + .defensive_proof("appending to empty bucket should not fail"); + (new_index, 0) + }; + Ok(index_and_pos) + }) + } + /// Process `deferred_messages` from `sender` that were deferred until `relay_chain_block` /// Returns the `weight_used` and removes processed messages from the `deferred_messages` vector. fn process_deferred_messages( sender: ParaId, - relay_chain_block: RelayBlockNumber, - deferred_messages: &mut BoundedVec, T::MaxDeferredMessages>, + deferred_messages: &mut BoundedVec< + Option>, + T::MaxDeferredMessages, + >, max_weight: Weight, max_individual_weight: Weight, ) -> Weight { let mut weight_used = Weight::zero(); - deferred_messages.retain(|msg| { - if msg.deferred_to > relay_chain_block { - return true; - } - + for maybe_msg in deferred_messages.iter_mut() { let weight = max_weight.saturating_sub(weight_used); - //TODO: consider doing early out when there is no weight left + if weight.any_eq(Weight::zero()) { + break; + } + let Some(msg) = maybe_msg else { continue }; match Self::handle_xcm_message(sender, msg.sent_at, msg.xcm.clone(), weight) { Ok(used) => { - weight_used = weight_used.saturating_add(used); - return false; + weight_used.saturating_accrue(used); + *maybe_msg = None; }, Err(XcmError::WeightLimitReached(required)) if required.any_gt(max_individual_weight) => @@ -1226,14 +1380,12 @@ impl Pallet { }; Self::deposit_event(e); } - return false; + *maybe_msg = None; }, - Err(XcmError::WeightLimitReached(_)) => { - return true; - }, - Err(_) => return false, + Err(XcmError::WeightLimitReached(_)) => {}, + Err(_) => *maybe_msg = None, } - }); + } weight_used } @@ -1273,9 +1425,28 @@ impl Pallet { #[cfg(any(test, feature = "runtime-benchmarks"))] fn inject_deferred_messages( sender: ParaId, + index: DeferredIndex, messages: BoundedVec, T::MaxDeferredMessages>, ) { - DeferredXcmMessages::::mutate(sender, |deferred_messages| *deferred_messages = messages); + DeferredIndices::::mutate(sender, |indices| { + indices.try_insert(index).expect("Should not inject too many messages."); + }); + let messages: Vec<_> = messages.into_iter().map(|msg| Some(msg)).collect(); + let messages = BoundedVec::try_from(messages).expect("Length was not changed. qed."); + DeferredMessageBuckets::::mutate(sender, index, |deferred_messages| { + *deferred_messages = messages + }); + } + + /// Inject arbitrary indices. + /// WARNING: leads to inconsistent state. + #[cfg(any(test, feature = "runtime-benchmarks"))] + fn inject_bare_deferred_indices(sender: ParaId, insert: Vec) { + DeferredIndices::::mutate(sender, |indices| { + for index in insert.into_iter() { + indices.try_insert(index).expect("Should not inject too many indices."); + } + }); } } diff --git a/pallets/xcmp-queue/src/mock.rs b/pallets/xcmp-queue/src/mock.rs index 448a9bb5d2a..1cf419ef751 100644 --- a/pallets/xcmp-queue/src/mock.rs +++ b/pallets/xcmp-queue/src/mock.rs @@ -224,6 +224,7 @@ impl XcmDeferFilter for XcmDeferFilterMock { let xcm = Xcm::::try_from(xcm.clone()).unwrap(); let first = xcm.first().unwrap(); match first { + ClearError => (Weight::default(), None), ClearOrigin => (Weight::default(), Some(5)), ReserveAssetDeposited(_) => (Weight::default(), Some(5)), RefundSurplus => (Weight::default(), Some(42)), @@ -234,6 +235,7 @@ impl XcmDeferFilter for XcmDeferFilterMock { parameter_types! { pub const MaxDeferredMessages: u32 = 20; + pub const MaxDeferredBuckets: u32 = 10; } impl Config for Test { @@ -249,6 +251,7 @@ impl Config for Test { type PriceForSiblingDelivery = (); type XcmDeferFilter = XcmDeferFilterMock; type MaxDeferredMessages = MaxDeferredMessages; + type MaxDeferredBuckets = MaxDeferredBuckets; type RelayChainBlockNumberProvider = RelayBlockNumberProviderMock; } @@ -293,8 +296,19 @@ pub fn format_message(msg: &mut Vec, encoded_xcm: Vec) -> &[u8] { msg } -pub fn create_bounded_vec( - deferred_xcm_messages: Vec>, -) -> BoundedVec, MaxDeferredMessages> { +pub fn create_bounded_vec(deferred_xcm_messages: Vec) -> BoundedVec +where + T: core::fmt::Debug, +{ deferred_xcm_messages.try_into().unwrap() } + +use sp_std::collections::btree_set::BTreeSet; +pub fn create_bounded_btreeset( + iter: I, +) -> BoundedBTreeSet<(RelayBlockNumber, u16), MaxDeferredBuckets> +where + I: Iterator, +{ + BTreeSet::from_iter(iter).try_into().unwrap() +} diff --git a/pallets/xcmp-queue/src/tests.rs b/pallets/xcmp-queue/src/tests.rs index d6fe33e23fb..e4736453100 100644 --- a/pallets/xcmp-queue/src/tests.rs +++ b/pallets/xcmp-queue/src/tests.rs @@ -153,6 +153,91 @@ fn suspend_xcm_execution_works() { }); } +#[test] +fn suspend_deferred_flag_suspends_deferred_execution() { + new_test_ext().execute_with(|| { + //Arrange + let versioned_xcm = create_versioned_reserve_asset_deposited(); + let para_id = ParaId::from(999); + let mut xcmp_message = Vec::new(); + let messages = + vec![(para_id, 1u32.into(), format_message(&mut xcmp_message, versioned_xcm.encode()))]; + + RelayBlockNumberProviderMock::set(1); + XcmpQueue::handle_xcmp_messages(messages.clone().into_iter(), Weight::MAX); + let deferred_message = DeferredMessage { + sent_at: 1u32.into(), + sender: para_id, + xcm: versioned_xcm.clone(), + deferred_to: 6, + }; + assert_eq!( + DeferredMessageBuckets::::get(para_id, (6, 0)), + create_bounded_vec(vec![Some(deferred_message.clone())]) + ); + + let QueueConfigData { xcmp_max_individual_weight, .. } = >::get(); + + //Act + DeferredQueueSuspended::::put(true); + XcmpQueue::service_deferred_queues(Weight::MAX, 7, xcmp_max_individual_weight); + + assert_eq!( + DeferredMessageBuckets::::get(para_id, (6, 0)), + create_bounded_vec(vec![Some(deferred_message)]) + ); + }); +} + +#[test] +fn suspend_also_suspends_deferred_execution() { + new_test_ext().execute_with(|| { + //Arrange + let versioned_xcm = create_versioned_reserve_asset_deposited(); + let para_id = ParaId::from(999); + let mut xcmp_message = Vec::new(); + let messages = + vec![(para_id, 1u32.into(), format_message(&mut xcmp_message, versioned_xcm.encode()))]; + + RelayBlockNumberProviderMock::set(1); + XcmpQueue::handle_xcmp_messages(messages.clone().into_iter(), Weight::MAX); + let deferred_message = DeferredMessage { + sent_at: 1u32.into(), + sender: para_id, + xcm: versioned_xcm.clone(), + deferred_to: 6, + }; + assert_eq!( + DeferredMessageBuckets::::get(para_id, (6, 0)), + create_bounded_vec(vec![Some(deferred_message.clone())]) + ); + + let QueueConfigData { xcmp_max_individual_weight, .. } = >::get(); + + //Act + QueueSuspended::::put(true); + XcmpQueue::service_deferred_queues(Weight::MAX, 7, xcmp_max_individual_weight); + + assert_eq!( + DeferredMessageBuckets::::get(para_id, (6, 0)), + create_bounded_vec(vec![Some(deferred_message)]) + ); + }); +} + +macro_rules! assert_deferred_messages { + ($para_id:expr, $index:expr, $deferred_messages:expr) => { + assert_eq!( + create_bounded_btreeset([$index].into_iter()), + DeferredIndices::::get($para_id) + ); + assert_eq!( + create_bounded_vec($deferred_messages), + DeferredMessageBuckets::::get($para_id, $index), + ); + }; +} + #[test] fn defer_xcm_execution_works() { new_test_ext().execute_with(|| { @@ -169,23 +254,68 @@ fn defer_xcm_execution_works() { XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); //Assert + let deferred_to = 6_u32; let deferred_message = DeferredMessage { sent_at: 1u32.into(), sender: para_id, xcm: versioned_xcm.clone(), - deferred_to: 6, + deferred_to, }; - assert_eq!( - create_bounded_vec(vec![deferred_message]), - DeferredXcmMessages::::get(para_id), + assert_deferred_messages!(para_id, (deferred_to, 0_u16), vec![Some(deferred_message)]); + + assert_last_event::( + Event::XcmDeferred { + sender: para_id, + sent_at: 1u32.into(), + deferred_to, + index: (deferred_to, 0), + position: 0, + message_hash: Some(hash), + } + .into(), ); + }); +} + +#[test] +fn defer_all_by_xcm_execution_works() { + new_test_ext().execute_with(|| { + //Arrange + // send an xcm that is normally not deferred + let versioned_xcm = + VersionedXcm::from(Xcm::(vec![Instruction::::ClearError])); + let hash = versioned_xcm.using_encoded(sp_io::hashing::blake2_256); + let para_id = ParaId::from(999); + let mut xcmp_message = Vec::new(); + let messages = + vec![(para_id, 1u32.into(), format_message(&mut xcmp_message, versioned_xcm.encode()))]; + + //Act + RelayBlockNumberProviderMock::set(1); + + DeferAllBy::::set(Some(42)); + + XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); + + //Assert + let deferred_to = 43_u32; + let deferred_message = DeferredMessage { + sent_at: 1u32.into(), + sender: para_id, + xcm: versioned_xcm.clone(), + deferred_to, + }; + + assert_deferred_messages!(para_id, (deferred_to, 0_u16), vec![Some(deferred_message)]); assert_last_event::( Event::XcmDeferred { sender: para_id, sent_at: 1u32.into(), - deferred_to: 6u32.into(), + deferred_to, + index: (deferred_to, 0), + position: 0, message_hash: Some(hash), } .into(), @@ -217,9 +347,10 @@ fn handle_xcmp_messages_should_be_able_to_store_multiple_messages_at_same_block( deferred_to: 6, }; - assert_eq!( - create_bounded_vec(vec![deferred_message.clone(), deferred_message]), - DeferredXcmMessages::::get(para_id), + assert_deferred_messages!( + para_id, + (6, 0_u16), + vec![Some(deferred_message.clone()), Some(deferred_message)] ); assert_last_event::( @@ -227,6 +358,8 @@ fn handle_xcmp_messages_should_be_able_to_store_multiple_messages_at_same_block( sender: para_id, sent_at: 1u32.into(), deferred_to: 6u32.into(), + index: (6, 0), + position: 1, message_hash: Some(hash), } .into(), @@ -257,16 +390,17 @@ fn handle_xcmp_messages_should_execute_deferred_message_and_remove_from_deferred deferred_to: 6, }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message.clone(), deferred_message]) + assert_deferred_messages!( + para_id, + (6, 0_u16), + vec![Some(deferred_message.clone()), Some(deferred_message)] ); let QueueConfigData { xcmp_max_individual_weight, .. } = >::get(); XcmpQueue::service_deferred_queues(Weight::MAX, 7, xcmp_max_individual_weight); - assert_eq!(DeferredXcmMessages::::get(para_id), create_bounded_vec(vec![])); + assert_eq!(create_bounded_btreeset([].into_iter()), DeferredIndices::::get(para_id)); }); } @@ -290,17 +424,14 @@ fn on_idle_should_service_deferred_message() { deferred_to: 6, }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message]) - ); + assert_deferred_messages!(para_id, (6, 0_u16), vec![Some(deferred_message)]); RelayBlockNumberProviderMock::set(7); //Act XcmpQueue::on_idle(1, Weight::MAX); //Assert - assert_eq!(DeferredXcmMessages::::get(para_id), create_bounded_vec(vec![])); + assert_eq!(create_bounded_btreeset([].into_iter()), DeferredIndices::::get(para_id)); }); } @@ -331,17 +462,14 @@ fn service_deferred_should_execute_deferred_messages() { deferred_to: 7, }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message]) - ); + assert_deferred_messages!(para_id, (7, 0_u16), vec![Some(deferred_message)]); RelayBlockNumberProviderMock::set(7); //Act assert_ok!(XcmpQueue::service_deferred(RuntimeOrigin::root(), Weight::MAX, para_id)); //Assert - assert_eq!(DeferredXcmMessages::::get(para_id), create_bounded_vec(vec![])); + assert_eq!(create_bounded_btreeset([].into_iter()), DeferredIndices::::get(para_id)); let deferred_message = DeferredMessage { sent_at: 2u32.into(), sender: para_id2, @@ -349,10 +477,7 @@ fn service_deferred_should_execute_deferred_messages() { deferred_to: 7, }; - assert_eq!( - DeferredXcmMessages::::get(para_id2), - create_bounded_vec(vec![deferred_message]) - ); + assert_deferred_messages!(para_id2, (7, 0_u16), vec![Some(deferred_message)]); assert_last_event::( Event::Success { message_hash: Some(hash), weight: Weight::from_parts(1000000, 1024) } .into(), @@ -392,8 +517,16 @@ fn service_deferred_should_store_unprocessed_messages() { }; assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![msg_to_process, msg_not_to_process.clone()]) + create_bounded_btreeset([(7, 0), (8, 0)].into_iter()), + DeferredIndices::::get(para_id) + ); + assert_eq!( + create_bounded_vec(vec![Some(msg_to_process)]), + DeferredMessageBuckets::::get(para_id, (7, 0)), + ); + assert_eq!( + create_bounded_vec(vec![Some(msg_not_to_process.clone())]), + DeferredMessageBuckets::::get(para_id, (8, 0)), ); RelayBlockNumberProviderMock::set(7); @@ -401,10 +534,7 @@ fn service_deferred_should_store_unprocessed_messages() { assert_ok!(XcmpQueue::service_deferred(RuntimeOrigin::root(), Weight::MAX, para_id)); //Assert - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![msg_not_to_process]) - ); + assert_deferred_messages!(para_id, (8, 0), vec![Some(msg_not_to_process)]); assert_last_event::( Event::Success { message_hash: Some(hash), weight: Weight::from_parts(1000000, 1024) } .into(), @@ -432,10 +562,7 @@ fn service_deferred_should_fail_when_called_with_wrong_origin() { deferred_to: 6, }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message]) - ); + assert_deferred_messages!(para_id, (6, 0), vec![Some(deferred_message)]); //Act and assert assert_noop!( @@ -454,7 +581,10 @@ fn service_deferred_queues_should_pass_overweight_messages_to_overweight_queue() MultiAssets::new(), )]); // We just set a very low max_inidividual_weight to trigger the overweight logic - let low_max_weight = Weight::from_parts(100, 1); + let db_weights: RuntimeDbWeight = ::DbWeight::get(); + let low_max_individual_weight = Weight::from_parts(100, 1); + let low_max_weight = + low_max_individual_weight.saturating_add(db_weights.reads_writes(2, 2)); assert!(FixedWeigher::weight(&mut xcm).unwrap().any_gt(low_max_weight)); let versioned_xcm = VersionedXcm::from(xcm); let para_id = ParaId::from(999); @@ -472,17 +602,14 @@ fn service_deferred_queues_should_pass_overweight_messages_to_overweight_queue() xcm: versioned_xcm.clone(), deferred_to: 6, }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message]) - ); + assert_deferred_messages!(para_id, (6, 0), vec![Some(deferred_message)]); assert_eq!(Overweight::::count(), 0); //Act - XcmpQueue::service_deferred_queues(low_max_weight, 7, low_max_weight); + XcmpQueue::service_deferred_queues(low_max_weight, 7, low_max_individual_weight); //Assert - assert_eq!(DeferredXcmMessages::::get(para_id), create_bounded_vec(vec![])); + assert_eq!(create_bounded_btreeset([].into_iter()), DeferredIndices::::get(para_id)); assert_eq!(Overweight::::get(0), Some((ParaId::from(999), 1, encoded_xcm))); assert_eq!(Overweight::::count(), 1); }); @@ -501,7 +628,7 @@ fn service_deferred_queues_should_stop_processing_when_weight_limit_is_reached_f let db_weights: RuntimeDbWeight = ::DbWeight::get(); let low_max_weight = FixedWeigher::weight(&mut xcm) .unwrap() - .saturating_add(db_weights.reads_writes(1, 1)); + .saturating_add(db_weights.reads_writes(2, 2)); let versioned_xcm = VersionedXcm::from(xcm); let para_id = ParaId::from(999); let second_para_id = ParaId::from(1000); @@ -521,19 +648,17 @@ fn service_deferred_queues_should_stop_processing_when_weight_limit_is_reached_f xcm: versioned_xcm.clone(), deferred_to: 6, }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message]) - ); + assert_deferred_messages!(para_id, (6, 0_u16), vec![Some(deferred_message)]); let second_deferred_message = DeferredMessage { sent_at: 1u32.into(), sender: second_para_id, xcm: versioned_xcm.clone(), deferred_to: 6, }; - assert_eq!( - DeferredXcmMessages::::get(second_para_id), - create_bounded_vec(vec![second_deferred_message.clone()]) + assert_deferred_messages!( + second_para_id, + (6, 0_u16), + vec![Some(second_deferred_message.clone())] ); let QueueConfigData { xcmp_max_individual_weight, .. } = >::get(); @@ -541,10 +666,10 @@ fn service_deferred_queues_should_stop_processing_when_weight_limit_is_reached_f XcmpQueue::service_deferred_queues(low_max_weight, 7, xcmp_max_individual_weight); //Assert - assert_eq!(DeferredXcmMessages::::get(para_id), create_bounded_vec(vec![])); + assert_eq!(create_bounded_btreeset([].into_iter()), DeferredIndices::::get(para_id)); assert_eq!( - DeferredXcmMessages::::get(second_para_id), - create_bounded_vec(vec![second_deferred_message]) + DeferredMessageBuckets::::get(second_para_id, (6, 0)), + create_bounded_vec(vec![Some(second_deferred_message)]) ); }); } @@ -562,7 +687,7 @@ fn service_deferred_queues_should_stop_processing_when_weight_limit_is_reached_f let db_weights: RuntimeDbWeight = ::DbWeight::get(); let low_max_weight = FixedWeigher::weight(&mut xcm) .unwrap() - .saturating_add(db_weights.reads_writes(1, 1)); + .saturating_add(db_weights.reads_writes(2, 2)); let versioned_xcm = VersionedXcm::from(xcm); let para_id = ParaId::from(999); let mut xcmp_message = Vec::new(); @@ -581,9 +706,10 @@ fn service_deferred_queues_should_stop_processing_when_weight_limit_is_reached_f xcm: versioned_xcm.clone(), deferred_to: 6, }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message.clone(), deferred_message.clone()]) + assert_deferred_messages!( + para_id, + (6, 0_u16), + vec![Some(deferred_message.clone()), Some(deferred_message.clone())] ); let QueueConfigData { xcmp_max_individual_weight, .. } = >::get(); @@ -591,10 +717,7 @@ fn service_deferred_queues_should_stop_processing_when_weight_limit_is_reached_f XcmpQueue::service_deferred_queues(low_max_weight, 7, xcmp_max_individual_weight); //Assert - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message]) - ); + assert_deferred_messages!(para_id, (6, 0_u16), vec![None, Some(deferred_message)]); }); } @@ -616,7 +739,6 @@ fn discard_deferred_should_remove_message_from_storage() { RelayBlockNumberProviderMock::set(1); XcmpQueue::handle_xcmp_messages(messages.clone().into_iter(), Weight::MAX); - let second_hash = second_versioned_xcm.using_encoded(sp_io::hashing::blake2_256); let mut second_xcms = Vec::new(); // We put the same message twice to test removal of identical messages second_xcms.extend(second_versioned_xcm.encode()); @@ -647,28 +769,31 @@ fn discard_deferred_should_remove_message_from_storage() { }; assert_eq!( - DeferredXcmMessages::::get(para_id), + DeferredMessageBuckets::::get(para_id, (6, 0)), create_bounded_vec(vec![ - deferred_message.clone(), - second_deferred_message.clone(), - message_to_remove.clone(), - message_to_remove + Some(deferred_message.clone()), + Some(second_deferred_message.clone()) + ]) + ); + assert_eq!( + DeferredMessageBuckets::::get(para_id, (7, 0)), + create_bounded_vec(vec![ + Some(message_to_remove.clone()), + Some(message_to_remove.clone()), ]) ); //Act - assert_ok!(XcmpQueue::discard_deferred( - RuntimeOrigin::root(), - para_id, - 2, - Some(7), - Some(second_hash) - )); + assert_ok!(XcmpQueue::discard_deferred(RuntimeOrigin::root(), para_id, (7, 0), Some(0),)); //Assert assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message, second_deferred_message]) + DeferredMessageBuckets::::get(para_id, (6, 0)), + create_bounded_vec(vec![Some(deferred_message), Some(second_deferred_message)]) + ); + assert_eq!( + DeferredMessageBuckets::::get(para_id, (7, 0)), + create_bounded_vec(vec![None, Some(message_to_remove),]) ); }); } @@ -720,89 +845,28 @@ fn discard_deferred_should_remove_messages_when_only_required_params_specified() }; assert_eq!( - DeferredXcmMessages::::get(para_id), + DeferredMessageBuckets::::get(para_id, (6, 0)), create_bounded_vec(vec![ - deferred_message.clone(), - second_deferred_message.clone(), - third_message.clone() + Some(deferred_message.clone()), + Some(second_deferred_message.clone()) ]) ); - - //Act - assert_ok!(XcmpQueue::discard_deferred(RuntimeOrigin::root(), para_id, 1, None, None)); - - //Assert - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![third_message]) - ); - }); -} - -#[test] -fn discard_deferred_should_remove_correct_messages_when_only_required_params_and_deferred_to_are_specified( -) { - new_test_ext().execute_with(|| { - //Arrange - let versioned_xcm = create_versioned_reserve_asset_deposited(); - // we defined a custom deferral period for RefundSurplus in the mocks - let second_versioned_xcm = - VersionedXcm::from(Xcm::(vec![Instruction::::RefundSurplus])); - let para_id = ParaId::from(999); - let mut xcms = Vec::new(); - xcms.extend(versioned_xcm.encode()); - // We put the same message that we will remove to test whether messages with the same hash but different block get removed - xcms.extend(second_versioned_xcm.encode()); - let mut xcmp_message = Vec::new(); - let messages = vec![(para_id, 1u32.into(), format_message(&mut xcmp_message, xcms))]; - - RelayBlockNumberProviderMock::set(1); - XcmpQueue::handle_xcmp_messages(messages.clone().into_iter(), Weight::MAX); - - let mut second_xcmp_message = Vec::new(); - let second_messages = vec![( - para_id, - 2u32.into(), - format_message(&mut second_xcmp_message, second_versioned_xcm.encode()), - )]; - RelayBlockNumberProviderMock::set(2); - XcmpQueue::handle_xcmp_messages(second_messages.clone().into_iter(), Weight::MAX); - - let deferred_message = DeferredMessage { - sent_at: 1, - sender: para_id, - xcm: versioned_xcm.clone(), - deferred_to: 6, - }; - let second_deferred_message = DeferredMessage { - sent_at: 1, - sender: para_id, - xcm: second_versioned_xcm.clone(), - deferred_to: 43, - }; - let third_message = DeferredMessage { - sent_at: 2, - sender: para_id, - xcm: second_versioned_xcm.clone(), - deferred_to: 44, - }; - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![ - deferred_message.clone(), - second_deferred_message.clone(), - third_message.clone() - ]) + DeferredMessageBuckets::::get(para_id, (7, 0)), + create_bounded_vec(vec![Some(third_message.clone())]) ); //Act - assert_ok!(XcmpQueue::discard_deferred(RuntimeOrigin::root(), para_id, 1, Some(43), None)); + assert_ok!(XcmpQueue::discard_deferred(RuntimeOrigin::root(), para_id, (6, 0), None)); //Assert assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![deferred_message, third_message]) + DeferredMessageBuckets::::get(para_id, (6, 0)), + create_bounded_vec(vec![]) + ); + assert_eq!( + DeferredMessageBuckets::::get(para_id, (7, 0)), + create_bounded_vec(vec![Some(third_message)]) ); }); } @@ -826,23 +890,25 @@ fn handle_xcmp_messages_should_execute_deferred_message_from_different_blocks() RelayBlockNumberProviderMock::set(2); XcmpQueue::handle_xcmp_messages(messages2.clone().into_iter(), Weight::MAX); - assert_eq!( - DeferredXcmMessages::::get(para_id), - create_bounded_vec(vec![DeferredMessage { + assert_deferred_messages!( + para_id, + (6_u32, 0_u16), + vec![Some(DeferredMessage { sent_at: 1u32.into(), sender: para_id, xcm: versioned_xcm.clone(), deferred_to: 6 - }]) + })] ); - assert_eq!( - DeferredXcmMessages::::get(para_id_2), - create_bounded_vec(vec![DeferredMessage { + assert_deferred_messages!( + para_id_2, + (7_u32, 0_u16), + vec![Some(DeferredMessage { sent_at: 2u32.into(), sender: para_id_2, xcm: versioned_xcm.clone(), deferred_to: 7 - }]) + })] ); let QueueConfigData { xcmp_max_individual_weight, .. } = >::get(); @@ -851,15 +917,20 @@ fn handle_xcmp_messages_should_execute_deferred_message_from_different_blocks() XcmpQueue::service_deferred_queues(Weight::MAX, 6, xcmp_max_individual_weight); //Assert - assert_eq!(DeferredXcmMessages::::get(para_id), create_bounded_vec(vec![])); assert_eq!( - DeferredXcmMessages::::get(para_id_2), - create_bounded_vec(vec![DeferredMessage { + DeferredMessageBuckets::::get(para_id, (6_u32, 0_u16)), + create_bounded_vec(vec![]) + ); + + assert_deferred_messages!( + para_id_2, + (7_u32, 0_u16), + vec![Some(DeferredMessage { sent_at: 2u32.into(), sender: para_id_2, xcm: versioned_xcm.clone(), deferred_to: 7 - }]) + })] ); }); } @@ -886,10 +957,7 @@ fn deferred_xcm_should_be_executed_and_removed_from_storage() { let expected_msg = DeferredMessage { sent_at: 6, deferred_to: 11, xcm: versioned_xcm, sender: para_id }; - assert_eq!( - create_bounded_vec(vec![expected_msg]), - DeferredXcmMessages::::get(para_id) - ); + assert_deferred_messages!(para_id, (11_u32, 0_u16), vec![Some(expected_msg)]); }); } @@ -916,14 +984,14 @@ fn handle_xcmp_messages_should_both_defer_and_execute_xcm_message() { xcm: versioned_xcm.clone(), sender: ParaId::from(999), }; - assert_eq!( - DeferredXcmMessages::::get(ParaId::from(999)), - create_bounded_vec(vec![expected_msg]) - ); + assert_deferred_messages!(ParaId::from(999), (6_u32, 0_u16), vec![Some(expected_msg)]); RelayBlockNumberProviderMock::set(7); XcmpQueue::handle_xcmp_messages(messages2.into_iter(), Weight::MAX); - assert_eq!(DeferredXcmMessages::::get(ParaId::from(999)), create_bounded_vec(vec![])); + assert_eq!( + create_bounded_btreeset([].into_iter()), + DeferredIndices::::get(ParaId::from(999)) + ); let expected_msg = DeferredMessage { sent_at: 7, @@ -931,10 +999,7 @@ fn handle_xcmp_messages_should_both_defer_and_execute_xcm_message() { xcm: versioned_xcm, sender: ParaId::from(1000), }; - assert_eq!( - DeferredXcmMessages::::get(ParaId::from(1000)), - create_bounded_vec(vec![expected_msg]) - ); + assert_deferred_messages!(ParaId::from(1000), (12_u32, 0_u16), vec![Some(expected_msg)]); }); } diff --git a/pallets/xcmp-queue/src/weights.rs b/pallets/xcmp-queue/src/weights.rs index 1cdf709c8e9..dc318048fd5 100644 --- a/pallets/xcmp-queue/src/weights.rs +++ b/pallets/xcmp-queue/src/weights.rs @@ -13,32 +13,38 @@ pub trait WeightInfo { fn set_config_with_u32() -> Weight; fn set_config_with_weight() -> Weight; fn service_deferred() -> Weight; - fn discard_deferred() -> Weight; + fn discard_deferred_bucket() -> Weight; + fn discard_deferred_individual() -> Weight; + fn try_place_in_deferred_queue() -> Weight; } pub struct SubstrateWeight(PhantomData); -impl WeightInfo for SubstrateWeight { +impl SubstrateWeight { // Storage: XcmpQueue QueueConfig (r:1 w:1) // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) fn set_config_with_u32() -> Weight { - // Minimum execution time: 4_088 nanoseconds. - Weight::from_ref_time(4_368_000 as u64) + Weight::from_ref_time(8_036_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } // Storage: XcmpQueue QueueConfig (r:1 w:1) // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) fn set_config_with_weight() -> Weight { - // Minimum execution time: 4_111 nanoseconds. - Weight::from_ref_time(4_326_000 as u64) + Weight::from_ref_time(8_038_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } + // Storage: ParachainSystem ValidationData (r:1 w:0) + // Proof Skipped: ParachainSystem ValidationData (max_values: Some(1), max_size: None, mode: Measured) // Storage: XcmpQueue QueueConfig (r:1 w:0) // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) - // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue QueueSuspended (r:1 w:0) + // Proof Skipped: XcmpQueue QueueSuspended (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) // Storage: XcmpQueue CounterForOverweight (r:1 w:1) // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: XcmpQueue OverweightCount (r:1 w:1) @@ -46,42 +52,60 @@ impl WeightInfo for SubstrateWeight { // Storage: XcmpQueue Overweight (r:100 w:100) // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) fn service_deferred() -> Weight { - // Minimum execution time: 90_934_683 nanoseconds. - Weight::from_ref_time(91_491_151_000 as u64) - .saturating_add(T::DbWeight::get().reads(104 as u64)) - .saturating_add(T::DbWeight::get().writes(103 as u64)) + Weight::from_ref_time(221_105_465_000 as u64) + .saturating_add(T::DbWeight::get().reads(107 as u64)) + .saturating_add(T::DbWeight::get().writes(104 as u64)) } - // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) - // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) - fn discard_deferred() -> Weight { - // Minimum execution time: 62_131_073 nanoseconds. - Weight::from_ref_time(63_092_826_000 as u64) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + fn discard_deferred_bucket() -> Weight { + Weight::from_ref_time(149_864_999_000 as u64) .saturating_add(T::DbWeight::get().reads(1 as u64)) .saturating_add(T::DbWeight::get().writes(1 as u64)) } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + fn discard_deferred_individual() -> Weight { + Weight::from_ref_time(161_216_156_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + fn try_place_in_deferred_queue() -> Weight { + Weight::from_ref_time(510_298_000 as u64) + .saturating_add(T::DbWeight::get().reads(2 as u64)) + .saturating_add(T::DbWeight::get().writes(2 as u64)) + } } impl WeightInfo for () { // Storage: XcmpQueue QueueConfig (r:1 w:1) // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) fn set_config_with_u32() -> Weight { - // Minimum execution time: 4_088 nanoseconds. - Weight::from_ref_time(4_368_000 as u64) + Weight::from_ref_time(8_036_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } // Storage: XcmpQueue QueueConfig (r:1 w:1) // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) fn set_config_with_weight() -> Weight { - // Minimum execution time: 4_111 nanoseconds. - Weight::from_ref_time(4_326_000 as u64) + Weight::from_ref_time(8_038_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } + // Storage: ParachainSystem ValidationData (r:1 w:0) + // Proof Skipped: ParachainSystem ValidationData (max_values: Some(1), max_size: None, mode: Measured) // Storage: XcmpQueue QueueConfig (r:1 w:0) // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) - // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue QueueSuspended (r:1 w:0) + // Proof Skipped: XcmpQueue QueueSuspended (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) // Storage: XcmpQueue CounterForOverweight (r:1 w:1) // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: XcmpQueue OverweightCount (r:1 w:1) @@ -89,17 +113,31 @@ impl WeightInfo for () { // Storage: XcmpQueue Overweight (r:100 w:100) // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) fn service_deferred() -> Weight { - // Minimum execution time: 90_934_683 nanoseconds. - Weight::from_ref_time(91_491_151_000 as u64) - .saturating_add(RocksDbWeight::get().reads(104 as u64)) - .saturating_add(RocksDbWeight::get().writes(103 as u64)) + Weight::from_ref_time(221_105_465_000 as u64) + .saturating_add(RocksDbWeight::get().reads(107 as u64)) + .saturating_add(RocksDbWeight::get().writes(104 as u64)) } - // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) - // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) - fn discard_deferred() -> Weight { - // Minimum execution time: 62_131_073 nanoseconds. - Weight::from_ref_time(63_092_826_000 as u64) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + fn discard_deferred_bucket() -> Weight { + Weight::from_ref_time(149_864_999_000 as u64) .saturating_add(RocksDbWeight::get().reads(1 as u64)) .saturating_add(RocksDbWeight::get().writes(1 as u64)) } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + fn discard_deferred_individual() -> Weight { + Weight::from_ref_time(161_216_156_000 as u64) + .saturating_add(RocksDbWeight::get().reads(1 as u64)) + .saturating_add(RocksDbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + fn try_place_in_deferred_queue() -> Weight { + Weight::from_ref_time(510_298_000 as u64) + .saturating_add(RocksDbWeight::get().reads(2 as u64)) + .saturating_add(RocksDbWeight::get().writes(2 as u64)) + } } diff --git a/parachain-template/runtime/src/lib.rs b/parachain-template/runtime/src/lib.rs index 7b5d0b4e2f8..6c881499b1b 100644 --- a/parachain-template/runtime/src/lib.rs +++ b/parachain-template/runtime/src/lib.rs @@ -386,6 +386,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = (); type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/assets/statemine/src/lib.rs b/parachains/runtimes/assets/statemine/src/lib.rs index d3ab92a8119..449247bc2b6 100644 --- a/parachains/runtimes/assets/statemine/src/lib.rs +++ b/parachains/runtimes/assets/statemine/src/lib.rs @@ -476,6 +476,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = xcm_config::XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs index 1d3addb3921..b6682c66177 100644 --- a/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright 2022 Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,28 +14,28 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . + //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-27, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-9fxy16xz-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 1024 +//! DATE: 2023-09-19, STEPS: `20`, REPEAT: 40, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `bench-bot`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/release/polkadot-parachain // benchmark // pallet -// --chain=statemine-dev +// --chain=westmint-dev +// --steps=20 +// --repeat=40 // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --template=templates/xcm-bench-template.hbs // --pallet=cumulus_pallet_xcmp_queue +// --output=weights.rs // --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemine/src/weights/cumulus_pallet_xcmp_queue.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -44,29 +44,65 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for `cumulus_pallet_xcmp_queue`. +/// Weights for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: XcmpQueue QueueConfig (r:1 w:1) - /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_840 nanoseconds. - Weight::from_parts(5_169_000, 571) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) +impl WeightInfo { + // Storage: XcmpQueue QueueConfig (r:1 w:1) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + pub(crate) fn set_config_with_u32() -> Weight { + Weight::from_ref_time(8_036_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue QueueConfig (r:1 w:1) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + pub(crate) fn set_config_with_weight() -> Weight { + Weight::from_ref_time(8_038_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: ParachainSystem ValidationData (r:1 w:0) + // Proof Skipped: ParachainSystem ValidationData (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue QueueConfig (r:1 w:0) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue QueueSuspended (r:1 w:0) + // Proof Skipped: XcmpQueue QueueSuspended (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue CounterForOverweight (r:1 w:1) + // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: XcmpQueue OverweightCount (r:1 w:1) + // Proof Skipped: XcmpQueue OverweightCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue Overweight (r:100 w:100) + // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) + pub(crate) fn service_deferred() -> Weight { + Weight::from_ref_time(221_105_465_000 as u64) + .saturating_add(T::DbWeight::get().reads(107 as u64)) + .saturating_add(T::DbWeight::get().writes(104 as u64)) + } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn discard_deferred_bucket() -> Weight { + Weight::from_ref_time(149_864_999_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn discard_deferred_individual() -> Weight { + Weight::from_ref_time(161_216_156_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) } - /// Storage: XcmpQueue QueueConfig (r:1 w:1) - /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_743 nanoseconds. - Weight::from_parts(5_184_000, 571) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn try_place_in_deferred_queue() -> Weight { + Weight::from_ref_time(510_298_000 as u64) + .saturating_add(T::DbWeight::get().reads(2 as u64)) + .saturating_add(T::DbWeight::get().writes(2 as u64)) } -} +} \ No newline at end of file diff --git a/parachains/runtimes/assets/statemint/src/lib.rs b/parachains/runtimes/assets/statemint/src/lib.rs index 08c3f3e0911..2660ac0a24c 100644 --- a/parachains/runtimes/assets/statemint/src/lib.rs +++ b/parachains/runtimes/assets/statemint/src/lib.rs @@ -483,6 +483,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { >; type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs index c30af956633..b6682c66177 100644 --- a/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright 2022 Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,28 +14,28 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . + //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-27, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-9fxy16xz-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 1024 +//! DATE: 2023-09-19, STEPS: `20`, REPEAT: 40, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `bench-bot`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/release/polkadot-parachain // benchmark // pallet -// --chain=statemint-dev +// --chain=westmint-dev +// --steps=20 +// --repeat=40 // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --template=templates/xcm-bench-template.hbs // --pallet=cumulus_pallet_xcmp_queue +// --output=weights.rs // --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/statemint/src/weights/cumulus_pallet_xcmp_queue.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -44,29 +44,65 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for `cumulus_pallet_xcmp_queue`. +/// Weights for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: XcmpQueue QueueConfig (r:1 w:1) - /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_700 nanoseconds. - Weight::from_parts(4_964_000, 571) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) +impl WeightInfo { + // Storage: XcmpQueue QueueConfig (r:1 w:1) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + pub(crate) fn set_config_with_u32() -> Weight { + Weight::from_ref_time(8_036_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue QueueConfig (r:1 w:1) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + pub(crate) fn set_config_with_weight() -> Weight { + Weight::from_ref_time(8_038_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: ParachainSystem ValidationData (r:1 w:0) + // Proof Skipped: ParachainSystem ValidationData (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue QueueConfig (r:1 w:0) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue QueueSuspended (r:1 w:0) + // Proof Skipped: XcmpQueue QueueSuspended (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue CounterForOverweight (r:1 w:1) + // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: XcmpQueue OverweightCount (r:1 w:1) + // Proof Skipped: XcmpQueue OverweightCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue Overweight (r:100 w:100) + // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) + pub(crate) fn service_deferred() -> Weight { + Weight::from_ref_time(221_105_465_000 as u64) + .saturating_add(T::DbWeight::get().reads(107 as u64)) + .saturating_add(T::DbWeight::get().writes(104 as u64)) + } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn discard_deferred_bucket() -> Weight { + Weight::from_ref_time(149_864_999_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn discard_deferred_individual() -> Weight { + Weight::from_ref_time(161_216_156_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) } - /// Storage: XcmpQueue QueueConfig (r:1 w:1) - /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_769 nanoseconds. - Weight::from_parts(5_131_000, 571) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn try_place_in_deferred_queue() -> Weight { + Weight::from_ref_time(510_298_000 as u64) + .saturating_add(T::DbWeight::get().reads(2 as u64)) + .saturating_add(T::DbWeight::get().writes(2 as u64)) } -} +} \ No newline at end of file diff --git a/parachains/runtimes/assets/westmint/src/lib.rs b/parachains/runtimes/assets/westmint/src/lib.rs index 8d6e86d53a5..22e2826f891 100644 --- a/parachains/runtimes/assets/westmint/src/lib.rs +++ b/parachains/runtimes/assets/westmint/src/lib.rs @@ -467,6 +467,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; type ExecuteDeferredOrigin = EnsureRoot; type MaxDeferredMessages = ConstU32<100>; + type MaxDeferredBuckets = ConstU32<1000>; type XcmDeferFilter = (); } diff --git a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs index 6f777ec0d64..b6682c66177 100644 --- a/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright 2022 Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,28 +14,28 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . + //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-02-27, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-9fxy16xz-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! DATE: 2023-09-19, STEPS: `20`, REPEAT: 40, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! HOSTNAME: `bench-bot`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westmint-dev"), DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/release/polkadot-parachain // benchmark // pallet // --chain=westmint-dev +// --steps=20 +// --repeat=40 // --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --template=templates/xcm-bench-template.hbs // --pallet=cumulus_pallet_xcmp_queue +// --output=weights.rs // --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/westmint/src/weights/cumulus_pallet_xcmp_queue.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -44,29 +44,65 @@ use frame_support::{traits::Get, weights::Weight}; use sp_std::marker::PhantomData; -/// Weight functions for `cumulus_pallet_xcmp_queue`. +/// Weights for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: XcmpQueue QueueConfig (r:1 w:1) - /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_853 nanoseconds. - Weight::from_parts(5_234_000, 571) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) +impl WeightInfo { + // Storage: XcmpQueue QueueConfig (r:1 w:1) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + pub(crate) fn set_config_with_u32() -> Weight { + Weight::from_ref_time(8_036_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue QueueConfig (r:1 w:1) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + pub(crate) fn set_config_with_weight() -> Weight { + Weight::from_ref_time(8_038_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: ParachainSystem ValidationData (r:1 w:0) + // Proof Skipped: ParachainSystem ValidationData (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue QueueConfig (r:1 w:0) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue QueueSuspended (r:1 w:0) + // Proof Skipped: XcmpQueue QueueSuspended (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue CounterForOverweight (r:1 w:1) + // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: XcmpQueue OverweightCount (r:1 w:1) + // Proof Skipped: XcmpQueue OverweightCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue Overweight (r:100 w:100) + // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) + pub(crate) fn service_deferred() -> Weight { + Weight::from_ref_time(221_105_465_000 as u64) + .saturating_add(T::DbWeight::get().reads(107 as u64)) + .saturating_add(T::DbWeight::get().writes(104 as u64)) + } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn discard_deferred_bucket() -> Weight { + Weight::from_ref_time(149_864_999_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) + } + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn discard_deferred_individual() -> Weight { + Weight::from_ref_time(161_216_156_000 as u64) + .saturating_add(T::DbWeight::get().reads(1 as u64)) + .saturating_add(T::DbWeight::get().writes(1 as u64)) } - /// Storage: XcmpQueue QueueConfig (r:1 w:1) - /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `571` - // Minimum execution time: 4_684 nanoseconds. - Weight::from_parts(5_073_000, 571) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) + // Storage: XcmpQueue DeferredIndices (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredIndices (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredMessageBuckets (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredMessageBuckets (max_values: None, max_size: None, mode: Measured) + pub(crate) fn try_place_in_deferred_queue() -> Weight { + Weight::from_ref_time(510_298_000 as u64) + .saturating_add(T::DbWeight::get().reads(2 as u64)) + .saturating_add(T::DbWeight::get().writes(2 as u64)) } -} +} \ No newline at end of file diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs index 4eb3c1bb116..59f9daf331f 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -304,6 +304,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs index 8d7bc450007..7a5e9491a7d 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs @@ -69,4 +69,28 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + // Storage: XcmpQueue QueueConfig (r:1 w:0) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue CounterForOverweight (r:1 w:1) + // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: XcmpQueue OverweightCount (r:1 w:1) + // Proof Skipped: XcmpQueue OverweightCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue Overweight (r:100 w:100) + // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) + fn service_deferred() -> Weight { + // Minimum execution time: 90_934_683 nanoseconds. + Weight::from_ref_time(91_491_151_000) + .saturating_add(T::DbWeight::get().reads(104)) + .saturating_add(T::DbWeight::get().writes(103)) + } + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + fn discard_deferred() -> Weight { + // Minimum execution time: 62_131_073 nanoseconds. + Weight::from_ref_time(63_092_826_000) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs index d79e9c012c6..f83c119d36a 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -303,6 +303,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index a29de189d68..41f23d880a3 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -69,4 +69,29 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + // Storage: XcmpQueue QueueConfig (r:1 w:0) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue CounterForOverweight (r:1 w:1) + // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: XcmpQueue OverweightCount (r:1 w:1) + // Proof Skipped: XcmpQueue OverweightCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue Overweight (r:100 w:100) + // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) + fn service_deferred() -> Weight { + // Minimum execution time: 90_934_683 nanoseconds. + Weight::from_ref_time(91_491_151_000) + .saturating_add(T::DbWeight::get().reads(104)) + .saturating_add(T::DbWeight::get().writes(103)) + } + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + fn discard_deferred() -> Weight { + // Minimum execution time: 62_131_073 nanoseconds. + Weight::from_ref_time(63_092_826_000) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } + diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index b80056afca3..12aea42f4ec 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -334,6 +334,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs index b42a6a4f16c..e5d9322eb48 100644 --- a/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs @@ -69,4 +69,28 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + // Storage: XcmpQueue QueueConfig (r:1 w:0) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue CounterForOverweight (r:1 w:1) + // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: XcmpQueue OverweightCount (r:1 w:1) + // Proof Skipped: XcmpQueue OverweightCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue Overweight (r:100 w:100) + // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) + fn service_deferred() -> Weight { + // Minimum execution time: 90_934_683 nanoseconds. + Weight::from_ref_time(91_491_151_000) + .saturating_add(T::DbWeight::get().reads(104)) + .saturating_add(T::DbWeight::get().writes(103)) + } + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + fn discard_deferred() -> Weight { + // Minimum execution time: 62_131_073 nanoseconds. + Weight::from_ref_time(63_092_826_000) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs index 9919d73f7a9..2265f586f8a 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs @@ -370,6 +370,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs index a97416eb1fe..cf5c747f25c 100644 --- a/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs @@ -69,4 +69,28 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + // Storage: XcmpQueue QueueConfig (r:1 w:0) + // Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + // Storage: XcmpQueue CounterForOverweight (r:1 w:1) + // Proof: XcmpQueue CounterForOverweight (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: XcmpQueue OverweightCount (r:1 w:1) + // Proof Skipped: XcmpQueue OverweightCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: XcmpQueue Overweight (r:100 w:100) + // Proof Skipped: XcmpQueue Overweight (max_values: None, max_size: None, mode: Measured) + fn service_deferred() -> Weight { + // Minimum execution time: 90_934_683 nanoseconds. + Weight::from_ref_time(91_491_151_000) + .saturating_add(T::DbWeight::get().reads(104)) + .saturating_add(T::DbWeight::get().writes(103)) + } + // Storage: XcmpQueue DeferredXcmMessages (r:1 w:1) + // Proof Skipped: XcmpQueue DeferredXcmMessages (max_values: None, max_size: None, mode: Measured) + fn discard_deferred() -> Weight { + // Minimum execution time: 62_131_073 nanoseconds. + Weight::from_ref_time(63_092_826_000) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index c71a60107e3..aefb789bdc1 100644 --- a/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -232,6 +232,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/testing/penpal/src/lib.rs b/parachains/runtimes/testing/penpal/src/lib.rs index c6c6987fbc4..0424b550cd1 100644 --- a/parachains/runtimes/testing/penpal/src/lib.rs +++ b/parachains/runtimes/testing/penpal/src/lib.rs @@ -439,6 +439,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = (); type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 0b6927fa36f..cf8f5d7d3c9 100644 --- a/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -482,6 +482,11 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight; type PriceForSiblingDelivery = (); + type ExecuteDeferredOrigin = EnsureRoot; + type XcmDeferFilter = (); + type MaxDeferredMessages = ConstU32<10>; + type MaxDeferredBuckets = ConstU32<10>; + type RelayChainBlockNumberProvider = cumulus_pallet_parachain_system::RelaychainBlockNumberProvider; } impl cumulus_pallet_dmp_queue::Config for Runtime { diff --git a/rust-toolchain b/rust-toolchain new file mode 100644 index 00000000000..45d3fb304bb --- /dev/null +++ b/rust-toolchain @@ -0,0 +1,5 @@ +[toolchain] +channel = "nightly-2022-11-15" +components = [ "rustfmt", "clippy" ] +targets = [ "wasm32-unknown-unknown" ] +profile = "minimal"