-
Notifications
You must be signed in to change notification settings - Fork 4
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
analyzer/fast-sync: Reduce DB contention by writing updates into a writeahead log #567
Merged
Conversation
This file contains 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
mitjat
commented
Nov 16, 2023
@@ -92,16 +92,6 @@ var ( | |||
ON CONFLICT (analyzer, height) DO UPDATE SET locked_time = excluded.locked_time | |||
RETURNING height` | |||
|
|||
// IsAnyBlockInRangeProcessedByFastSync = ` |
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.
Unrelated obsolete code
9b54b39
to
1b48f64
Compare
Andrew7234
approved these changes
Nov 21, 2023
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.
Looks good overall, thanks!
Co-authored-by: Andrew Low <[email protected]>
0514168
to
873ced8
Compare
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.
The task
There is a handful of UPDATE queries that are limiting the speed of fast-sync indexing:
last_mutate_round
in evm_tokens, evm_token_balancesFor the first, we see many reports of deadlocks. For the latter, GCP's query insights lists it as a query with outsized "lock wait time", meaning it doesn't quite produce a deadlock, but it's waiting for the row to become available for writing, which slows the whole tx down (and likely increases deadlocks elsewhere).
For all of these, the approach is the same: Create a dedicated fast-sync temp table; then replace operations that are currently UPDATEs with an INSERT into the temp table; then in FinalizeFastSync(), aggregate the temp table into UPDATEs in the primary tables.
This PR
Running the fast-sync analyzer with almost any parallelism (as low as parallelism=5) caused significant DB lock contention and consequently slowdowns.
This PR mostly removes the contention by replacing table UPDATEs with INSERTs into new temporary tables in a new
updates_todo
schema. Then after fast-sync, those temp tables get merged back into the "real" tables.Testing: I locally modified the e2e_regression config to use fast-sync for the majority of the scanned range. Confirmed there were no diffs to the expected output.