Fix lock contention in RefreshHealth #1009
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.
RefreshHealth
often failed on Arequipa as soon asslabs
was updated. It immediately returned adatabase is locked
error. It also happened only while migrating which explains the deadlock since migrations also update theslabs
.To avoid that, this PR changes the slab update to happen in a single query. That way
SQLite
knows that the transaction is a write transaction right away and doesn't start out as a read transaction that is then aborted.Another small change I'm testing, since I'd like to avoid creating the temporary table after updating the slabs, is a new query for updating the objects which doesn't depend on the temporary table. The upside of this query is that it updates any object which is out-of-sync with its slabs rather than just the ones modified. However it will still only look at objects which require an update instead of all of them.
NOTE: deployed on Arequipa right now