Use the updated ledger state in ingest #603
Merged
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.
This PR fixes random DB constraint errors like (and similar):
The reason is a synchronization issue between
App.UpdateLedgerState
andingest.System.runOnce
go routines. Both go routines are executed every second by the application ticker. The following sequence of events is possible:UpdateLedgerState
result =[horizon ledger = 10, core ledger = 11]
ledgers: [11, 11]
UpdateLedgerState
result =[horizon ledger = 10, core ledger = 11]
ledgers: [11, 11]
ledgers: [11, 11]
ledgers: [11, 11]
(because already saved in t=4)So it is possible that
ingest.System.runOnce
reads the stale state of ledgers. The simple fix in this PR moves loading the state toingest.System.runOnce
. The long-term fix, in my opinion, should remove synchronization requirement iningest
package (use internal state only, use infinitefor
instead of ticker etc.).Close #513.
PS. I've been searching for this for so long! It feels good! 🤓