Use savepoints when retrying to take AccessShareLock. #401
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.
In lock_access_share() function, before acquiring an AccessShareLock on the target table, concurrent DDL commands are terminated unconditionally. However, there is a window between this termination and the actual "LOCK TABLE ... IN ACCESS SHARE MODE" operation, allowing other DDL commands to run on the target table. If the LOCK TABLE failed due to a lock conflict, the transaction was rolled back and retried to execute LOCK TABLE, but the LOCK TABLE command could not be executed again as the transaction had already closed.
This commit fixes the issue by using SAVEPOINT and ROLLBACK TO SAVEPOINT so that we can retry to take a lock in the same top transaction.
Issue #383