This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Fix state_subscribeRuntimeVersion for parachains#9617
Merged
Conversation
The old implementation was listening for storage changes and every time a block changed the `CODE` storage field, it checked if the runtime version changed. It used the best block to compare against the latest known runtime version. It could happen that you processed the storage notification of block Y and checked the runtime version of block X (the current best block). This is also what happened on parachains. Parachains import blocks and set the new best block in a later step. This means we imported the block that changed the code, got notified and checked the runtime version of the current best block (which would still be the parent of the block that changed the runtime). As the parent did not changed the runtime, the runtime version also did not changed and we never notified the subscribers. The new implementation now switches to listen for best imported blocks. Every time we import a new best block, we check its runtime version against the latest known runtime version. As we also send a notification when the parachains sets a block as new best block, we will trigger this code path correctly. It moves some computation from checking if the key was modified to getting the runtime version. As fetching the runtime version is a rather common pattern, it should not make any big difference performancewise.
dvdplm
approved these changes
Aug 24, 2021
niklasad1
approved these changes
Aug 24, 2021
Wizdave97
pushed a commit
to Wizdave97/substrate
that referenced
this pull request
Aug 25, 2021
The old implementation was listening for storage changes and every time a block changed the `CODE` storage field, it checked if the runtime version changed. It used the best block to compare against the latest known runtime version. It could happen that you processed the storage notification of block Y and checked the runtime version of block X (the current best block). This is also what happened on parachains. Parachains import blocks and set the new best block in a later step. This means we imported the block that changed the code, got notified and checked the runtime version of the current best block (which would still be the parent of the block that changed the runtime). As the parent did not changed the runtime, the runtime version also did not changed and we never notified the subscribers. The new implementation now switches to listen for best imported blocks. Every time we import a new best block, we check its runtime version against the latest known runtime version. As we also send a notification when the parachains sets a block as new best block, we will trigger this code path correctly. It moves some computation from checking if the key was modified to getting the runtime version. As fetching the runtime version is a rather common pattern, it should not make any big difference performancewise.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The old implementation was listening for storage changes and every time
a block changed the
CODEstorage field, it checked if the runtimeversion changed. It used the best block to compare against the latest
known runtime version. It could happen that you processed the storage
notification of block Y and checked the runtime version of block X (the
current best block). This is also what happened on parachains.
Parachains import blocks and set the new best block in a later step.
This means we imported the block that changed the code, got notified and
checked the runtime version of the current best block (which would still
be the parent of the block that changed the runtime). As the parent did
not changed the runtime, the runtime version also did not changed and we
never notified the subscribers.
The new implementation now switches to listen for best imported blocks.
Every time we import a new best block, we check its runtime version
against the latest known runtime version. As we also send a notification
when the parachains sets a block as new best block, we will trigger this
code path correctly. It moves some computation from checking if the key
was modified to getting the runtime version. As fetching the runtime
version is a rather common pattern, it should not make any big
difference performancewise.
Fixes: paritytech/cumulus#574