- Dec 07, 2023
-
-
Oliver Tale-Yazdi authored
Closes https://github.com/paritytech/polkadot-sdk/issues/2319 Changes: - Ensure that only `enqueue_message(s)` is callable from within the message processor. This prevents messed up storage that can currently happen when the pallet is called into recursively. - Use `H256` instead of `[u8; 32]` for clearer API. ## Details The re-entracy check is done with the `environmental` crate by adding a `with_service_mutex(f)` function that runs the closure exclusively. This works since the MQ pallet is not instantiable. --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Francisco Aguirre <[email protected]>
-
- Nov 02, 2023
-
-
Oliver Tale-Yazdi authored
(imported from https://github.com/paritytech/cumulus/pull/2157) ## Changes This MR refactores the XCMP, Parachains System and DMP pallets to use the [MessageQueue](https://github.com/paritytech/substrate/pull/12485) for delayed execution of incoming messages. The DMP pallet is entirely replaced by the MQ and thereby removed. This allows for PoV-bounded execution and resolves a number of issues that stem from the current work-around. All System Parachains adopt this change. The most important changes are in `primitives/core/src/lib.rs`, `parachains/common/src/process_xcm_message.rs`, `pallets/parachain-system/src/lib.rs`, `pallets/xcmp-queue/src/lib.rs` and the runtime configs. ### DMP Queue Pallet The pallet got removed and its logic refactored into parachain-system. Overweight message management can be done directly through the MQ pallet. Final undeployment migrations are provided by `cumulus_pallet_dmp_queue::UndeployDmpQueue` and `DeleteDmpQueue` that can be configured with an aux config trait like: ```rust parameter_types! { pub const DmpQueuePalletName: &'static str = \"DmpQueue\" < CHANGE ME; pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent; } impl cumulus_pallet_dmp_queue::MigrationConfig for Runtime { type PalletName = DmpQueuePalletName; type DmpHandler = frame_support::traits::EnqueueWithOrigin<MessageQueue, RelayOrigin>; type DbWeight = <Runtime as frame_system::Config>::DbWeight; } // And adding them to your Migrations tuple: pub type Migrations = ( ... cumulus_pallet_dmp_queue::UndeployDmpQueue<Runtime>, cumulus_pallet_dmp_queue::DeleteDmpQueue<Runtime>, ); ``` ### XCMP Queue pallet Removed all dispatch queue functionality. Incoming XCMP messages are now either: Immediately handled if they are Signals, enqueued into the MQ pallet otherwise. New config items for the XCMP queue pallet: ```rust /// The actual queue implementation that retains the messages for later processing. type XcmpQueue: EnqueueMessage<ParaId>; /// How a XCM over HRMP from a sibling parachain should be processed. type XcmpProcessor: ProcessMessage<Origin = ParaId>; /// The maximal number of suspended XCMP channels at the same time. #[pallet::constant] type MaxInboundSuspended: Get<u32>; ``` How to configure those: ```rust // Use the MessageQueue pallet to store messages for later processing. The `TransformOrigin` is needed since // the MQ pallet itself operators on `AggregateMessageOrigin` but we want to enqueue `ParaId`s. type XcmpQueue = TransformOrigin<MessageQueue, AggregateMessageOrigin, ParaId, ParaIdToSibling>; // Process XCMP messages from siblings. This is type-safe to only accept `ParaId`s. They will be dispatched // with origin `Junction::Sibling(…)`. type XcmpProcessor = ProcessFromSibling< ProcessXcmMessage< AggregateMessageOrigin, xcm_executor::XcmExecutor<xcm_config::XcmConfig>, RuntimeCall, >, >; // Not really important what to choose here. Just something larger than the maximal number of channels. type MaxInboundSuspended = sp_core::ConstU32<1_000>; ``` The `InboundXcmpStatus` storage item was replaced by `InboundXcmpSuspended` since it now only tracks inbound queue suspension and no message indices anymore. Now only sends the most recent channel `Signals`, as all prio ones are out-dated anyway. ### Parachain System pallet For `DMP` messages instead of forwarding them to the `DMP` pallet, it now pushes them to the configured `DmpQueue`. The message processing which was triggered in `set_validation_data` is now being done by the MQ pallet `on_initialize`. XCMP messages are still handed off to the `XcmpMessageHandler` (XCMP-Queue pallet) - no change here. New config items for the parachain system pallet: ```rust /// Queues inbound downward messages for delayed processing. /// /// Analogous to the `XcmpQueue` of the XCMP queue pallet. type DmpQueue: EnqueueMessage<AggregateMessageOrigin>; ``` How to configure: ```rust /// Use the MQ pallet to store DMP messages for delayed processing. type DmpQueue = MessageQueue; ``` ## Message Flow The flow of messages on the parachain side. Messages come in from the left via the `Validation Data` and finally end up at the `Xcm Executor` on the right. ![Untitled (1)](https://github.com/paritytech/cumulus/assets/10380170/6cf8b377-88c9-4aed-96df-baace266e04d) ## Further changes - Bumped the default suspension, drop and resume thresholds in `QueueConfigData::default()`. - `XcmpQueue::{suspend_xcm_execution, resume_xcm_execution}` errors when they would be a noop. - Properly validate the `QueueConfigData` before setting it. - Marked weight files as auto-generated so they wont auto-expand in the MR files view. - Move the `hypothetical` asserts to `frame_support` under the name `experimental_hypothetically` Questions: - [ ] What about the ugly `#[cfg(feature = \"runtime-benchmarks\")]` in the runtimes? Not sure how to best fix. Just having them like this makes tests fail that rely on the real message processor when the feature is enabled. - [ ] Need a good weight for `MessageQueueServiceWeight`. The scheduler already takes 80% so I put it to 10% but that is quite low. TODO: - [x] Remove c&p code after https://github.com/paritytech/polkadot/pull/6271 - [x] Use `HandleMessage` once it is public in Substrate - [x] fix `runtime-benchmarks` feature https://github.com/paritytech/polkadot/pull/6966 - [x] Benchmarks - [x] Tests - [ ] Migrate `InboundXcmpStatus` to `InboundXcmpSuspended` - [x] Possibly cleanup Migrations (DMP+XCMP) - [x] optional: create `TransformProcessMessageOrigin` in Substrate and replace `ProcessFromSibling` - [ ] Rerun weights on ref HW --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Liam Aharon <[email protected]> Co-authored-by: joe petrowski <[email protected]> Co-authored-by: Kian Paimani <[email protected]> Co-authored-by: command-bot <>
-
- Oct 19, 2023
-
-
Oliver Tale-Yazdi authored
Changes: - Use a sensible limit for the overweight-cutoff of a single messages instead of the full configured `ServiceWeight`. - Add/Update tests --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]>
-
- Sep 01, 2023
-
-
gupnik authored
Co-authored-by: Javier Viola <[email protected]>
-
- Aug 14, 2023
-
-
Deepanshu Hooda authored
* feat: Add try_state for message_queue * Update frame/message-queue/src/lib.rs change if let to while let and modify bump_service_head function Co-authored-by: Oliver Tale-Yazdi <[email protected]> * feat: update try_state, add checks for storage * fix: add try_state builder for remaining tests * Update frame/message-queue/src/mock.rs Co-authored-by: Oliver Tale-Yazdi <[email protected]> * chore: assert statement to ensure * Fix tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Use ensure instead of assert Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix function signature and feature gate Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Cleanup code Signed-off-by: Oliver Tale-Yazdi <[email protected]> --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Juan <[email protected]>
-
- Jul 18, 2023
-
-
Oliver Tale-Yazdi authored
* Rename WeightMeter functions * Fixes Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fixup and doc + tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * One more test Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fixup pallets Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Use correct function
🤦 Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Apply suggestions from code review Co-authored-by: Juan <[email protected]> * Update primitives/weights/src/weight_meter.rs Co-authored-by: Bastian Köcher <[email protected]> * Update primitives/weights/src/weight_meter.rs Co-authored-by: Bastian Köcher <[email protected]> * Update primitives/weights/src/weight_meter.rs --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Juan <[email protected]> Co-authored-by: Bastian Köcher <[email protected]>
-
- Jun 28, 2023
-
-
Oliver Tale-Yazdi authored
* pallet-message-queue: add queue pausing Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix build Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Remove check Otherwise it would not start servicing queues that started paused and became unpaused afterwards. Signed-off-by: Oliver Tale-Yazdi <[email protected]> --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]>
-
- May 21, 2023
-
-
Gavin Wood authored
-
- Mar 07, 2023
-
-
Oliver Tale-Yazdi authored
* Unknit permanently overweight books A book with only permanently overweight messages should be unkit from the ready ring. This does currently not happen since perm. overweight messages are not counted as "processed" and therefore not increase the "total_processed" counter. This is only a problem when the next and only message that is processed is overweight. Eventually this should resolve itself when another non-overweight message is enqueued and processed. But for correctness it should be unknitted. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * fmt Signed-off-by: Oliver Tale-Yazdi <[email protected]> * One more tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet-message-queue --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: command-bot <>
-
- Feb 25, 2023
-
-
Oliver Tale-Yazdi authored
* Add Yield message processing error Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add NoopServiceQueues Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Implement temporary error aka Yield Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Make NoopMessageProcessor generic Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Mock pausable message processor Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Test paused queues Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Integration test paused queues Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Use WeightMeter instead of weight return Signed-off-by: Oliver Tale-Yazdi <[email protected]> * fix Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Make compile Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_message_queue * Fix test Signed-off-by: Oliver Tale-Yazdi <[email protected]> --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: command-bot <>
-
- Feb 21, 2023
-
-
Vivek Pandya authored
* Change copyright year to 2023 from 2022 * Fix incorrect update of copyright year * Remove years from copy right header * Fix remaining files * Fix typo in a header and remove update-copyright.sh
-
- Dec 09, 2022
-
-
Gavin Wood authored
* The message queue * Make fully generic * Refactor * Docs * Refactor * Use iter not slice * Per-origin queues * Multi-queue processing * Introduce MaxReady * Remove MaxReady in favour of ready ring * Cleanups * ReadyRing and tests * Stale page reaping * from_components -> from_parts Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Move WeightCounter to sp_weights Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add MockedWeightInfo Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Deploy to kitchensink Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Use WeightCounter Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Small fixes and logging Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add service_page Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Typo Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Move service_page below service_queue Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add service_message Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Use correct weight function Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Overweight execution * Refactor * Missing file * Fix WeightCounter usage in scheduler Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix peek_index Take into account that decoding from a mutable slice modifies it. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add tests and bench service_page_item Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add debug_info Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add no-progress check to service_queues Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add more benches Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Bound from_message and try_append_message Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add PageReaped event Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Rename BookStateOf and BookStateFor Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Update tests and remove logging Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Remove redundant per-message origins; add footprint() and sweep_queue() * Move testing stuff to mock.rs Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add integration test Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix no-progress check Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix debug_info Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fixup merge and tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix footprint tracking * Introduce * Formatting * OverweightEnqueued event, auto-servicing config item * Update tests and benchmarks Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Clippy Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Provide change handler * Add missing BookStateFor::insert and call QueueChangeHandler Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Docs Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Update benchmarks and weights Signed-off-by: Oliver Tale-Yazdi <[email protected]> * More tests... Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Use weight metering functions Signed-off-by: Oliver Tale-Yazdi <[email protected]> * weightInfo::process_message_payload is gone Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add defensive_saturating_accrue Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Rename WeightCounter to WeightMeter Ctr+Shift+H should do the trick. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Test on_initialize Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add module docs Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Remove origin from MaxMessageLen The message origin is not encoded into the heap and does therefore not influence the max message length anymore. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add BoundedVec::as_slice Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Test Page::{from_message, try_append_message} Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fixup docs Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Docs * Do nothing in sweep_queue if the queue does not exist ... otherwise it inserts default values into the storage. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Test ring (un)knitting Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Upgrade stress-test Change the test to not assume that all queued messages will be processed in the next block but split it over multiple. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * More tests... Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Beauty fixes Signed-off-by: Oliver Tale-Yazdi <[email protected]> * clippy Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Rename BoundedVec::as_slice to as_bounded_slice Conflicts with deref().as_slice() otherwise. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix imports Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Remove ReadyRing struct Was used for testing only. Instead use 'fn assert_ring' which also check the service head and backlinks. Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Beauty fixes Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix stale page watermark Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Cleanup Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix test feature and clippy Signed-off-by: Oliver Tale-Yazdi <[email protected]> * QueueChanged handler is called correctly Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Update benches Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Abstract testing functions Signed-off-by: Oliver Tale-Yazdi <[email protected]> * More tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Cleanup Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Clippy Signed-off-by: Oliver Tale-Yazdi <[email protected]> * fmt Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Simplify tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Make stuff compile Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Extend overweight execution benchmark Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Remove TODOs Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Test service queue with faulty MessageProcessor Signed-off-by: Oliver Tale-Yazdi <[email protected]> * fmt Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Update pallet ui tests to 1.65 Signed-off-by: Oliver Tale-Yazdi <[email protected]> * More docs Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Review doc fixes Co-authored-by: Robert Klotzner <[email protected]> Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Add weight_limit to extrinsic weight of execute_overweight * Correctly return unused weight * Return actual weight consumed in do_execute_overweight * Review fixes Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Set version 7.0.0-dev Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Make it compile Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Switch message_size to u64 Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Switch message_count to u64 Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Fix benchmarks Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Make CI green Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Docs * Update tests Signed-off-by: Oliver Tale-Yazdi <[email protected]> * ".git/.scripts/bench-bot.sh" pallet dev pallet_message_queue * Dont mention README.md in the Cargo.toml Signed-off-by: Oliver Tale-Yazdi <[email protected]> * Remove reference to readme Signed-off-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: parity-processbot <> Co-authored-by: Robert Klotzner <[email protected]> Co-authored-by: Keith Yeung <[email protected]>
-