-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Fix parachain upgrade scheduling when done by the owner/root #3341
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
Conversation
When using `schedule_code_upgrade` to change the code of a parachain in the relay chain runtime, we had already fixed to not set the `GoAhead` signal. This was done to not brick any parachain after the upgrade, because they were seeing the signal without having any upgrade prepared. The remaining problem is that the parachain code is only upgraded after a parachain header was enacted, aka the parachain made some progress. However, this is quite complicated if the parachain is bricked (which is the most common scenario why to manually schedule a code upgrade). Thus, this pull request replaces `SetGoAhead` with `EnactUpgradeDirectly` to signal to the logic that we don't want to set the go ahead signal and that we want to replace the current parachain code directly without waiting for some progress of the parachain.
| // be validated against the new validation code. | ||
| // | ||
| // Here we are trying to choose the block number that will have | ||
| // `validation_upgrade_delay` blocks from the relay-parent of inclusion of the the block |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: Why is this not a match? Would be a tad more future proof in case someone introduces more variants.
| weight += T::DbWeight::get().reads_writes(1, 4); | ||
| FutureCodeUpgrades::<T>::insert(&id, expected_at); | ||
| match upgrade_strategy { | ||
| UpgradeStrategy::SetGoAheadSignal => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This match arm here seems to be doing what needs to be done for UpgradeStrategy::ApplyAtExpectedBlock.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LOL. I'm an idiot. Broken it with one of the last commits.
When using `schedule_code_upgrade` to change the code of a parachain in the relay chain runtime, we had already fixed to not set the `GoAhead` signal. This was done to not brick any parachain after the upgrade, because they were seeing the signal without having any upgrade prepared. The remaining problem is that the parachain code is only upgraded after a parachain header was enacted, aka the parachain made some progress. However, this is quite complicated if the parachain is bricked (which is the most common scenario why to manually schedule a code upgrade). Thus, this pull request replaces `SetGoAhead` with `UpgradeStrategy` to signal to the logic kind of strategy want to use. The strategies are either `SetGoAheadSignal` or `ApplyAtExpectedBlock`. `SetGoAheadSignal` sets the go ahead signal as before and awaits a parachain block. `ApplyAtExpectedBlock` schedules the upgrade and applies it directly at the `expected_block` without waiting for the parachain to make any kind of progress.
…ech#3341) When using `schedule_code_upgrade` to change the code of a parachain in the relay chain runtime, we had already fixed to not set the `GoAhead` signal. This was done to not brick any parachain after the upgrade, because they were seeing the signal without having any upgrade prepared. The remaining problem is that the parachain code is only upgraded after a parachain header was enacted, aka the parachain made some progress. However, this is quite complicated if the parachain is bricked (which is the most common scenario why to manually schedule a code upgrade). Thus, this pull request replaces `SetGoAhead` with `UpgradeStrategy` to signal to the logic kind of strategy want to use. The strategies are either `SetGoAheadSignal` or `ApplyAtExpectedBlock`. `SetGoAheadSignal` sets the go ahead signal as before and awaits a parachain block. `ApplyAtExpectedBlock` schedules the upgrade and applies it directly at the `expected_block` without waiting for the parachain to make any kind of progress.
When using
schedule_code_upgradeto change the code of a parachain in the relay chain runtime, we had already fixed to not set theGoAheadsignal. This was done to not brick any parachain after the upgrade, because they were seeing the signal without having any upgrade prepared. The remaining problem is that the parachain code is only upgraded after a parachain header was enacted, aka the parachain made some progress. However, this is quite complicated if the parachain is bricked (which is the most common scenario why to manually schedule a code upgrade). Thus, this pull request replacesSetGoAheadwithUpgradeStrategyto signal to the logic kind of strategy want to use. The strategies are eitherSetGoAheadSignalorApplyAtExpectedBlock.SetGoAheadSignalsets the go ahead signal as before and awaits a parachain block.ApplyAtExpectedBlockschedules the upgrade and applies it directly at theexpected_blockwithout waiting for the parachain to make any kind of progress.