fix/core: use CAS to protect against concurrent TX state changes #4285
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.
Background
Concurrent use a of a connection across multiple threads is not supported, but we should not crash even if a client attempts to do so.
Problem
We do crash when this happens. See: #3911
Fix
The proper behavior is to return Busy if the same connection is already doing transactional work on another thread.
To ensure the above, this PR implements Connection::atomic_swap_tx_state() which uses CAS instead of simply setting the state.
Testing
This PR also adds a regression test modeled after the reproduction in #3911 that only accepts
"database is locked"errors and panics on anything else.Been running this in a loop for a while now.
Description of AI Usage
Prompt: