Skip to content

Commit e2dc043

Browse files
committed
Improve XCMP weight metering
1 parent fa7f63f commit e2dc043

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

cumulus/pallets/xcmp-queue/src/benchmarking.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ mod benchmarks {
5555
let fp_before = T::XcmpQueue::footprint(0.into());
5656
#[block]
5757
{
58-
Pallet::<T>::enqueue_xcmp_message(0.into(), msg, &mut WeightMeter::new()).unwrap();
58+
Pallet::<T>::enqueue_xcmp_message(0.into(), msg).unwrap();
5959
}
6060
let fp_after = T::XcmpQueue::footprint(0.into());
6161
assert_eq!(fp_after.ready_pages, fp_before.ready_pages + 1);
@@ -77,8 +77,8 @@ mod benchmarks {
7777
let fp_before = T::XcmpQueue::footprint(0.into());
7878
#[block]
7979
{
80-
Pallet::<T>::enqueue_xcmp_message(0.into(), msg_1, &mut WeightMeter::new()).unwrap();
81-
Pallet::<T>::enqueue_xcmp_message(0.into(), msg_2, &mut WeightMeter::new()).unwrap();
80+
Pallet::<T>::enqueue_xcmp_message(0.into(), msg_1).unwrap();
81+
Pallet::<T>::enqueue_xcmp_message(0.into(), msg_2).unwrap();
8282
}
8383
let fp_after = T::XcmpQueue::footprint(0.into());
8484
assert_eq!(fp_after.ready_pages, fp_before.ready_pages + 1);

cumulus/pallets/xcmp-queue/src/lib.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -640,13 +640,7 @@ impl<T: Config> Pallet<T> {
640640
fn enqueue_xcmp_message(
641641
sender: ParaId,
642642
xcm: BoundedVec<u8, MaxXcmpMessageLenOf<T>>,
643-
meter: &mut WeightMeter,
644643
) -> Result<(), ()> {
645-
if meter.try_consume(T::WeightInfo::enqueue_xcmp_message()).is_err() {
646-
defensive!("Out of weight: cannot enqueue XCMP messages; dropping msg");
647-
return Err(())
648-
}
649-
650644
let QueueConfigData { drop_threshold, .. } = <QueueConfig<T>>::get();
651645
let fp = T::XcmpQueue::footprint(sender);
652646
// Assume that it will not fit into the current page:
@@ -794,22 +788,41 @@ impl<T: Config> XcmpMessageHandler for Pallet<T> {
794788
},
795789
}
796790
},
797-
XcmpMessageFormat::ConcatenatedVersionedXcm =>
791+
XcmpMessageFormat::ConcatenatedVersionedXcm => {
792+
let mut new_page = true;
798793
while !data.is_empty() {
799794
let Ok(xcm) = Self::take_first_concatenated_xcm(&mut data, &mut meter)
800795
else {
801796
defensive!("HRMP inbound decode stream broke; page will be dropped.",);
802797
break
803798
};
804799

805-
if let Err(()) = Self::enqueue_xcmp_message(sender, xcm, &mut meter) {
800+
// For simplicity, we consider that each new XCMP page results in a new
801+
// message queue page. This is not always true, but it's a good enough
802+
// estimation.
803+
if meter
804+
.try_consume(T::WeightInfo::enqueue_xcmp_message(xcm.len(), new_page))
805+
.is_err()
806+
{
807+
defensive!(
808+
"Out of weight: cannot enqueue XCMP messages; dropping msg; \
809+
Used weight: ",
810+
meter.consumed_ratio()
811+
);
812+
break;
813+
}
814+
815+
if let Err(()) = Self::enqueue_xcmp_message(sender, xcm) {
806816
defensive!(
807817
"Could not enqueue XCMP messages. Used weight: ",
808818
meter.consumed_ratio()
809819
);
810820
break
811821
}
812-
},
822+
823+
new_page = false;
824+
}
825+
},
813826
XcmpMessageFormat::ConcatenatedEncodedBlob => {
814827
defensive!("Blob messages are unhandled - dropping");
815828
continue

cumulus/pallets/xcmp-queue/src/weights_ext.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,22 @@
1818
use crate::weights::WeightInfo;
1919

2020
use frame_support::weights::Weight;
21+
use sp_runtime::SaturatedConversion;
2122

2223
/// Extended weight info.
2324
pub trait WeightInfoExt: WeightInfo {
24-
fn enqueue_xcmp_message() -> Weight {
25-
Self::enqueue_n_bytes_xcmp_message(0)
25+
fn enqueue_xcmp_message(size_in_bytes: usize, new_page: bool) -> Weight {
26+
let size_in_bytes = size_in_bytes.saturated_into();
27+
match new_page {
28+
true => Self::enqueue_n_bytes_xcmp_message(size_in_bytes),
29+
false => {
30+
let size_overhead = Self::enqueue_n_bytes_xcmp_message(size_in_bytes) -
31+
Self::enqueue_n_bytes_xcmp_message(0);
32+
Self::enqueue_2_empty_xcmp_messages()
33+
.saturating_sub(Self::enqueue_n_bytes_xcmp_message(0))
34+
.saturating_add(size_overhead)
35+
},
36+
}
2637
}
2738
}
2839

0 commit comments

Comments
 (0)