mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-29 21:57:55 +00:00
Yieldable queues for pallet MessageQueue (#13424)
* Add Yield message processing error Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Add NoopServiceQueues Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Implement temporary error aka Yield Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Make NoopMessageProcessor generic Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Mock pausable message processor Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Test paused queues Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Integration test paused queues Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Use WeightMeter instead of weight return Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * fix Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Make compile Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Add tests Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_message_queue * Fix test Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> --------- Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: command-bot <>
This commit is contained in:
committed by
GitHub
parent
84638524e7
commit
16773d3696
@@ -171,8 +171,9 @@ fn service_queues_failing_messages_works() {
|
||||
MessageQueue::enqueue_message(msg("badformat"), Here);
|
||||
MessageQueue::enqueue_message(msg("corrupt"), Here);
|
||||
MessageQueue::enqueue_message(msg("unsupported"), Here);
|
||||
// Starts with three pages.
|
||||
assert_pages(&[0, 1, 2]);
|
||||
MessageQueue::enqueue_message(msg("yield"), Here);
|
||||
// Starts with four pages.
|
||||
assert_pages(&[0, 1, 2, 3]);
|
||||
|
||||
assert_eq!(MessageQueue::service_queues(1.into_weight()), 1.into_weight());
|
||||
assert_last_event::<Test>(
|
||||
@@ -201,8 +202,65 @@ fn service_queues_failing_messages_works() {
|
||||
}
|
||||
.into(),
|
||||
);
|
||||
// All pages removed.
|
||||
assert_pages(&[]);
|
||||
assert_eq!(MessageQueue::service_queues(1.into_weight()), 1.into_weight());
|
||||
assert_eq!(System::events().len(), 3);
|
||||
// Last page with the `yield` stays in.
|
||||
assert_pages(&[3]);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn service_queues_suspension_works() {
|
||||
use MessageOrigin::*;
|
||||
new_test_ext::<Test>().execute_with(|| {
|
||||
MessageQueue::enqueue_messages(vec![msg("a"), msg("b"), msg("c")].into_iter(), Here);
|
||||
MessageQueue::enqueue_messages(vec![msg("x"), msg("y"), msg("z")].into_iter(), There);
|
||||
MessageQueue::enqueue_messages(
|
||||
vec![msg("m"), msg("n"), msg("o")].into_iter(),
|
||||
Everywhere(0),
|
||||
);
|
||||
assert_eq!(QueueChanges::take(), vec![(Here, 3, 3), (There, 3, 3), (Everywhere(0), 3, 3)]);
|
||||
|
||||
// Service one message from `Here`.
|
||||
assert_eq!(MessageQueue::service_queues(1.into_weight()), 1.into_weight());
|
||||
assert_eq!(MessagesProcessed::take(), vec![(vmsg("a"), Here)]);
|
||||
assert_eq!(QueueChanges::take(), vec![(Here, 2, 2)]);
|
||||
|
||||
// Pause queue `Here` and `Everywhere(0)`.
|
||||
SuspendedQueues::set(vec![Here, Everywhere(0)]);
|
||||
|
||||
// Service one message from `There`.
|
||||
assert_eq!(MessageQueue::service_queues(1.into_weight()), 1.into_weight());
|
||||
assert_eq!(MessagesProcessed::take(), vec![(vmsg("x"), There)]);
|
||||
assert_eq!(QueueChanges::take(), vec![(There, 2, 2)]);
|
||||
|
||||
// Now it would normally swap to `Everywhere(0)` and `Here`, but they are paused so we
|
||||
// expect `There` again.
|
||||
assert_eq!(MessageQueue::service_queues(2.into_weight()), 2.into_weight());
|
||||
assert_eq!(MessagesProcessed::take(), vec![(vmsg("y"), There), (vmsg("z"), There)]);
|
||||
|
||||
// Processing with max-weight won't do anything.
|
||||
assert_eq!(MessageQueue::service_queues(Weight::MAX), Weight::zero());
|
||||
assert_eq!(MessageQueue::service_queues(Weight::MAX), Weight::zero());
|
||||
|
||||
// ... until we resume `Here`:
|
||||
SuspendedQueues::set(vec![Everywhere(0)]);
|
||||
assert_eq!(MessageQueue::service_queues(Weight::MAX), 2.into_weight());
|
||||
assert_eq!(MessagesProcessed::take(), vec![(vmsg("b"), Here), (vmsg("c"), Here)]);
|
||||
|
||||
// Everywhere still won't move.
|
||||
assert_eq!(MessageQueue::service_queues(Weight::MAX), Weight::zero());
|
||||
SuspendedQueues::take();
|
||||
// Resume `Everywhere(0)` makes it work.
|
||||
assert_eq!(MessageQueue::service_queues(Weight::MAX), 3.into_weight());
|
||||
assert_eq!(
|
||||
MessagesProcessed::take(),
|
||||
vec![
|
||||
(vmsg("m"), Everywhere(0)),
|
||||
(vmsg("n"), Everywhere(0)),
|
||||
(vmsg("o"), Everywhere(0))
|
||||
]
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -379,7 +437,7 @@ fn service_page_works() {
|
||||
assert_eq!(status, Bailed);
|
||||
}
|
||||
}
|
||||
assert!(!Pages::<Test>::contains_key(Here, 0), "The page got removed");
|
||||
assert_pages(&[]);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -445,6 +503,57 @@ fn service_page_item_bails() {
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn service_page_suspension_works() {
|
||||
use super::integration_test::Test; // Run with larger page size.
|
||||
use MessageOrigin::*;
|
||||
use PageExecutionStatus::*;
|
||||
|
||||
new_test_ext::<Test>().execute_with(|| {
|
||||
let (page, mut msgs) = full_page::<Test>();
|
||||
assert!(msgs >= 10, "pre-condition: need at least 10 msgs per page");
|
||||
let mut book = book_for::<Test>(&page);
|
||||
Pages::<Test>::insert(Here, 0, page);
|
||||
|
||||
// First we process 5 messages from this page.
|
||||
let mut meter = WeightMeter::from_limit(5.into_weight());
|
||||
let (_, status) =
|
||||
crate::Pallet::<Test>::service_page(&Here, &mut book, &mut meter, Weight::MAX);
|
||||
|
||||
assert_eq!(NumMessagesProcessed::take(), 5);
|
||||
assert!(meter.remaining().is_zero());
|
||||
assert_eq!(status, Bailed); // It bailed since weight is missing.
|
||||
msgs -= 5;
|
||||
|
||||
// Then we pause the queue.
|
||||
SuspendedQueues::set(vec![Here]);
|
||||
// Noting happens...
|
||||
for _ in 0..5 {
|
||||
let (_, status) = crate::Pallet::<Test>::service_page(
|
||||
&Here,
|
||||
&mut book,
|
||||
&mut WeightMeter::max_limit(),
|
||||
Weight::MAX,
|
||||
);
|
||||
assert_eq!(status, NoProgress);
|
||||
assert!(NumMessagesProcessed::take().is_zero());
|
||||
}
|
||||
|
||||
// Resume and process all remaining.
|
||||
SuspendedQueues::take();
|
||||
let (_, status) = crate::Pallet::<Test>::service_page(
|
||||
&Here,
|
||||
&mut book,
|
||||
&mut WeightMeter::max_limit(),
|
||||
Weight::MAX,
|
||||
);
|
||||
assert_eq!(status, NoMore);
|
||||
assert_eq!(NumMessagesProcessed::take(), msgs);
|
||||
|
||||
assert!(Pages::<Test>::iter_keys().count().is_zero());
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bump_service_head_works() {
|
||||
use MessageOrigin::*;
|
||||
|
||||
Reference in New Issue
Block a user