Use persistent data structures in fork choice #2059
Closed
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.
Issue Addressed
Closes #2028
Proposed Changes
This PR fixes issues with fork choice becoming out of sync with the database after failed writes (the root cause of #2028). It does this using quite a drastic approach: rather than mutating fork choice directly, we take a clone of it, mutate the clone, and then atomically update the original once the database write has succeeded. In order to make the clone cheap(er), we use persistent data structures from the
im
crate.In order to make this work, I've added SSZ implementations for
Arc
andVector
.Additional Info
I'm still assessing the performance and memory impact of this change. We should definitely test it for a substantial period of time on our Pyrmont nodes to ensure the performance penalty is tolerable.