fix(replay): merge the program cache entries a transaction modifies - #6
Merged
Merged
Conversation
A deploy or upgrade hands back cache entries whose effective_slot is deployment_slot + 1, so the program is not visible for the rest of the slot it was deployed in. Slate discarded them, so the shared cache kept serving the superseded program and later transactions in the same block succeeded where the chain rejected them. Slot 349296581 upgraded Raydium CLMM at tx 640. The next seven transactions to invoke it failed on chain with "Program is not deployed" while the replay ran them, which diverged the state and halted the run on tx 857. Merging on commit, the way the runtime does, makes them fail the same way. The loader was already producing the right entries, they were being dropped on the floor. Note that invalidate_upgraded_programs is the wrong mechanism for this. It filters on executable(), but an upgrade writes the non-executable programData account, so it likely never fired on a real upgrade at all. Left alone here, worth removing on its own.
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 join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
A deploy or upgrade hands back cache entries whose effective_slot is deployment_slot + 1, so the program is not visible for the rest of the slot it was deployed in. Slate discarded them, so the shared cache kept serving the superseded program and later transactions in the same block succeeded where the chain rejected them.
Slot 349296581 upgraded Raydium CLMM at tx 640. The next seven transactions to invoke it failed on chain with "Program is not deployed" while the replay ran them, which diverged the state and halted the run on tx 857. Merging on commit, the way the runtime does, makes them fail the same way. The loader was already producing the right entries, they were being dropped on the floor.
Note that invalidate_upgraded_programs is the wrong mechanism for this. It filters on executable(), but an upgrade writes the non-executable programData account, so it likely never fired on a real upgrade at all. Left alone here, worth removing on its own.