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

Collator: Fix can_build_upon by always allowing to build on included block #7205

Merged
merged 10 commits into from
Jan 20, 2025

Conversation

skunert
Copy link
Contributor

@skunert skunert commented Jan 16, 2025

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 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 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.

@skunert skunert added the T0-node This PR/Issue is related to the topic “node”. label Jan 16, 2025
@skunert skunert requested a review from a team January 16, 2025 16:18
@skunert
Copy link
Contributor Author

skunert commented Jan 16, 2025

/cmd prdoc --bump minor --audience node_dev

cumulus/client/consensus/aura/Cargo.toml Outdated Show resolved Hide resolved
cumulus/client/consensus/aura/src/collators/mod.rs Outdated Show resolved Hide resolved
@skunert skunert requested a review from a team January 17, 2025 13:54
skunert and others added 2 commits January 17, 2025 17:14
Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com>
@skunert skunert enabled auto-merge January 17, 2025 16:24
@skunert skunert added this pull request to the merge queue Jan 17, 2025
auto-merge was automatically disabled January 17, 2025 17:39

Pull Request is not mergeable

@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Jan 17, 2025
@skunert skunert enabled auto-merge January 20, 2025 07:53
@skunert skunert added this pull request to the merge queue Jan 20, 2025
Merged via the queue into master with commit 06f5d48 Jan 20, 2025
192 of 204 checks passed
@skunert skunert deleted the skunert/can_build_upon_for_included branch January 20, 2025 08:58
Nathy-bajo pushed a commit to Nathy-bajo/polkadot-sdk that referenced this pull request Jan 21, 2025
…d block (paritytech#7205)

Follow-up to paritytech#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 paritytech#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>
Nathy-bajo pushed a commit to Nathy-bajo/polkadot-sdk that referenced this pull request Jan 21, 2025
…d block (paritytech#7205)

Follow-up to paritytech#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 paritytech#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
T0-node This PR/Issue is related to the topic “node”.
Projects
Status: done
Development

Successfully merging this pull request may close these issues.

4 participants