Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parachains: Use relay chain slot for velocity measurement #6825

Merged
merged 28 commits into from
Jan 14, 2025

Conversation

skunert
Copy link
Contributor

@skunert skunert commented Dec 10, 2024

closes #3967

Changes

We now use relay chain slots to measure velocity on chain. Previously we were storing the current parachain slot. Then in on_state_proof of the ConsensusHook we were checking how many blocks were athored in the current parachain slot. This works well when the parachain slot time and relay chain slot time is the same. With elastic scaling, we can have parachain slot times lower than that of the relay chain. In these cases we want to measure velocity in relation to the relay chain. This PR adjusts that.

Migration

This PR includes a migration. Storage item SlotInfo of pallet aura-ext is renamed to RelaySlotInfo to better reflect its new content. A migration has been added that just kills the old storage item. RelaySlotInfo will be None initially but its value will be adjusted after one new relay chain slot arrives.

@skunert skunert added the T9-cumulus This PR/Issue is related to cumulus. label Dec 10, 2024
@skunert
Copy link
Contributor Author

skunert commented Dec 10, 2024

bot fmt

@command-bot
Copy link

command-bot bot commented Dec 10, 2024

@skunert https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7892036 was started for your command "$PIPELINE_SCRIPTS_DIR/commands/fmt/fmt.sh". Check out https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/pipelines?page=1&scope=all&username=group_605_bot to know what else is being executed currently.

Comment bot cancel 23-6352bad6-c9e1-4490-bf52-e6b6f707a5f3 to cancel this command or bot cancel to cancel all commands in this pull request.

@command-bot
Copy link

command-bot bot commented Dec 10, 2024

@skunert Command "$PIPELINE_SCRIPTS_DIR/commands/fmt/fmt.sh" has finished. Result: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7892036 has finished. If any artifacts were generated, you can download them from https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7892036/artifacts/download.

@skunert
Copy link
Contributor Author

skunert commented Dec 11, 2024

bot fmt

@command-bot
Copy link

command-bot bot commented Dec 11, 2024

@skunert https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7898854 was started for your command "$PIPELINE_SCRIPTS_DIR/commands/fmt/fmt.sh". Check out https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/pipelines?page=1&scope=all&username=group_605_bot to know what else is being executed currently.

Comment bot cancel 26-f389b4df-c557-4572-a276-5937d6dc8d7d to cancel this command or bot cancel to cancel all commands in this pull request.

@command-bot
Copy link

command-bot bot commented Dec 11, 2024

@skunert Command "$PIPELINE_SCRIPTS_DIR/commands/fmt/fmt.sh" has finished. Result: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7898854 has finished. If any artifacts were generated, you can download them from https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7898854/artifacts/download.

@skunert
Copy link
Contributor Author

skunert commented Dec 13, 2024

/cmd prdoc --bump patch --audience runtime_dev,node_dev

@skunert skunert marked this pull request as ready for review December 13, 2024 16:12
@skunert skunert requested review from bkchr and alindima December 13, 2024 16:13
Copy link
Contributor

@alindima alindima left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM overall!

let Ok(Some(api_version)) =
runtime_api.api_version::<dyn AuraUnincludedSegmentApi<Block>>(parent_hash)
else {
return Some(SlotClaim::unchecked::<P>(author_pub, para_slot, timestamp))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't we return None if we couldn't get the api version?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, if we have None, it means the api doesn't exist and we should return an error.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed this to be backward compatible with the previous behaviour. If we are building on top of the included block, the previous implementation would return Some. I don't think it is likely that someone runs this with a runtime without AuraUnincludedSegmentApi, but technically its possible.

@@ -70,20 +74,7 @@ pub mod pallet {
// Fetch the authorities once to get them into the storage proof of the PoV.
Authorities::<T>::get();

let new_slot = pallet_aura::CurrentSlot::<T>::get();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it feels a bit weird that the pallet now has a RelaySlotInfo storage item that is never updated by the pallet (but only in an optional ConsensusHook, which parachains could in theory overwrite). Not a big deal though

cumulus/pallets/aura-ext/src/test.rs Outdated Show resolved Hide resolved
let Ok(Some(api_version)) =
runtime_api.api_version::<dyn AuraUnincludedSegmentApi<Block>>(parent_hash)
else {
return Some(SlotClaim::unchecked::<P>(author_pub, para_slot, timestamp))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, if we have None, it means the api doesn't exist and we should return an error.

cumulus/pallets/aura-ext/src/consensus_hook.rs Outdated Show resolved Hide resolved
cumulus/pallets/aura-ext/src/consensus_hook.rs Outdated Show resolved Hide resolved
cumulus/pallets/aura-ext/src/migration.rs Show resolved Hide resolved
# Conflicts:
#	cumulus/client/consensus/aura/src/collators/slot_based/block_builder_task.rs
#	cumulus/client/parachain-inherent/src/mock.rs
@skunert
Copy link
Contributor Author

skunert commented Dec 18, 2024

bot fmt

@command-bot

This comment was marked as resolved.

@command-bot

This comment was marked as resolved.

@skunert
Copy link
Contributor Author

skunert commented Dec 19, 2024

bot fmt

@command-bot

This comment was marked as resolved.

@command-bot

This comment was marked as resolved.

@skunert skunert requested a review from bkchr January 3, 2025 13:40
cumulus/client/consensus/aura/src/collators/mod.rs Outdated Show resolved Hide resolved
None => (relay_chain_slot, 0),
};

// We need to allow one additional block to be built to fill the unincluded segment.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't really get this comment.

cumulus/pallets/aura-ext/src/migration.rs Show resolved Hide resolved
Co-authored-by: Bastian Köcher <git@kchr.de>
@paritytech-workflow-stopper
Copy link

All GitHub workflows were cancelled due to failure one of the required jobs.
Failed workflow url: https://github.com/paritytech/polkadot-sdk/actions/runs/12752246539
Failed job name: fmt

@skunert skunert enabled auto-merge January 14, 2025 20:20
@skunert skunert added this pull request to the merge queue Jan 14, 2025
Merged via the queue into master with commit d5539aa Jan 14, 2025
192 of 204 checks passed
@skunert skunert deleted the skunert/relay_slot_velocity branch January 14, 2025 23:20
ordian added a commit that referenced this pull request Jan 16, 2025
* master: (33 commits)
  Implement `pallet-asset-rewards` (#3926)
  [pallet-revive] Add host function `to_account_id` (#7091)
  [pallet-revive] Remove revive events (#7164)
  [pallet-revive] Remove debug buffer (#7163)
  litep2p: Provide partial results to speedup GetRecord queries (#7099)
  [pallet-revive] Bump asset-hub westend spec version (#7176)
  Remove 0 as a special case in gas/storage meters (#6890)
  [pallet-revive] Fix `caller_is_root` return value (#7086)
  req-resp/litep2p: Reject inbound requests from banned peers (#7158)
  Add "run to block" tools (#7109)
  Fix reversed error message in DispatchInfo (#7170)
  approval-voting: Make importing of duplicate assignment idempotent (#6971)
  Parachains: Use relay chain slot for velocity measurement (#6825)
  PRDOC: Document `validate: false` (#7117)
  xcm: convert properly assets in xcmpayment apis (#7134)
  CI: Only format umbrella crate during umbrella check (#7139)
  approval-voting: Fix sending of assignments after restart (#6973)
  Retry approval on availability failure if the check is still needed (#6807)
  [pallet-revive-eth-rpc] persist eth transaction hash (#6836)
  litep2p: Sufix litep2p to the identify agent version for visibility (#7133)
  ...
github-merge-queue bot pushed a commit that referenced this pull request Jan 20, 2025
…d block (#7205)

Follow-up to #6825, which introduced this bug.

We use the `can_build_upon` method to ask the runtime if it is fine to
build another block. The runtime checks this based on the
[`ConsensusHook`](https://github.com/paritytech/polkadot-sdk/blob/c1b7c3025aa4423d4cf3e57309b60fb7602c2db6/cumulus/pallets/aura-ext/src/consensus_hook.rs#L110-L110)
implementation, the most popular one being the `FixedConsensusHook`.

In #6825 I removed a check that would always allow us to build when we
are building on an included block. Turns out this check is still
required when:
1. The [`UnincludedSegment`
](https://github.com/paritytech/polkadot-sdk/blob/c1b7c3025aa4423d4cf3e57309b60fb7602c2db6/cumulus/pallets/parachain-system/src/lib.rs#L758-L758)
storage item in pallet-parachain-system is equal or larger than the
unincluded segment.
2. We are calling the `can_build_upon` runtime API where the included
block has progressed offchain to the current parent block (so last entry
in the `UnincludedSegment` storage item).

In this scenario the last entry in `UnincludedSegment` does not have a
hash assigned yet (because it was not available in `on_finalize` of the
previous block). So the unincluded segment will be reported at its
maximum length which will forbid building another block.

Ideally we would have a more elegant solution than to rely on the
node-side here. But for now the check is reintroduced and a test is
added to not break it again by accident.

---------

Co-authored-by: command-bot <>
Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
T9-cumulus This PR/Issue is related to cumulus.
Projects
Status: done
Status: Audited
Development

Successfully merging this pull request may close these issues.

slot-based-collator: Adjust ConsensusHook and parent search
3 participants